首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >搜索引擎正确有效的弹性搜索结构

搜索引擎正确有效的弹性搜索结构
EN

Stack Overflow用户
提问于 2021-07-11 16:22:38
回答 1查看 86关注 0票数 1

我在为我的音像店建一个搜索引擎。

我只对音频文档使用了一个索引,如下所示:

代码语言:javascript
运行
复制
{
  id: { type: 'integer' },
  title: { type: 'search_as_you_type' },
  description: { type: 'text' },
  createdAt: { type: 'date' },
  updatedAt: { type: 'date' },
  datePublished: { type: 'date' },
  duration: { type: 'float' },
  categories: {
    type: 'nested',
    properties: {
      id: { type: 'integer' },
      name: { type: 'text' }
    },
  }
}

通过文本搜索音频文档和发布日期的订单是很简单的。但是,我想通过基于特定范围内的音频听音时间和购买历史来进行文本搜索和排序,例如:过去3个月或过去30天的文本搜索趋势音频,因此我调整了结构如下:

代码语言:javascript
运行
复制
{
  ...previousProperties,
  listenTimes: {
    type: 'nested',
    properties: {
      timestamp: { type: 'date' },
      progress: { type: 'float' }, // value 0-1.
    },
  },
  purchaseHistories: {
    type: 'nested',
    properties: {
      timestamp: { type: 'date' }
    },
  },
}

这是我在过去3个月里获取最新音频的查询,它成功了:

代码语言:javascript
运行
复制
{
  bool: {
    should: [
      {
        nested: {
          path: 'listenTimes',
          query: {
            function_score: {
              query: {
                range: {
                  'listenTimes.timestamp': {
                    gte: $range,
                  },
                },
              },
              functions: [
                {
                  field_value_factor: {
                    field: 'listenTimes.progress',
                    missing: 0,
                  },
                },
              ],
              boost_mode: 'replace',
            },
          },
          score_mode: 'sum',
        },
      },
      {
        nested: {
          path: 'purchaseHistories',
          query: {
            function_score: {
              query: {
                range: {
                  'purchaseHistories.timestamp': {
                    gte: 'now+1d-3M/d',
                  },
                },
              },
              boost: 1.5,
            },
          },
          score_mode: 'sum',
        },
      },
    ],
  },
}

我的方法有些不确定,例如:

  • 每个音频的听录音次数和购买历史记录都是相当大的,如果我这样组织数据有效吗?我只对样本数据进行测试,它似乎运行良好。
  • 当我每次将新的录音时间和购买历史的记录推到音频文档中时,Elasticsearch会重新索引整个文档吗?

我对Elasticsearch非常陌生,所以有谁能给我一些关于这个案子的建议,非常感谢!

EN

回答 1

Stack Overflow用户

发布于 2021-07-11 16:45:54

第一个问题是好的,它取决于您将如何实现它,您将不得不注意原子操作,因为,我猜,您正在计划获取侦听次数,然后保存递增的值。如果您在一个线程中从一个应用程序中执行此操作,并且它正在设法及时处理它,那么您很好,但是您无法进行扩展。我要说的是,elasticsearch并不真正适用于这类交易。第一个出现在我大脑中的想法是将数字保存到SQL数据库中,并按计划更新elasticsearch。我想这些结果不需要实时更新吧?

关于第二个问题,我将发布来自elasticsearch文档The document must still be reindexed, but using update removes some network roundtrips and reduces chances of version conflicts between the GET and the index operation.的引文,您可以在这个链接上找到更多信息。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68338030

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档