掌握词项、短语查询建议器的用法
掌握自动补全建议器的用法
html
查询建议是什么?java
ES中查询建议的API后端
查询建议也是使用_search端点地址。在DSL中suggest节点来定义须要的建议查询。数据结构
POST twitter/_search { "query" : { "match": { "message": "tring out Elasticsearch" } }, //定义建议查询 "suggest" : { "my-suggestion" : { //一个建议查询名 "text" : "tring out Elasticsearch", //查询文本 "term" : { //使用词项建议器 "field" : "message" //指定在哪一个字段上获取建议词 } } } }
POST _search { "suggest": { "my-suggest-1" : { "text" : "tring out Elasticsearch", "term" : { "field" : "message" } }, "my-suggest-2" : { "text" : "kmichy", "term" : { "field" : "user" } } } }
多个建议查询能够使用全局的查询文本app
POST _search { "suggest": { "text" : "tring out Elasticsearch", "my-suggest-1" : { "term" : { "field" : "message" } }, "my-suggest-2" : { "term" : { "field" : "user" } } } }
Term suggesterelasticsearch
term 词项建议器,对给入的文本进行分词,为每一个词进行模糊查询提供词项建议。对于在索引中存在词默认不提供建议词,不存在的词则根据模糊查询结果进行排序后取必定数量的建议词。ide
经常使用的建议选项:学习
phrase suggesterui
phrase 短语建议,在term的基础上,会考量多个term之间的关系,好比是否同时出如今索引的原文里,相邻程度,以及词频等编码
POST /ftq/_search { "query": { "match_all": {} }, "suggest" : { "myss":{ "text": "java sprin boot", "phrase": { "field": "title" } } } }
Completion suggester 自动补全
针对自动补全场景而设计的建议器。此场景下用户每输入一个字符的时候,就须要即时发送一次查询请求到后端查找匹配项,在用户输入速度较高的状况下对后端响应速度要求比较苛刻。所以实现上它和前面两个Suggester采用了不一样的数据结构,索引并不是经过倒排来完成,而是将analyze过的数据编码成FST和索引一块儿存放。对于一个open状态的索引,FST会被ES整个装载到内存里的,进行前缀查找速度极快。可是FST只能用于前缀查找,这也是Completion Suggester的局限所在。
https://www.elastic.co/guide/en/elasticsearch/reference/current/search-suggesters-completion.html
为了使用自动补全,索引中用来提供补全建议的字段需特殊设计,字段类型为 completion。
PUT music { "mappings": { "_doc" : { "properties" : { "suggest" : { //用于自动补全的字段 "type" : "completion" }, "title" : { "type": "keyword" } } } } }
PUT music/_doc/1?refresh { "suggest" : { "input": [ "Nevermind", "Nirvana" ], "weight" : 34 } } Input 指定输入词 Weight 指定排序值(可选)
PUT music/_doc/1?refresh { "suggest" : [ { "input": "Nevermind", "weight" : 10 }, { "input": "Nirvana", "weight" : 3 } ]}
PUT music/_doc/1?refresh { "suggest" : [ "Nevermind", "Nirvana" ] }
PUT music/_doc/2?refresh { "suggest" : { //放入一条重复数据 "input": [ "Nevermind", "Nirvana" ], "weight" : 20 } }
POST music/_search?pretty { "suggest": { "song-suggest" : { "prefix" : "nir", "completion" : { "field" : "suggest" } } } }
POST music/_search?pretty { "suggest": { "song-suggest" : { "prefix" : "nir", "completion" : { "field" : "suggest", "skip_duplicates": true //去重 } } }}
PUT music/_doc/3?refresh { "suggest" : { "input": [ "lucene solr", "lucene so cool","lucene elasticsearch" ], "weight" : 20 } } //存的是短语 PUT music/_doc/4?refresh { "suggest" : { "input": ["lucene solr cool","lucene elasticsearch" ], "weight" : 10 } }
POST music/_search?pretty { "suggest": { "song-suggest" : { "prefix" : "lucene s", "completion" : { "field" : "suggest" , "skip_duplicates": true } } } }