Elasticsearch权威指南:使用terms查询实现多值精确匹配

Elasticsearch权威指南:使用terms查询实现多值精确匹配

elasticsearch-definitive-guide The Definitive Guide to Elasticsearch elasticsearch-definitive-guide 项目地址: https://gitcode.com/gh_mirrors/el/elasticsearch-definitive-guide

精确值查询的基本概念

在Elasticsearch中,精确值查询是结构化搜索的核心功能之一。当我们处理非文本数据时,如数字、日期或枚举值,通常需要精确匹配而非全文搜索。term查询是最基础的精确值查询方式,它能够查找包含特定值的文档。

从term到terms的演进

虽然term查询适用于单个值的精确匹配,但在实际业务场景中,我们经常需要同时匹配多个值。例如:

  • 查找价格为20或30美元的商品
  • 筛选状态为"已发货"或"已完成"的订单
  • 查询属于多个分类的产品

这时,使用多个term查询虽然可行,但会导致查询语句冗长且效率不高。Elasticsearch提供了terms查询(注意末尾的"s")来优雅地解决这个问题。

terms查询详解

terms查询是term查询的复数形式,语法结构非常相似。关键区别在于它接受一个值数组而非单个值:

{
    "terms": {
        "price": [20, 30]
    }
}

这个查询会返回所有price字段值为20或30的文档。在实际使用时,我们通常将其包裹在constant_score查询的filter子句中:

GET /my_store/products/_search
{
    "query": {
        "constant_score": {
            "filter": {
                "terms": {
                    "price": [20, 30]
                }
            }
        }
    }
}

查询结果分析

执行上述查询后,返回结果可能如下:

"hits": [
    {
        "_id": "2",
        "_score": 1.0,
        "_source": {
            "price": 20,
            "productID": "KDKE-B-9947-#kL5"
        }
    },
    {
        "_id": "3",
        "_score": 1.0,
        "_source": {
            "price": 30,
            "productID": "JODL-X-1937-#pV7"
        }
    },
    {
        "_id": "4",
        "_score": 1.0,
        "_source": {
            "price": 30,
            "productID": "QQPX-R-3956-#aD8"
        }
    }
]

可以看到,所有匹配文档的_score都是1.0,这是因为我们使用了constant_score查询,它会对所有匹配文档赋予相同的相关性分数。

性能优化建议

  1. 使用filter上下文:如示例所示,将terms查询放在filter上下文中可以利用Elasticsearch的缓存机制,提高查询性能。

  2. 避免大数组:当值数组非常大时(如上千个值),考虑使用其他方案如terms lookup或重构数据模型。

  3. 字段类型匹配:确保查询值的类型与字段映射类型一致,否则可能导致查询失败或返回意外结果。

实际应用场景

terms查询在以下场景特别有用:

  • 多选筛选器(如电商网站的价格区间筛选)
  • 状态过滤(如订单状态为"待付款"、"已发货"等)
  • 权限控制(如只允许查看特定部门的数据)

总结

terms查询是Elasticsearch中处理多值精确匹配的高效工具。通过简单的语法,我们可以实现复杂的筛选逻辑,同时保持查询性能。理解并合理运用terms查询,能够大大提升结构化搜索的效率和灵活性。

elasticsearch-definitive-guide The Definitive Guide to Elasticsearch elasticsearch-definitive-guide 项目地址: https://gitcode.com/gh_mirrors/el/elasticsearch-definitive-guide

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

倪炎墨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值