当我使用 completion suggester 时,如何获得没有重复的独特建议?

How can i get unique suggestions without duplicates when i use completion suggester?

我在我的环境中使用 elastic 5.1.1。我在字段名称 post_hashtags 上选择了完成建议器,其中包含一个字符串数组以提供建议。我收到如下前缀 "inv"

的回复

要求:

POST hashtag/_search?pretty&&filter_path=suggest.hash-suggest.options.text,suggest.hash-suggest.options._source
{"_source":["post_hashtags" ],

"suggest": {
    "hash-suggest" : {
        "prefix" : "inv",
        "completion" : {
            "field" : "post_hashtags"
        }
    }
}

回复:

{
  "suggest": {
    "hash-suggest": [
      {
        "options": [
          {
            "text": "invalid",
            "_source": {
              "post_hashtags": [
                "invalid"
              ]
            }
          },
          {
            "text": "invalid",
            "_source": {
              "post_hashtags": [
                "invalid",
                "coment_me",
                "daya"
              ]
            }
          }
        ]
      }
    ]
  }

此处"invalid"返回了两次,因为它也是其他文档中相同字段"post_hashtags"的输入字符串。

问题是,如果相同的 "invalid" 输入字符串出现在同一索引的 1000 个文档中,那么我会得到 1000 个重复的建议,这些建议很大而且不需要。

我可以在完成类型的字段上应用聚合吗?

有什么方法可以让我获得独特的建议而不是重复的文本字段,即使我在具有相同索引的多个文档中为特定字段指定了相同的输入字符串?

编辑:此答案仅适用于 Elasticsearch 5

不,您不能删除重复的建议结果。自动完成建议器在 Elasticsearch 5 中是面向文档的,因此将为所有匹配的文档提供 return 建议。

在 Elasticsearch 1 和 2 中,自动完成建议器会自动删除重复的建议。在未来的版本中有 bring back this functionality, and it looks like it is possible to do so 的开放 Github 票。

目前,您有两个选择:

  1. 使用 Elasticsearch 版本 1 或 2。
  2. 使用不基于自动完成建议器的不同建议实现。到目前为止,我看到的唯一半官方建议是将您的建议字符串放入 separate index.

ElasticSearch 6.1 引入了 skip_duplicates 运算符。用法示例:

{
  "suggest": {
    "autocomplete": {
      "prefix": "MySearchTerm",
      "completion": {
        "field": "name",
        "skip_duplicates": true
      }
    }
  }
}