【Elasticsearch】 09-DSL语法详解-精确检索term、terms 、range


在 Elasticsearch 中,精确查询和范围查询是非常常用的操作。本文将详细解释 termtermsrange 查询的语法、参数说明、使用场景以及示例,同时还将介绍 termmatch 之间的区别以及 term对不同字段类型的查询。

1. term 查询

term 查询用于执行精确匹配,它会查找指定字段中与查询值完全匹配的文档。
field_name 是要搜索的字段名,query_value 是要搜索的精确值

{
  "query": {
    "term": {
      "field_name": "query_value"
    }
  }
}

例如:要在状态字段中搜索值为 “active” 的文档,可以使用以下查询:

{
  "query": {
    "term": {
      "status": "active"
    }
  }
}

2. terms 查询

terms 查询用于执行多个值的精确匹配。它会查找指定字段中与查询值列表中任何一个值匹配的文档。
field_name 是要搜索的字段名,value1value2 是要搜索的多个值。

{
  "query": {
    "terms": {
      "field_name": ["value1", "value2"]
    }
  }
}

例如:要在标签字段中搜索包含 “elasticsearch” 或 “kibana” 的文档,可以使用以下查询:

{
  "query": {
    "terms": {
      "tags": ["elasticsearch", "kibana"]
    }
  }
}

3. range 查询

range 查询用于在指定范围内执行搜索。它可以用于数值、日期等字段。

  • gte:大于等于指定值。
  • gt:大于指定值。
  • lte:小于等于指定值。
  • lt:小于指定值。
  • format:针对日期范围查询,指定日期格式。
  • time_zone:针对日期范围查询,指定时区信息。

数值格式

{
  "query": {
    "range": {
      "field_name": {
        "gte": "min_value",
        "lte": "max_value"
      }
    }
  }
}

field_name 是要搜索的字段名,min_valuemax_value 是范围的最小值和最大值。

日期格式 format

对于日期字段,可以使用 format 参数来指定日期格式。

{
  "query": {
    "range": {
      "created_at": {
        "gte": "2023-07-01",
        "lte": "2023-07-31",
        "format": "yyyy-MM-dd"
      }
    }
  }
}

created_at 字段被解析为指定的日期格式。

日期格式 time_zone

如果字段值包含时区信息,可以使用 time_zone 参数来指定查询时的时区。

{
  "query": {
    "range": {
      "timestamp": {
        "gte": "now-1d",
        "time_zone": "+08:00"
      }
    }
  }
}

这个查询将匹配昨天以后的文档,但使用指定的时区。

4. 示例与应用场景

使用 term 查询

假设我们有一个用户数据集,包含性别和年龄字段。我们想要搜索性别为 “female” 的用户。可以使用以下查询:

{
  "query": {
    "term": {
      "gender": "female"
    }
  }
}

使用 terms 查询

现在,我们想要搜索标签为 “java” 或 “python” 的文章。可以使用以下查询:

{
  "query": {
    "terms": {
      "tags": ["java", "python"]
    }
  }
}

使用 range 查询

假设有一个产品数据集,包含发布日期和价格字段。想要搜索发布日期在 2023 年到 2024 年之间,并且价格在 100 到 500 之间的产品。可以使用以下查询:

{
  "query": {
    "range": {
      "publish_date": {
        "gte": "2023-01-01",
        "lte": "2024-12-31"
      }
    }
  }
}

5. term 查询和 match 查询的区别

虽然 term 查询和 match 查询都用于执行精确匹配,但它们在使用上有一些区别。

  • term 查询:用于执行精确匹配,它会查找指定字段中与查询值完全匹配的文档。适用于关键词字段,不会进行分词。

  • match 查询:用于执行全文检索,会将查询值进行分词后与文档进行匹配。适用于全文检索,支持分析器和模糊匹配。

6. term 对于不同字段类型的查询

当使用 term 查询时,对于不同的数据类型,其行为可能会有所不同。针对不同数据类型使用term 查询以及可能遇到的情况进行描述。

Text 字符串类型

对于文本字符串类型(例如 textkeyword),term 查询会执行精确匹配,但是不会分析查询值,而是直接与字段中的值进行比较。这意味着它不会进行分词,而是将查询值与字段值完全比对。

{
  "query": {
    "term": {
      "name.keyword": "Elasticsearch"
    }
  }
}

在这个例子中,将匹配 name 字段值为 “Elasticsearch” 的文档。

数值类型

对于数值类型,term 查询会直接匹配字段值。但要注意,数值类型有精度问题,因此在使用 term 查询时需要格外小心。

{
  "query": {
    "term": {
      "age": 25
    }
  }
}

这个查询将匹配 age 字段值为 25 的文档。

日期类型

对于日期类型,term 查询同样直接匹配字段值。但是,要确保查询值格式正确匹配字段的日期格式。

{
  "query": {
    "term": {
      "created_at": "2023-07-01T12:00:00"
    }
  }
}

这个查询将匹配 created_at 字段值为 “2023-07-01T12:00:00” 的文档。

布尔类型

对于布尔类型,term 查询可以直接匹配 truefalse 值。

{
  "query": {
    "term": {
      "is_active": true
    }
  }
}

这个查询将匹配 is_active 字段值为 true 的文档。

其他类型

对于其他类型(如地理位置、IP 地址等),term 查询的行为也是类似的,直接进行精确匹配。需要注意的是,虽然 term 查询对于精确匹配很有用,但对于文本类型字段来说,由于不会进行分词,它可能无法涵盖全部查询需求。在需要进行全文检索或模糊匹配时,可能会更多地使用 match 查询等其他查询方法。

7、总结

在 Elasticsearch 中,term、terms 和 range 查询是非常常用的查询语法。它们分别适用于精确匹配、多值精确匹配和范围查询的场景。通过熟练掌握它们的语法和参数,能够更灵活地进行数据查询和分析,提升数据处理的效率。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Python的elasticsearch-dsl是基于elasticsearch-py封装实现的,提供了更简便的操作elasticsearch的方法。你可以通过安装elasticsearch-dsl库来使用它。安装命令是"pip install elasticsearch-dsl"。如果你在Django项目中使用elasticsearch-dsl,你还可以考虑安装django-elasticsearch-dsl-drf库,它可以将Elasticsearch DSL与Django REST框架集成,提供更方便的使用体验。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Elasticsearch python操作实践(elasticsearchElasticsearch DSL)](https://blog.csdn.net/qq_43008709/article/details/109401610)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [python中elasticsearch_dsl模块用法详解](https://blog.csdn.net/m0_72557783/article/details/126957624)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [django-elasticsearch-dsl-drf:将Elasticsearch DSL与Django REST框架集成](https://download.csdn.net/download/weixin_42131861/15058672)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值