Elasticsearch 实战:Elasticsearch 文档多条件查询
在实际应用中,常常需要根据多个条件对文档进行筛选。Elasticsearch 提供了多种查询类型和查询组合机制,支持构建复杂的多条件查询。以下是如何进行文档多条件查询的详细步骤:
**1. **布尔查询(Bool Query)
布尔查询是构建多条件查询最常用且最强大的工具。它允许将多个查询条件以 must
(逻辑 AND)、should
(逻辑 OR)、must_not
(逻辑 NOT)的形式组合在一起。例如,查找标题包含 “Elasticsearch” 且价格小于 .png 的书籍,但不包含作者 “Zachary Tong”:
GET /my_index/_search
{
"query": {
"bool": {
"must": [
{ "match": { "title": "Elasticsearch" } },
{ "range": { "price": { "lt": .jpg } } }
],
"must_not": [
{ "term": { "author": "Zachary Tong" } }
]
}
}
}
**2. **复合查询(Compound Queries)
除了布尔查询,Elasticsearch 还提供了其他复合查询类型,如 constant_score
(为子查询赋予固定分数)、dis_max
(返回子查询中得分最高的文档)、function_score
(根据自定义函数计算分数)等。根据业务需求,可以选择合适的复合查询类型。
**3. **嵌套对象查询
对于包含嵌套对象的文档,可以使用嵌套查询(Nested Query)或父子关系查询(Parent-Child Query)来处理多条件查询。例如,一个文档结构包含多个评论(nested object),要查找包含特定用户评论且该评论点赞数大于 10 的文档:
GET /my_index/_search
{
"query": {
"nested": {
"path": "comments",
"query": {
"bool": {
"must": [
{ "term": { "comments.user": "user1" } },
{ "range": { "comments.likes": { "gt": 10 } } }
]
}
}
}
}
}
**4. **脚本查询(Script Query)
通过编写脚本,可以实现更复杂的条件判断。例如,查找价格低于平均价格的文档:
GET /my_index/_search
{
"query": {
"bool": {
"filter": {
"script": {
"script": {
"source": """
double avgPrice = doc['price'].value;
return avgPrice < params.targetPrice;
""",
"params": {
"targetPrice": 50.0
}
}
}
}
}
}
}
**5. **查询模板(Query Template)
对于经常使用的多条件查询,可以预先定义查询模板,通过参数化查询来简化请求构造。查询模板使用 Mustache 语法,允许在运行时插入动态参数。例如,定义一个模板:
PUT _scripts/multi_condition_template
{
"script": {
"lang": "mustache",
"source": """
{
"query": {
"bool": {
"must": [
{{#title}}{ "match": { "title": "{{title}}" } },{{/title}}
{{#price}}{ "range": { "price": { "gte": {{price}}, "lte": {{price_max}} } } },{{/price}}
{{#author}}{ "term": { "author": "{{author}}" } }{{/author}}
]
}
}
}
"""
}
}
然后使用模板执行查询:
GET /my_index/_search/template
{
"id": "multi_condition_template",
"params": {
"title": "Elasticsearch",
"price": 50,
"price_max": 100,
"author": "Clintongormley"
}
}
通过灵活运用布尔查询、复合查询、嵌套对象查询、脚本查询以及查询模板,您可以构建出满足复杂业务需求的多条件查询语句。在实际应用中,应结合数据模型和查询场景选择最适合的查询类型和参数,以实现高效准确的数据检索。同时,关注查询性能,适时进行查询优化。
标签:实战,title,price,查询,文档,ElasticSearch,Elasticsearch,must From: https://blog.csdn.net/qq_33240556/article/details/137222761