请教一个关于 ES 中 term 查询的疑问

2023-02-06 14:34:45 +08:00
 jiobanma

刚刚学习 ES ,在使用 term 查询时,针对一个 text 类型的字段查询不到数据的疑问,希望大佬可以解释一下。 版本信息:es 8.6 ,java 客户端是 elasticsearch-java 索引中比如有两个字段 name 和 address 。其中 name 设置为 keyword 关键词,age 设置为 text ,使用 ik 分词器。

  1. 代码如下:
 .properties("name", propertyBuilder -> propertyBuilder
                                .keyword(keyWordPropertyBuilder -> keyWordPropertyBuilder))
                                
.properties("address", propertyBuilder -> propertyBuilder
                                .text(textPropertyBuilder -> textPropertyBuilder.analyzer("ik_max_word").searchAnalyzer("ik_max_word"))
  1. 插入的数据为:
{
     "name": "王五",
     "address": "北京市昌平区"
}
  1. term 查询
.query(queryBuilder -> queryBuilder.term(termQueryBuilder -> termQueryBuilder
                                                .field("address").value("北京市昌平区"))

该查询查询不到任何数据。

看到网上说 term 属于精确查询也就是全匹配,不太明白为什么我的这个查询查不到数据?

869 次点击
所在节点    问与答
7 条回复
zsl199512101234
2023-02-06 14:40:58 +08:00
因为你创建的 address 类型是 text ,会被分词器处理,你把它换成 keyword 类型就可以了
zsl199512101234
2023-02-06 14:41:12 +08:00
@zsl199512101234 text 类型用 match 查询
reter
2023-02-06 14:42:48 +08:00
https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-term-query.html

warning 已经说了:当字段指定为 text 时, es 会用分词器重写字段的内容,所以用 term 查找是搜不到的,用要 match 查找。
jiobanma
2023-02-06 15:10:35 +08:00
@zsl199512101234
@reter 谢谢各位,那如果要想实现类似于 sql 中 select * from table where address = ‘’; 需要使用什么查询啊
zsl199512101234
2023-02-06 15:23:31 +08:00
@jiobanma 把 address 换成 keyword 类型就可以了
deltadawn
2023-02-06 15:42:40 +08:00
不改类型,改查询字段也可以的 address.keyword
jiobanma
2023-02-06 16:06:16 +08:00
@deltadawn 我查到这个了,但是我使用的客户端是 elasticsearch-java ,java 代码里不知道怎么设置这个.keyword 。
```
term(termQueryBuilder -> termQueryBuilder.queryName()
.field("address.keyword").value(”“))
```
这样设置好像并不起作用

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/913606

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX