Elasticsearch提供了一个叫做“补全器”(Completion Suggester)的功能,可以实现自动补全。不同于传统的文本索引,补全器支持前缀搜索、中文拼音搜索、拼音首字母搜索等多种方式,可以更加智能地对用户查询进行响应。
在Elasticsearch中实现自动补全,主要需要完成以下步骤:
PUT /my_index
{
"mappings": {
"properties": {
"title_suggest": {
"type": "completion"
}
}
}
}
PUT /my_index/_doc/1
{
"title": "Elasticsearch是一款全文搜索引擎",
"title_suggest": {
"input": [ "Elasticsearch", "全文搜索" ],
"weight": 10
}
}
以上示例中,我们将"title_suggest"字段定义为了Completion类型,并设置了两个输入项,也就是用户可能输入的两个关键词(Elasticsearch、全文搜索),同时赋予了这个输入项一个权重为10,表示这个搜索项的优先级更高。
POST /my_index/_search
{
"suggest": {
"title-suggest" : {
"prefix" : "elas",
"completion" : {
"field" : "title_suggest"
}
}
}
}
以上示例中,我们向Elasticsearch发送了一个Suggest查询,其中指定了要查询的索引是"my_index",同时以"elas"作为前缀进行自动补全。Elasticsearch会根据输入的前缀,在"title_suggest"字段中检索含有这个前缀的联想词,并将结果按照权重进行排序,最后返回给我们。
需要注意的一点是,在返回的联想词列表中,我们可以使用highlight关键字为用户输入的前缀加上高亮颜色,让用户更加直观地看到他们的输入与匹配结果的对应关系。例如:
POST /my_index/_search
{
"suggest": {
"title-suggest" : {
"prefix" : "elas",
"completion" : {
"field" : "title_suggest"
},
"highlight": {
"pre_tag": "<em>",
"post_tag": "</em>"
}
}
}
}
以上示例中,我们增加了一个"highlight"选项,用于在联想词列表中为匹配到的前缀加上""和""标记,从而让用户更加直观地看到匹配结果。