elasticsearch的autocomplete

对于搜索引擎来说,在键入搜索关键词的过程中进行自动提词是个重要的功能,es对此也提供了支持。

这个功能是不是有点类似于prefixquery呢,看上去是的。但是,prefixquery是否会符合条件的doc,而自动提词是返回符合条件的term。所以二者不能混为一谈。因此suggestion模块出现了。我们聚焦下complete。

1:为什么需要一个的单独的suggest?

速度为先:为了提词,一个完整的查询需要检索太多个term,这并不足够快。而自动提词必须是超级快的,不能等待,因此es用了一个叫FST的内存数据结构,来存储term,以此来达到足够快的检索速度。

实时性:es是以实时性著称的。如果在内存中构建FST,则比如要把所有数据都加载进来,这个代价是蛮大的。而且一旦数据发生改变,还需要重建fst,这显然是不合理的。为了达到实时性,es把FST的构建过程从查询阶段放到了没一个segment产生的索引阶段,一个新的segment产生将伴随这个一个fst文件。而这个fst文件载入内存是非常快的。这里会有多个fst文件,因此最终的提词结果是对多个fst文件的汇总。

可读性:用户的输入可能是多种多这样的,比如一个提示词是“Courtyard by Marriot, Munich City”,当用户输入"countyard munich"或者"munich hotel"的时候,都希望能够给出前边的提示词对应的具体信息。我们给出的提示应该是尽量明确,没有疑义的,因此当用户输入上述任何一个短语的时候,我们都应该给出可读性强的提示“Courtyard by Marriot, Munich City”。

提词顺序的定制性:对于一个查询的返回结果,会考虑tf/idf等因素。而对于提词结果,用户可能需要完全的定制。比如希望将折扣比较大的酒店排在最前边等等。

基于这些原因,es提供了一个单独的suggest来完成提词。

2:Completion Suggest的一些设置

多个输入的设定:由FST的结构限制,是从左到右匹配的。所以,为了更灵活的给出题词,可以设定多个输入,这多个输入都对应同样的逻辑意义,无论输入哪一个输入都应该给出正确的题词。设定需要题词字段的input属性即可。

同一的题词:output属性其实是规定了希望给出用户的题词是什么,而不是FST里边保存的term。比如input输入为“Mercure Hotel Munich”,按照从正常题词,如果text设定为M,则会提示Mercure Hotel Munich,而如果设定了output为hotel mercure,则给出的题词为output的内容。

权重问题:设置weight。不同的doc希望用户不同的权重,作用于suggest上,权重高的顺序靠前。如果不设定weight,es会按照查询期间的tf来决定。

用户自定义的信息:payload可以设定一个json结构的字符串,来携带用户自定义的信息。比如可以设定为docid,这样当给出题词的同时,也把docid返回给了用户,用户可以直接浏览这个doc的信息。

同义词:跟查询一样,同义词同样适用,设定对应的filter即可。

忽略停用词:注意了,completion suggest的mapping中默认的index_analyzer是simple analyzer而不是standard analyzer。为什么呢?还是停用词的问题。对于"The Charles hotel",当用户输入"Charles"的时候,应该给出正确的题词,但是却不是这样的,因为stop token filter虽然移除了停用词,但在FST中留下了一个空白符,因此题词以一个空白符开头了,所以会出现问题。为了移除这个空白符,可以设定preserve_position_increments
和preserve_separators为false。

是否应该忽略停用词也是个让人纠结的事情,比如"Simon the Sorcerer",当用户输入"Simon t"的时候,如果忽略了停用词,则无法提词,因为t本身不是停用词。所以为了得到更好的提词结果,我们得充分利用多个输入来表明所有的输入情况,得到正确的提词结果(是不是复杂了。。。)。恩。

以后的计划:

es会针对停用词这块进行处理,另外会支持fuzzy。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-10 16:37:11

elasticsearch的autocomplete的相关文章

[Elasticsearch] 部分匹配 (四) - 索引期间优化ngrams及索引期间的即时搜索

