搜索补全功能使用的是es的completion suggester实现 官方文档地址:https://www.elastic.co/guide/en/elasticsearch/reference/current/search-suggesters-completion.html
先设置mapping:
POST /index/completion/_mapping
{
"properties":{
"title": {
"type": "text",
"analyzer": "ik_sync_smart"
},
"title_suggest": {
"type": "completion",
"analyzer": "ik_sync_smart",
"search_analyzer": "ik_sync_smart"
}
}
}
重点是title_suggest,这个字段就是之后我们搜索补全的字段,需要设置type为completion,analyzer按情况设置分析器
索引数据:
POST /index/completion/_bulk
{ "index" : { } }
{ "title": "背景天安门广场大学", "title_suggest": "背景天安门广场大学"}
{ "index" : { } }
{ "title": "北京天安门","title_suggest": "北京天安门"}
{ "index" : { } }
{ "title": "北京鸟巢","title_suggest": "北京鸟巢"}
{ "index" : { } }
{ "title": "奥林匹克公园","title_suggest": "奥林匹克公园"}
{ "index" : { } }
{ "title": "奥林匹克森林公园","title_suggest": "奥林匹克森林公园"}
{ "index" : { } }
{ "title": "北京奥林匹克公园","title_suggest": "北京奥林匹克公园"}
{ "index" : { } }
{ "title": "北京奥林匹克公园","title_suggest": {"input": "我爱中国","weight": 100}}
索引的时候可以对suggest字段,增加weight增加排序权重
搜索补全:
POST /index/completion/_search
{ "size": 0,
"suggest": {
"blog-suggest": {
"prefix": "北京",
"completion": {
"field": "title_suggest"
}
}
}
}
返回:
{
"took": 27,
"timed_out": false,
"_shards": {
"total": 3,
"successful": 3,
"skipped": 0,
"failed": 0
},
"hits": {
"total": 0,
"max_score": 0,
"hits": []
},
"suggest": {
"blog-suggest": [
{
"text": "北京",
"offset": 0,
"length": 2,
"options": [
{
"text": "北京天安门",
"_index": "jzbsearch",
"_type": "completion",
"_id": "AWK9FJDeGCbNhyb_l9I6",
"_score": 1,
"_source": {
"title": "北京天安门",
"title_suggest": "北京天安门"
}
},
{
"text": "北京奥林匹克公园",
"_index": "jzbsearch",
"_type": "completion",
"_id": "AWK9FJDeGCbNhyb_l9I-",
"_score": 1,
"_source": {
"title": "北京奥林匹克公园",
"title_suggest": "北京奥林匹克公园"
}
},
{
"text": "北京鸟巢",
"_index": "jzbsearch",
"_type": "completion",
"_id": "AWK9FJDeGCbNhyb_l9I7",
"_score": 1,
"_source": {
"title": "北京鸟巢",
"title_suggest": "北京鸟巢"
}
}
]
}
]
}
}
参考链接: https://elasticsearch.cn/article/142 https://www.elastic.co/guide/en/elasticsearch/reference/current/search-suggesters-completion.html