es之termQuery精确查询失效问题解决

TermQueryBuilder 

按理来说是应该有返回结果的,可是查询的时候要么就是没有,要么就是结果很奇怪。关于这个debug也debug了,逻辑代码也没啥问题。后来查了很多资料终于找到了解决办法。

解决办法:

将字段的type设置为keyword,即

                    .startObject("cyzjdm").field("type", "keyword").field("index", false).endObject()

原因:

term做精确查询可以用它来处理数字,布尔值,日期以及文本。查询数字时问题不大,但是当查询字符串时会有问题。term查询的含义是termQuery会去倒排索引中寻找确切的term,但是它并不知道分词器的存在。term表示查询字段里含有某个关键词的文档,terms表示查询字段里含有多个关键词的文档。也就是说直接对字段进行term本质上还是模糊查询,只不过不会对搜索的输入字符串进行分词处理罢了。如果想通过term查到数据,那么term查询的字段在索引库中就必须有与term查询条件相同的索引词,否则无法查询到结果。

一句话解释: elasticsearch 里默认的IK分词器是会将每一个中文都进行了分词的切割,所以你直接想查一整个词,或者一整句话是无返回结果的。

关于keyword:

我看有的文章说设置该属性用于关键词搜索,不进行分词。对于字符串类型的字段,es会默认生成一个keyword字段用于精确搜索。也有的说实际上还是会分词,只不过keyword的设置增加了一个额外字段,该字段就是filename.keyword。这个keyword才是不分词的索引字段,也就真正意义上实现了不分词处理字段。索引也是索引该字段才生成真正的精确匹配。至于分不分词实验一下就好了。感觉他们想表达的意思差不多是filename.keyword不分词,但是filename还是会分词。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