文章目录
在 Elasticsearch 中,精确查询和范围查询是非常常用的操作。本文将详细解释
term
、
terms
和
range
查询的语法、参数说明、使用场景以及示例,同时还将介绍
term
和
match
之间的区别以及
term
对不同字段类型的查询。
1. term 查询
term
查询用于执行精确匹配,它会查找指定字段中与查询值完全匹配的文档。
field_name
是要搜索的字段名,query_value
是要搜索的精确值
{
"query": {
"term": {
"field_name": "query_value"
}
}
}
例如:要在状态字段中搜索值为 “active” 的文档,可以使用以下查询:
{
"query": {
"term": {
"status": "active"
}
}
}
2. terms 查询
terms
查询用于执行多个值的精确匹配。它会查找指定字段中与查询值列表中任何一个值匹配的文档。
field_name
是要搜索的字段名,value1
和 value2
是要搜索的多个值。
{
"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_value
和 max_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 字符串类型
对于文本字符串类型(例如 text
或 keyword
),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
查询可以直接匹配 true
或 false
值。
{
"query": {
"term": {
"is_active": true
}
}
}
这个查询将匹配 is_active
字段值为 true
的文档。
其他类型
对于其他类型(如地理位置、IP 地址等),term
查询的行为也是类似的,直接进行精确匹配。需要注意的是,虽然 term
查询对于精确匹配很有用,但对于文本类型字段来说,由于不会进行分词,它可能无法涵盖全部查询需求。在需要进行全文检索或模糊匹配时,可能会更多地使用 match
查询等其他查询方法。
7、总结
在 Elasticsearch 中,term、terms 和 range 查询是非常常用的查询语法。它们分别适用于精确匹配、多值精确匹配和范围查询的场景。通过熟练掌握它们的语法和参数,能够更灵活地进行数据查询和分析,提升数据处理的效率。