Elasticsearch语法知多少之Term query

目录

目标

ES版本信息

官方文档

相关术语和注意事项

创建相关的索引和文档(数据用于实战案例)

创建索引

索引文档

Term query常见参数实战

基本语法

对text类型字段的处理方法

避免算分

设置关键词是否区分大小写

多值精确搜索


目标

掌握精准搜索,包括单值精确搜索和多值精确搜索。本文会列举各种常见的案例,通过这些案例来熟悉精准查询各个参数的功能和使用方法。


ES版本信息

7.17.5


官方文档

Term queryicon-default.png?t=M666https://www.elastic.co/guide/en/elasticsearch/reference/7.17/query-dsl-term-query.html


相关术语和注意事项

使用场景

Term query常用来处理价格、产品ID或用户名等精确值的搜索。特别注意:要避免对text类型字段进行精准查询,因为分词使得精准查询无法搜索到目标文档。推荐对text使用Match query。

单值精准搜索

搜索条件只有一个,且不对搜索条件进行分词,直接做等值搜索。

多值精准搜索

搜索条件有多个,且不对搜索条件进行分词,直接做等值搜索,只要有一个符合就匹配,相当于MySQL中的IN操作。


创建相关的索引和文档(数据用于实战案例)

创建索引

PUT /stu_db
{
  "settings": {
    "index": {
      "analysis.analyzer.default.type": "ik_max_word"
    }
  }
}

索引文档

PUT /stu_db/_bulk
{ "index": { "_id": "1"} }  
{"address": "湖南省长沙市天心区","age":12,"name":"张三","figure":{"height":172.0,"weight":63.5},"mobilePhoneType":"huawei"}
{ "index": { "_id": "2"} }  
{"address": "湖南省长沙市芙蓉区","age":13,"name":"诸葛神王","figure":{"height":180.0,"weight":75.5},"mobilePhoneType":"xiaomi"}
{ "index": { "_id": "3"} }  
{"address": "广东省广州市白云区","age":14,"name":"北冥沧海","figure":{"height":2.0,"weight":80.5},"mobilePhoneType":"iphone"}
{ "index": { "_id": "4"} }  
{"address": "湖北省武汉市江夏区","age":15,"name":"李四","figure":{"height":192.0,"weight":78.5},"mobilePhoneType":"iPhone"}

Term query常见参数实战

基本语法

需求:精确搜索年龄为12的文档。

第一步:实现需求。

GET /stu_db/_search
{
  "query": {
    "term": {
      "age": {
        "value": 12
      }
    }
  }
}

#简短写法
GET /stu_db/_search
{
  "query": {
    "term": {
      "age": 12
    }
  }
}

对text类型字段的处理方法

需求:精确搜索姓名为"北冥沧海"的文档。

第一步:查询name字段的类型,发现它是text类型,子类型是keyword类型。

GET /stu_db/_mapping

第二步:官方文档指出:要避免对text类型字段进行精准查询,因为分词使得精准查询无法搜索到目标文档。此时可以使用keyword类型来精准搜索。

GET /stu_db/_search
{
  "query": {
    "term": {
      "name.keyword": {
        "value": "北冥沧海"
      }
    }
  }
}

#简短写法
GET /stu_db/_search
{
  "query": {
    "term": {
      "name.keyword": "北冥沧海"
    }
  }
}

避免算分

#会计算分数
GET /stu_db/_search
{
  "query": {
    "term": {
      "figure.height": {
        "value": 172
      }
    }
  }
}
#不会计算分数,且充分利用缓存。
GET /stu_db/_search
{
  "query": {
    "constant_score": {
      "filter": {
        "term": {
          "figure.height": {
            "value": 172
          }
        }
      }
    }
  }
}

设置关键词是否区分大小写

说明:case_insensitive是term的可选参数,默认为false,表示关键词区分大小写,设置为true表示关键词不区分大小写。该参数在7.10.0开始有效。

需求:分别使用关键词"iphone"和"IPHONE"作为手机品牌的搜索条件,精准搜索文档。

第一步:实现需求。发现"iphone"为条件可以查询出来,而"IPHONE"为条件查询不出来。说明该参数默认区分大小写。

GET /stu_db/_search
{
  "query": {
    "term": {
      "mobilePhoneType": {
        "value": "iphone"
      }
    }
  }
}

GET /stu_db/_search
{
  "query": {
    "term": {
      "mobilePhoneType": {
        "value": "IPHONE"
      }
    }
  }
}

第二步:设置为true,即关键词不区分大小写。使用关键词"IPHONE"作为手机品牌的搜索条件,精准搜索文档。可以搜索出文档,证明该参数分析正确。

GET /stu_db/_search
{
  "query": {
    "term": {
      "mobilePhoneType": {
        "value": "IPHONE",
        "case_insensitive":true
      }
    }
  }
}

多值精确搜索

需求:搜索体重包含63.5和75.5的文档。

第一步:实现需求。

GET /stu_db/_search
{
  "query": {
    "terms": {
      "figure.weight":[63.5,75.5]
    }
  }
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值