你不会是程序猿吧?

elasticsearch的termsquery

Elasticsearch | 作者 qqq1234567 | 发布于2018年10月12日 | 阅读数:9292

TermsQueryBuilder query = QueryBuilders.termsQuery("desc","游戏数据");
TermsQueryBuilder query = QueryBuilders.termsQuery("desc","游");
用第一种时无法查询出数据,第二种可以,分词器也设置了ik,为什么
已邀请:

rochy - rochy_he

赞同来自:

首先你需要确定一下 ik 分词器生效了,如果生效的话,默认你两种搜索都不应该有结果的
游戏数据使用 ik 默认会被分词为:游戏/数据;
存储在 ES 里面是两个 Term:“游戏” “数据”
你在搜索的时候可以使用:QueryBuilders.termsQuery("desc","游戏", "数据");
现在你使用的是 QueryBuilders.termsQuery("desc","游戏数据");  QueryBuilders.termsQuery("desc","游");
“游戏数据” 这个 Term 以及 “游” 这个 Term 都不再分词结果里面,因此搜索不到
 
你的测试结果是搜索“游”可以查询到,因此怀疑你的 ik 没有配置好
如果配置成功,你可以尝试:QueryBuilders.termsQuery("desc","游戏", "数据");

qqq1234567

赞同来自:

那为什么我用MatchQueryBuilder query = QueryBuilders.matchQuery("desc", "游戏")时,可以查到
27092-创新产品高级游戏内容运营(深圳)
27564-游戏商业分析
21090-游戏运营(深圳)
SD9-游戏后台开发
24012-游戏技术美术
27560-游戏策划(深圳)
23872-游戏研究岗
27560-游戏策划(深圳)
27564-体育游戏评测方向游戏策划(深圳)
23518-移动游戏渠道运营策划(精品游戏)
这么多的数据,
而用TermsQueryBuilder query = QueryBuilders.termsQuery("desc","游戏")只查到
27092-创新产品高级游戏内容运营(深圳)这样一条呢

rochy - rochy_he

赞同来自:

matchQuery 是对你输入的文本进行了分词操作,而 termsQuery 对你输入的文本是不进行分词的,你需要理解这一点
你可以把你这个 desc 字段的 mapping 设置贴出来看一下

qqq1234567

赞同来自:

创建索引时没有设置mapping,默认是为空吗,可以修改吗

qqq1234567

赞同来自:

那我问一下就是如果一个字段用or匹配多个词,可以用什么方法

要回复问题请先登录注册