Elasticsearch Terms Query 深度解析
elasticsearch 项目地址: https://gitcode.com/gh_mirrors/elas/elasticsearch
概述
Elasticsearch 中的 terms
查询是一种精确匹配查询,用于查找包含指定字段中一个或多个精确值的文档。与 term
查询只能匹配单个值不同,terms
查询允许同时匹配多个值,这在很多实际应用场景中非常有用。
基本用法
terms
查询的基本语法结构如下:
{
"query": {
"terms": {
"field_name": ["value1", "value2", ...],
"boost": 1.0
}
}
}
其中:
field_name
是要查询的字段名- 数组包含要匹配的值列表
boost
是可选的权重参数
示例
查找 user.id
字段包含 "kimchy" 或 "elkbee" 的文档:
GET /_search
{
"query": {
"terms": {
"user.id": ["kimchy", "elkbee"]
}
}
}
核心参数详解
字段参数
- 必须指定要查询的字段名
- 值必须是精确匹配(包括大小写和空格)
- 默认最多支持 65,536 个查询项,可通过
index.max_terms_count
设置调整
boost 参数
- 类型:浮点数
- 默认值:1.0
- 作用:调整查询的相关性评分
- 0 < boost < 1.0:降低相关性
- boost > 1.0:提高相关性
- boost = 1.0:保持默认相关性
高级特性
高亮显示
terms
查询支持高亮显示,但有以下限制:
- 高亮效果取决于使用的高亮器类型
- 查询中包含的术语数量会影响高亮结果
- 在某些情况下可能不会返回高亮结果
术语查找(Terms Lookup)
术语查找是一种高级功能,它可以从现有文档中获取字段值作为查询条件。这在需要基于大量术语进行查询时特别有用。
术语查找参数
| 参数名 | 是否必需 | 说明 | |--------|----------|------| | index | 是 | 从中获取字段值的索引名 | | id | 是 | 文档ID | | path | 是 | 要获取值的字段名 | | routing| 否 | 自定义路由值 |
术语查找示例
- 首先创建索引并添加文档:
PUT my-index
{
"mappings": {
"properties": {
"color": { "type": "keyword" }
}
}
}
PUT my-index/_doc/1
{
"color": ["blue", "green"]
}
PUT my-index/_doc/2
{
"color": "blue"
}
- 使用术语查找查询:
GET my-index/_search
{
"query": {
"terms": {
"color": {
"index": "my-index",
"id": "2",
"path": "color"
}
}
}
}
这个查询会返回所有 color
字段包含文档2中 color
字段值的文档(即包含 "blue" 的文档1和文档2)。
性能优化建议
- 对于大量术语查询,考虑使用术语查找功能
- 确保
_source
字段已启用(术语查找需要) - 对于小型数据集,可以使用单主分片索引并完全复制到所有数据节点以减少网络流量
- 合理设置
index.max_terms_count
以平衡性能和需求
常见问题解答
Q: terms
查询和 term
查询有什么区别? A: term
查询只能匹配单个值,而 terms
查询可以匹配多个值。
Q: 如何提高 terms
查询的相关性评分? A: 使用 boost
参数,设置大于1的值可以提高相关性。
Q: 为什么我的术语查找查询没有返回预期结果? A: 请检查:1) _source
是否启用 2) 路径是否正确 3) 文档是否存在 4) 字段类型是否匹配
Q: 可以跨集群使用术语查找吗? A: 不可以,术语查找不支持跨集群搜索(CCS)。
elasticsearch 项目地址: https://gitcode.com/gh_mirrors/elas/elasticsearch
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考