来先看图
我的字段是 name 和 age
QueryBuilder queryBuilder = QueryBuilders.termQuery(“name.keyword”, “淘宝”);
name 是你的字段名 其实真正的精准搜索值在字段名在的keyword
但是这种方式下,你必须输入完整的 字段名字,缺少一部分都会查不出来
这种方式不好。
所以使用:matchPhraseQuery 实现精准查询
MatchPhraseQueryBuilder title = QueryBuilders.matchPhraseQuery("title", keyword);
也可以使用:matchPhrasePrefixQuery
QueryBuilders.matchPhrasePrefixQuery(“supplierName”,param)
matchPhraseQuery和matchQuery等的区别,在使用matchQuery等时,在执行查询时,搜索的词会被分词器分词,而使用matchPhraseQuery时,不会被分词器分词,而是直接以一个短语的形式查询,而如果你在创建索引所使用的field的value中没有这么一个短语(顺序无差,且连接在一起),那么将查询不出任何结果。
总结:
在java rest client中调用elasticsearch中的数据,精准匹配的termQuery查不到数据,这个问题是java rest client客户端自带的bug,换用matchPhraseQuery直接替换即可。有点坑!
在elastic权威指南一书中是这样给出建议的:"匹配查询 match 是个 核心 查询。无论需要查询什么字段, match
查询都应该会是首选的查询方式。它是一个高级 全文查询
,这表示它既能处理全文字段,又能处理精确字段。"这就意味着match查询是高级查询,底层使用了term查询。结论:相关度查询使用match,精确字段查询使用matchPhrase即可。