什么是搜索建议
现代搜索引擎中都会提供搜索建议的功能,帮助用户在输入搜索的过程中,进行自动补全或纠错。协助用户输入更加精确的词,提高后续搜索文档的匹配程度。
在elastic中通过suggester api来实现
将输入的文本分解成token,然后在索引的词典里查找相似的term并返回。
根据不同场景,elastic设计了4中不同的suggesters
1.Term & Phrase Suggester
2.Complete & Context Suggester
一、term suggester
suggester是一种特殊类型的搜索,text里是搜索的文本,用户搜索lucen是一个错误的拼写,不存在的,到字段body上搜索,当无法搜索到结果时(missing),返回建议的词。
![0e9ad71aa6cc5a6327c8e9012c4544b4.png](https://i-blog.csdnimg.cn/blog_migrate/17394fff74c85a94cb1ac651559ce4fc.jpeg)
几种suggest model
1.missing 如果搜索索引中存在,就不提供建议
2.popular 推荐出现频率更高的词
3.always 无论是否存在都提供建议
演示案例:
![f6bd1b6df4e67b2e112116aafe692a2e.png](https://i-blog.csdnimg.cn/blog_migrate/ce03a0d7e401b18c8193d9677f79c30a.jpeg)
插入一些数据用于测试
使用missing
![73acb9e0985c7d7484628ae8c4fbfd2e.png](https://i-blog.csdnimg.cn/blog_migrate/82399f9a84cb820f038dc7c28a01ffec.jpeg)
lucen 这个词拼写错误,索引里没有,就给出了推荐lucene,然而rock没有给出推荐,是因为索引里面有值。
![eee42dd55cf059c50cf92fb752af2568.png](https://i-blog.csdnimg.cn/blog_migrate/52615fe54a73a9dd149fd905557b90b0.jpeg)
使用popular
![53e4981c1957c27dae6ecd963acc8f02.png](https://i-blog.csdnimg.cn/blog_migrate/ee9d9d6e3600719a1f83dacd01cacc18.jpeg)
推荐了lucen 和 rocks两个词,rocks在索引里出现的频率更高,所以推荐了rocks这个词。
![100eafa8afc622ed0c43b890d942a2b9.png](https://i-blog.csdnimg.cn/blog_migrate/abb5952cbadbd57d904e3fc8c3e276ed.jpeg)
使用always
![bfbeb6ec7a957849ac7e057ea726467c.png](https://i-blog.csdnimg.cn/blog_migrate/02cf12a7e599b709af7a2423f7bf4c83.jpeg)
![9e83aa06b37d9d25e6c40a7f555b6a9e.png](https://i-blog.csdnimg.cn/blog_migrate/1d4c1e8ed4ec81859149520028389386.jpeg)
我们可以通过配置一系列的选项,来均衡灵活和性能:
- max_edits:最大编辑距离候选建议可以具有以便被视为建议。只能是介于1和2之间的值。任何其他值都会导致抛出错误的请求错误。默认为2。
- prefix_length:必须匹配的最小前缀字符的数量才是候选建议。默认为1.增加此数字可提高拼写检查性能。
- min_doc_freq:建议应出现的文档数量的最小阈值。可以指定为绝对数字或文档数量的相对百分比。这可以仅通过建议高频项来提高质量。默认为0f且未启用。如果指定的值大于1,则该数字不能是小数。分片级文档频率用于此选项。
- max_term_freq:建议文本令牌可以存在的文档数量的最大阈值,以便包括在内。可以是表示文档频率的相对百分比数(例如0.4)或绝对数。如果指定的值大于1,则不能指定小数。默认为0.01f。这可用于排除高频术语的拼写检查。高频术语通常拼写正确,这也提高了拼写检查的性能。分片级文档频率用于此选项。
小结,term suggester首先将输入文本经过分析器(所以,分析结果由于采用的分析器不同而有所不同)分析,处理为单个词条,然后根据单个词条去提供建议,并不会考虑多个词条之间的关系。然后将每个词条的建议结果(有或没有)封装到options列表中。最后由建议器统一返回。
二、Phrase Suggester
在text suggester基础上增加了一些逻辑和一些参数。
![f52eba1433ebe0e61eb91967f42d6c21.png](https://i-blog.csdnimg.cn/blog_migrate/1bf88b82127acd02ac7d6ccd2f9d8be4.jpeg)
![eadcb434c80c14a8ea7baebcc006b298.png](https://i-blog.csdnimg.cn/blog_migrate/dd96e5bd48b83e4984e74b6064950637.jpeg)
![88deba95ecc9417d6701b79ca35218ef.png](https://i-blog.csdnimg.cn/blog_migrate/5be7701df21192a6fe037a46242ad898.jpeg)
三、Complete Suggester (自动补全)
![96287b838413ec3459455e15fae2ca58.png](https://i-blog.csdnimg.cn/blog_migrate/9478de64ec274219b9ad5e6a997b6de0.jpeg)
![a5f7421aaf37c1ca910e565bdf08ffa9.png](https://i-blog.csdnimg.cn/blog_migrate/294e9de1b1d1b2d277e68da3bf4c0c72.jpeg)
![b28258addb7262a95138dce61752b5a7.png](https://i-blog.csdnimg.cn/blog_migrate/8ff3b1ac373db7a040819a959a89488e.jpeg)
搜索elk,然后下面给自动补全推荐结果。
![2e1ef247108e939c0f95effde1f34491.png](https://i-blog.csdnimg.cn/blog_migrate/5203c5fbeef5f4e5d7b1a09af6ce4789.jpeg)
![775b94edc61181d6c999946eaf7bc00a.png](https://i-blog.csdnimg.cn/blog_migrate/20fb55c6684407b08ca4ecb618ca2d6d.jpeg)
四、Context Suggester (基于上下文的提示)
![c17779ed5bb8fbae5ce25e64eac2a7f2.png](https://i-blog.csdnimg.cn/blog_migrate/5e4d8f90936166da168df116c37bc9f9.jpeg)
![2828a82043a23f4ebbfcedf3bffc6f7b.png](https://i-blog.csdnimg.cn/blog_migrate/bfe7ba9965d78915437b1363ac08d1b8.jpeg)
![86842eab60ffcce53ede865937eddef4.png](https://i-blog.csdnimg.cn/blog_migrate/f82557547dc2962e2713951fabdabc23.jpeg)
![512c839216b34172de9f747ea4a5dcee.png](https://i-blog.csdnimg.cn/blog_migrate/2dd6c09f70abdf8427c7824e0e93b52e.jpeg)
四中类型使用总结
![cacc4f5afbee5093d7a7fb84e215a978.png](https://i-blog.csdnimg.cn/blog_migrate/f2dc35277f3f16f84df9b50d437ac84f.jpeg)