Elasticsearch Auto使用ngram

时间:2017-09-24 15:53:18

标签: elasticsearch n-gram elasticsearch-aggregation elasticsearch-analyzers

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

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

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

nGram analyzer config:

"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分析数组中搜索?或者我应该将所有这些关键字编入不同的类型?

谢谢!

1 个答案:

答案 0 :(得分:0)

您最好在单独的文档中为数组的每个项目建立索引,以便仅查找匹配的文档。

代替使用:

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

使用单独的文档并分别为其编制索引:

doc1:

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

doc2:

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

以此类推...

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