Term Suggester
,基于编辑距离,对analyze过的单个term去提供建议,并不会考虑多个term/词组之间的关系。quert -> query
Phrase Suggester
,在Term Suggester的基础上,通过ngram以词组为单位返回建议。noble prize -> nobel prize
Completion Suggester
,FST数据结构,类似Trie树,不用打开倒排,快速返回,前缀匹配Context Suggester
,在Completion Suggester的基础上,用于filter和boost
下面说说在es中的种实现搜索提示的功能,基于completion suggest
进行实现,其在实际应用中搜索性能更加高效。
假如文档库里有一堆关于大话西游的,比如,“大话西游电影”,“大话西游小说”,"大话西游舞台剧"等,这里我们需要搜索以"大话西游"开头的文档。
1、自定义index,及字段分词属性,这里用IK中文分词器:
PUT /news_website
{
"mappings": {
"news" : {
"properties" : {
"title" : {
"type": "text",
"analyzer": "ik_max_word",
"fields": {
"suggest" : {
"type" : "completion",
"analyzer": "ik_max_word"
}
}
},
"content": {
"type": "text",
"analyzer": "ik_max_word"
}
}
}
}
}
2、completion,es实现的时候,是非常高性能的,会构建不是倒排索引,也不是正拍索引,就是纯的用于进行前缀搜索的一种特殊的数据结构,而且会全部放在内存中,所以auto completion进行的前缀搜索提示,性能是非常高的,向索引插入几条数据:
PUT /news_website/news/1
{
"title": "大话西游电影",
"content": "大话西游的电影时隔20年即将在2017年4月重映"
}
PUT /news_website/news/2
{
"title": "大话西游小说",
"content": "某知名网络小说作家已经完成了大话西游同名小说的出版"
}
PUT /news_website/news/3
{
"title": "大话西游手游",
"content": "网易游戏近日出品了大话西游经典IP的手游,正在火爆内测中"
}
PUT /news_website/news/4
{
"title": "我想看大话西游手游",
"content": "星爷的大话西游2怎么还没有出来,等不及了"
}
3、查询:
GET /news_website/news/_search
{
"suggest": {
"my-suggest" : {
"prefix" : "大话西游",
"completion" : {
"field" : "title.suggest"
}
}
}
}
这里查出来了3条数据,即以"大话西游"为前缀的文档,而原本的第4条数据没有查出来: