从这篇文章开始我们将陆续介绍Elasticsearch的Term搜索和TermFilter过滤器。这里提前介绍下,在Elasticsearch中对应的搜索类型都会有对应的搜索filter,filter的好处是搜索速度比直接搜索速度更快,同时还可以做filter过滤器缓存,因此在开发中,我们尽量提倡大家多使用Filter过滤器。
Term搜索主要是指在查询的时候,不会把当前的查询词进行分词,相当于sql里面的等于条件搜索。举个例子:
搜索词是“中华人民共和国”,那么使用term搜索的时候,不会对中华人民共和国这7个字进行分词,在搜索时,elasticsearch中的文档内容必须要完全匹配中华人民共和国这7个字,才会被返回。
对于上面这个案例,用场景来解释下:
1、index索引库中mapping映射中,name字段是keyword类型(我们前面介绍过,keyword是不会分词的),索引库中有两条记录,第一条的name是“中华人民共和国”,第二条的name是“中华”。那么此时我们使用term("中华人民共和国")去搜索,那么第一条的记录肯定是能被搜索出来的,第二条是不能被搜索出来的。
2、index索引库中mapping映射中,name字段是text类型,使用ik分词器(我们前面介绍过,text类型是会被分词的),索引库中有两条记录,第一条的name是“中华人民共和国”,第二条的name是“中华”。那么此时我们使用term("中华人民共和国")去搜索,我们会发现两条记录都搜索不出来,因为第一条会被ik分词器分词变成(“中华”"人民"“共和国”)。此时倒排索引里面没有“中华人民共和国”这个词,所以是不能被完全匹配的,此时我们使用term搜索就搜索不出来结果。
结合上面的场景说明,我们可以大致了解term搜索的原理了。下面我们用真是案例来测试下。
1、我们创建一个device的mapping
这里主要使用keyword进行演示
2、向device插入两条数据
3、此时我们使用term搜索,在字段device_name中搜索“设备”看能否搜索出来
post /devices/_search { "query": { "term": { "device_name": "设备" } } }
可以看到是搜索不到的,因为在elasticsearch索引里面device_name是不会分词的,所以无法完全匹配设备这个词。
这里有一个小细节,在命中里面的total字样里面,可以看到relation为eq即equal,就是等于的查询。
4、我们使用term(“设备3 ”)进行搜索看看效果
post /devices/_search { "query": { "term": { "device_name": "设备" } } }
可以看到被完整的查出来了。
备注:
1、这里有一个小细节的地方,我们可以看到在设备3的3之后有一个空格,term搜索是不会进行trim的,因此空格也是会当作词放入搜索引擎里面进行搜索。
5、下面我们演示下使用termfilter进行搜索
post /devices/_search { "query": { "constant_score": { "filter": { "term": { "device_name": "设备4 " } } } } }
可以看到filter也是被搜索出来了。
备注:
1、使用filter的话一般应用于精准搜索,因此filter过滤器的时候是不会参与打分的。
2、filter过滤搜索效率一般比直接query更快。
3、filter过滤搜索会进行缓存,用于提高查询效率。
还没有评论,来说两句吧...