【问题标题】:Speed up Elasticsearch more like this query加速 Elasticsearch 更像是这个查询
【发布时间】:2020-10-17 05:16:51
【问题描述】:

这更像是这个查询有什么问题?它是从头开始写的。它返回相关结果,但速度太慢(此示例耗时 187.9 毫秒

{
  "query": {
    "bool": {
      "must": [{
        "more_like_this": {
          "fields": ["similarity.analyzed"],
          "like": [{
            "_id": 4
          }, {
            "_id": 550
          }, {
            "_id": 757
          }],
          "min_term_freq": 1,
          "min_doc_freq": 1,
          "analyzer": "searchkick_search2",
          "minimum_should_match": "10%"
        }
      }, {
        "range": {
          "count_posts": {
            "gt": 0
          }
        }
      }],
      "must_not": [{
        "terms": {
          "_id": [4, 550, 757]
        }
      }]
    }
  },
  "size": 10
}

此查询查找与给定标签集相似的标签。

相似性 - 包含所有帖子标题的文本字段,以空格连接。 count_posts - 数字字段,如果每个标签包含帖子数。

在 Ubuntu 18.04 上作为单节点运行 Elasticseach 7.8.0。带有 Searchkick gem 的 Rails 5 应用程序。

【问题讨论】:

  • 你有多少文件?
  • @Gibbs 大约 12K 个文档

标签: performance elasticsearch elastic-stack elasticsearch-query


【解决方案1】:

这更像是这个查询有什么问题?

"like": [{
            "_id": 4
          }, {
            "_id": 550
          }, {
            "_id": 757
          }]

它的作用类似于multi get API。它执行以下操作。

  1. 获取_idlike中提到的所有文档
  2. 使用 analyser 选项 ptovided 分析 field
  3. 从第 1 步的匹配文档中分析相同的字段。分词器列表,过滤器也添加了一些ms
  4. 计算文档、术语频率以及最小匹配。

你还有两个条件。文档说

一个更复杂的用例包括将文本与索引中已经存在的文档混合。

很遗憾,我认为这无法进一步优化。但是您可以在 like 中添加一个文本而不是 id 以使其更好。希望查询不会因为缓存而总是花费超过 100 毫秒。

【讨论】:

  • @Molfar 你有机会看看这个吗?
  • 是的,但问题仍然存在。用文本替换类似文档也需要复杂的计算。我按照官方文档进行了此查询。但它几乎总是需要超过 100 毫秒。
猜你喜欢
  • 2015-04-03
  • 2017-02-01
  • 2013-06-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-20
  • 1970-01-01
  • 2014-10-16
相关资源
最近更新 更多