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

查看 84|回复 6
作者:jiobanma   
刚刚学习 ES ,在使用 term 查询时,针对一个 text 类型的字段查询不到数据的疑问,希望大佬可以解释一下。
版本信息:es 8.6 ,java 客户端是 elasticsearch-java
索引中比如有两个字段 name 和 address 。其中 name 设置为 keyword 关键词,age 设置为 text ,使用 ik 分词器。
[ol]
  • 代码如下:
    [/ol]
    .properties("name", propertyBuilder -> propertyBuilder
                                    .keyword(keyWordPropertyBuilder -> keyWordPropertyBuilder))
                                    
    .properties("address", propertyBuilder -> propertyBuilder
                                    .text(textPropertyBuilder -> textPropertyBuilder.analyzer("ik_max_word").searchAnalyzer("ik_max_word"))
    [ol]
  • 插入的数据为:
    [/ol]
    {
         "name": "王五",
         "address": "北京市昌平区"
    }
    [ol]
  • term 查询
    [/ol]
    .query(queryBuilder -> queryBuilder.term(termQueryBuilder -> termQueryBuilder
                                                    .field("address").value("北京市昌平区"))
    该查询查询不到任何数据。
    看到网上说 term 属于精确查询也就是全匹配,不太明白为什么我的这个查询查不到数据?

    term, 查询, address, name

  • zsl199512101234   
    因为你创建的 address 类型是 text ,会被分词器处理,你把它换成 keyword 类型就可以了
    zsl199512101234   
    @zsl199512101234 text 类型用 match 查询
    reter   
    https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-term-query.html
    warning 已经说了:当字段指定为 text 时, es 会用分词器重写字段的内容,所以用 term 查找是搜不到的,用要 match 查找。
    jiobanma
    OP
      
    @zsl199512101234
    @reter 谢谢各位,那如果要想实现类似于 sql 中 select * from table where address = ‘’; 需要使用什么查询啊
    zsl199512101234   
    @jiobanma 把 address 换成 keyword 类型就可以了
    deltadawn   
    不改类型,改查询字段也可以的 address.keyword
    您需要登录后才可以回帖 登录 | 立即注册

    返回顶部