0

我是 Elasticsearch 的新手,我有一个关于使用 NGram 实现自动完成功能的问题。从互联网上,我了解到与使用内置完成建议器相比,NGram 实现允许灵活的解决方案,例如从中间匹配、突出显示等。

因此,我的一种索引类型具有以下字段映射:

"suggest_keywords": {
    "type": "string",
    "analyzer": "nGram_analyzer",
    "search_analyzer": "whitespace_analyzer"
},

nGram 分析器配置:

"nGram_analyzer": {
    "filter": [
        "lowercase",
        "asciifolding",
        "nGram_filter"
        ],
    "type": "custom",
    "tokenizer": "whitespace"
}

以下是我将用于字段的示例数据。

"suggest_keywords": [
        "Wholesale",
        "Fish",
        "Seafood",
        "Fishmongers",
        "Markets"
],

当我使用以下查询时,它将返回整个数组。因为我只需要少数

{
    "query": {
        "match":{
            "suggest_keywords" : "food"
        }
   }
}

我尝试使用突出显示来提取单个术语,但突出显示的术语存在于搜索结果中的每个文档中。我尝试使用聚合,但未能编写将突出显示和聚合结合起来的查询。有可能这样做吗?

{
   "query": {
      "match": {
         "suggest_keywords": "nge"
      }
   },
   "highlight": {
      "fields": {
         "suggest_keywords": {}
      }
   }
}

或者是否有更好的实现从 nGram 分析数组中搜索?还是应该将所有这些关键字索引为不同的类型?

谢谢!

4

1 回答 1

0

您最好在单独的文档中索引数组的每个项目,这样您就可以只找到匹配的文档。

而不是使用:

POST /doctype
{
    "suggest_keywords": [
        "Wholesale",
        "Fish",
        "Seafood",
        "Fishmongers",
        "Markets"
    ]
}

使用单独的文档并分别索引它们:

文档1:

POST /doctype
{
   "suggest_keywords": "Wholesale"
}

文档2:

POST /doctype
{
   "suggest_keywords": "Fish"
}

等等...

然后在搜索结果中,您将在单独的文档中获得匹配结果

于 2018-09-01T10:45:52.293 回答