在讲文本搜索之前,我们需要先知道文本的倒排索引是如何构建的。我们都知道es文本常用的两种数据类型keyword, text,这两种文本类型唯一区别就是在索引文档时,keyword类型文本不会进行分词,而是直接将字段内容作为一个关键词,构造倒排索引。而text字段会对对应文本进行分词,分词之后变成一个或多个关键词,构造倒排索引。
搜索之term
term搜索是一种等值比较的搜索,es会将term中全部文本作为一个关键词在倒排索引中匹配查询,如有匹配则返回结果。term查询场景适用于查询如 性别,类型等需要进行全部值匹配的查询场景,查询结果不会计算分数,速度相对较快。
搜索之match
match搜索是一种模糊搜索,适用于查询某个文本是否包含某些关键词,文本与搜索关键词的相似度的查询,在实际应用中如百度搜索,淘宝中根据一定词语对商品的搜索都是使用match搜索。match搜索会计算目标文档中相应字段文本与查询语句的相似度,根据相似情况进行打分。
match搜索实现原理是将查询语句通过分词器进行分词,变为多个查询关键词,然后将这些关键词在倒排索引中匹配查询,获得结果。
综上所述,term与match之间的区别:term不会对查询语句进行分词,也不会对查询结果打分,是一种全量文本的等值匹配。 match会进行分词,会进行打分,是一种相似度查询。
搜索之搜索过程
以上图三个节点为例,三个节点组成一个es集群,一个索引,3主3从。
- 当查询从客户端发送到节点3时,此客户端发送的请求被节点3接受并处理,此时我们称节点3为此次请求的协调节点,节点3会将查询发送到索引对应的三个分片,三个分片可能是主可能是从,es会根据负载均衡算法来决定查询请求发送到哪个分片。
- 各个分片会将查询结果的docid和排序字段返回给协调节点,注此时并不返回文档的全部数据。
- 协调节点根据各个分片返回的docid和排序字段进行排序,筛选出需要返回给客户端的文档docid
- 使用docid去对应分片上拉取文档真实数据,返回给客户端