• 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操作。


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

    创建索引

    1. PUT /stu_db
    2. {
    3. "settings": {
    4. "index": {
    5. "analysis.analyzer.default.type": "ik_max_word"
    6. }
    7. }
    8. }

    索引文档

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

    Term query常见参数实战

    基本语法

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

    第一步:实现需求。

    1. GET /stu_db/_search
    2. {
    3. "query": {
    4. "term": {
    5. "age": {
    6. "value": 12
    7. }
    8. }
    9. }
    10. }
    11. #简短写法
    12. GET /stu_db/_search
    13. {
    14. "query": {
    15. "term": {
    16. "age": 12
    17. }
    18. }
    19. }

    对text类型字段的处理方法

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

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

    GET /stu_db/_mapping

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

    1. GET /stu_db/_search
    2. {
    3. "query": {
    4. "term": {
    5. "name.keyword": {
    6. "value": "北冥沧海"
    7. }
    8. }
    9. }
    10. }
    11. #简短写法
    12. GET /stu_db/_search
    13. {
    14. "query": {
    15. "term": {
    16. "name.keyword": "北冥沧海"
    17. }
    18. }
    19. }

    避免算分

    1. #会计算分数
    2. GET /stu_db/_search
    3. {
    4. "query": {
    5. "term": {
    6. "figure.height": {
    7. "value": 172
    8. }
    9. }
    10. }
    11. }
    12. #不会计算分数,且充分利用缓存。
    13. GET /stu_db/_search
    14. {
    15. "query": {
    16. "constant_score": {
    17. "filter": {
    18. "term": {
    19. "figure.height": {
    20. "value": 172
    21. }
    22. }
    23. }
    24. }
    25. }
    26. }

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

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

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

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

    1. GET /stu_db/_search
    2. {
    3. "query": {
    4. "term": {
    5. "mobilePhoneType": {
    6. "value": "iphone"
    7. }
    8. }
    9. }
    10. }
    11. GET /stu_db/_search
    12. {
    13. "query": {
    14. "term": {
    15. "mobilePhoneType": {
    16. "value": "IPHONE"
    17. }
    18. }
    19. }
    20. }

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

    1. GET /stu_db/_search
    2. {
    3. "query": {
    4. "term": {
    5. "mobilePhoneType": {
    6. "value": "IPHONE",
    7. "case_insensitive":true
    8. }
    9. }
    10. }
    11. }

    多值精确搜索

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

    第一步:实现需求。

    1. GET /stu_db/_search
    2. {
    3. "query": {
    4. "terms": {
    5. "figure.weight":[63.5,75.5]
    6. }
    7. }
    8. }
  • 相关阅读:
    非零基础自学Java (老师:韩顺平) 第7章 面向对象编程(基础部分) 7.10 this关键字
    leaflet知识点:地图窗格panes的应用
    【动手深度学习-笔记】注意力机制(二)注意力评分函数
    fastdfs-client-java-1.30 maven 打包安装
    Vue 监听属性Watch
    无代码开发设备管理系统,全闭环维修流程,定期维护自动报警
    计算机精品视频教程合集
    linux下IO模及其特点及select
    爬虫神器Selenium傻瓜教程,看了直呼牛掰
    耗时大半个月收整全套「Java架构进阶pdf」
  • 原文地址:https://blog.csdn.net/qq_39706570/article/details/126186857