本章翻译自Elasticsearch官方指南的Partial Matching一章. 索引期间的优化(Index-time Optimizations) 目前我们讨论的所有方案都是在查询期间的.它们不需要任何特殊的映射或者索引模式(Indexing Patterns):它们只是简单地工作在已经存在于索引中的数据之上. 查询期间的灵活性是有代价的:搜索性能.有时,将这些代价放到查询之外的地方是有价值的.在一个实时的Web应用中,一个额外的100毫秒的延迟会难以承受. 通过在索引期间准备你的数据,可

Apache Solr vs Elasticsearch

http://solr-vs-elasticsearch.com/ Apache Solr vs Elasticsearch The Feature Smackdown API Feature Solr 6.2.1 ElasticSearch 5.0 Format XML, CSV, JSON JSON HTTP REST API Binary API   SolrJ  TransportClient, Thrift (through a plugin) JMX support  ES spec

elasticsearch映射

前面讲到,无论是关系型数据库还是非关系型数据库,乃至elasticsearch这种事实上承担着一定储存作用的搜索引擎,数据类型都是非常重要而基础的概念.但elasticsearch与其它承担着数据存储的技术有着比较大的区别之一就是映射,和倒排索引. 映射是定义如何存储和编制文档及其包含的字段的过程.例如,使用映射来定义: 哪些字符串字段应被视为全文字段. 哪些字段包含数字,日期或地理位置. 文档中所有字段的值是否应该编入catch-all _all字段. 日期值的格式. 自定义规则来控制动态添加

elasticsearch系列二:索引详解(快速入门、索引管理、映射详解、索引别名)

一.快速入门 1. 查看集群的健康状况 http://localhost:9200/_cat http://localhost:9200/_cat/health?v 说明:v是用来要求在结果中返回表头 状态值说明 Green - everything is good (cluster is fully functional),即最佳状态Yellow - all data is available but some replicas are not yet allocated (cluster i

Elasticsearch RestHighLevelClient客户端封装

目录 EsClientRHL 开源源码地址 开发原因: 使用前你应该具有哪些技能 工具功能范围介绍 工具源码结构介绍 开始使用 未来规划 EsClientRHL EsClientRHL是一个可基于springboot的elasticsearch RestHighLevelClient客户端调用封装工具,主要提供了es索引结构工具.es索引数据增删改工具.es查询工具.es数据分析工具. 基于elasticsearch6.6+版本进行开发,由于采用RestHighLevelClient,所以版本兼

Elasticsearch深入8

搜索推荐,search as you type 百度 --> elas --> elasticsearch --> elasticsearch权威指南 GET /my_index/my_type/_search { "query": { "match_phrase_prefix": { "title": "hello d" } } } 原理跟match_phrase类似,唯一的区别,就是把最后一个term作为

Elasticsearch入门教程(五):Elasticsearch查询(一)

原文:Elasticsearch入门教程(五):Elasticsearch查询(一) 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/vbirdbest/article/details/79228852 // 准备数据 PUT /shop/goods/1 { "name": "2017新款女装冬季外套ulzzang棉袄中长款棉衣韩版百搭棉服面包服", &quo

Elasticsearch系列---前缀搜索和模糊搜索

概要 本篇我们介绍一下部分搜索的几种玩法,我们经常使用的浏览器搜索框,输入时会弹出下拉提示,也是基于局部搜索原理实现的. 前缀搜索 我们在前面了解的搜索,词条是最小的匹配单位,也是倒排索引中存在的词,现在我们来聊聊部分匹配的话题,只匹配一个词条中的一部分内容,相当于mysql的"where content like '%love%'",在数据库里一眼就能发现这种查询是不走索引的,效率非常低. Elasticsearch对这种搜索有特殊的拆分处理,支持多种部分搜索格式,这次重点在于not

ElasticSearch

一.概述 1.简介 ElasticSearch是一个基于Lucene实现的开源.分布式.Restful的全文本搜索引擎:此外,它还是一个分布式实时文档存储,其中每个文档的每个field均是被索引的数据,且可被搜索:也是一个带实时分析功能的分布式搜索引擎,能够扩展至数以百计的节点实时处理PB级的数据. 应用场景:当我们建立一个网站或应用程序,并要添加搜索功能,但是想要完成搜索工作的创建是非常困难的.我们希望搜索解决方案要运行速度快.能有一个零配置和一个完全免费的搜索模式.能够简单地使用JSON通过