V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
jiobanma
V2EX  ›  问与答

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

  •  
  •   jiobanma · 2023-02-06 14:34:45 +08:00 · 874 次点击
    这是一个创建于 691 天前的主题,其中的信息可能已经有所发展或是发生改变。

    刚刚学习 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 属于精确查询也就是全匹配,不太明白为什么我的这个查询查不到数据?

    7 条回复    2023-02-06 16:06:16 +08:00
    zsl199512101234
        1
    zsl199512101234  
       2023-02-06 14:40:58 +08:00
    因为你创建的 address 类型是 text ,会被分词器处理,你把它换成 keyword 类型就可以了
    zsl199512101234
        2
    zsl199512101234  
       2023-02-06 14:41:12 +08:00
    @zsl199512101234 text 类型用 match 查询
    reter
        3
    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
        4
    jiobanma  
    OP
       2023-02-06 15:10:35 +08:00
    @zsl199512101234
    @reter 谢谢各位,那如果要想实现类似于 sql 中 select * from table where address = ‘’; 需要使用什么查询啊
    zsl199512101234
        5
    zsl199512101234  
       2023-02-06 15:23:31 +08:00
    @jiobanma 把 address 换成 keyword 类型就可以了
    deltadawn
        6
    deltadawn  
       2023-02-06 15:42:40 +08:00
    不改类型,改查询字段也可以的 address.keyword
    jiobanma
        7
    jiobanma  
    OP
       2023-02-06 16:06:16 +08:00
    @deltadawn 我查到这个了,但是我使用的客户端是 elasticsearch-java ,java 代码里不知道怎么设置这个.keyword 。
    ```
    term(termQueryBuilder -> termQueryBuilder.queryName()
    .field("address.keyword").value(”“))
    ```
    这样设置好像并不起作用
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2827 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 13:24 · PVG 21:24 · LAX 05:24 · JFK 08:24
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.