首页 > 解决方案 > Elasticsearch 自动完成建议器

问题描述

我想在 ES 中实现自动完成功能我已经按照ES 文档中的教程进行操作

我的索引是:

{
    "properties" : {
            "suggest" : {
                "type" : "completion"
            },
            "titleKeyword" : {
                "type": "keyword"
            }
        }
    }
}

我将文本值放在titleKeyword 字段中

然后我查询如下

{
  "suggest" : {
    "my-suggestion" : {
      "text" : "iphone",
      "term" : {
        "field" : "titleKeyword"
      }
    }
  }
}

结果是:

...
    "suggest": {
        "my-suggestion": [
            {
                "text": "iphone",
                "offset": 0,
                "length": 6,
                "options": []
            }
        ]
    }

预期的结果是

options:[iphone x, iphone 11, iphone 11 pro, iphone 7]

注意:标题是完整的句子,例如“iPhone x 64gb black”

据我从文档中了解到,我必须在创建文档时“提前”给出建议,这在我的情况下是不可能的,有没有办法在不手动提出建议的情况下实现此功能?

谢谢

标签: elasticsearchelastic-stackelasticsearch-5

解决方案


对于这个简单的要求,无需使用难以理解的 Elasticsearch 建议器,其中的某些部分仍在开发中,有关构建高级自动完成时要注意的事项的更多信息在我的这个 SO 答案中。

满足您的要求,可以使用text字段(看起来您正在使用keyword类型)和简单的匹配查询轻松解决,如下所示:

索引定义

{
    "mappings": {
        "properties": {
            "model_name": {
                "type": "text"
            }
        }
    }
}

索引所有 4 种类型iphone

{
   "model_name" : "iphone x"
}

{
   "model_name" : "iphone 11"
}

{
   "model_name" : "iphone 11 pro"
}

{
   "model_name" : "iphone 7"
}

搜索查询(iphone将带来所有四个文档)

{
    "query": {
        "match": {
            "model_name": {
                "query": "iphone"
            }
        }
    }
}

搜索结果

{
            "_index": "so_auto",
            "_type": "_doc",
            "_id": "1",
            "_score": 0.110377684,
            "_source": {
               "model_name": "iphone x"
            }
         },
         {
            "_index": "so_auto",
            "_type": "_doc",
            "_id": "2",
            "_score": 0.110377684,
            "_source": {
               "model_name": "iphone 11"
            }
         },
         {
            "_index": "so_auto",
            "_type": "_doc",
            "_id": "4",
            "_score": 0.110377684,
            "_source": {
               "model_name": "iphone 7"
            }
         },
         {
            "_index": "so_auto",
            "_type": "_doc",
            "_id": "3",
            "_score": 0.09271726,
            "_source": {
               "model_name": "iphone 11 pro"
            }
         }
      ]

推荐阅读