浅谈Elasticsearch查询和搜索

Elasticsearch查询和搜索

Elasticsearch是一个分布式、实时的搜索和分析引擎,广泛应用于全文搜索、日志分析、实时数据分析等场景。Elasticsearch提供了丰富的查询和搜索功能,如查询DSL、过滤、排序、分页、高亮和聚合等。本文将详细介绍如何在Elasticsearch中使用这些功能。

1. 查询DSL

Elasticsearch使用查询DSL(Domain Specific Language)来构建查询。查询DSL是一种基于JSON的查询语言,允许您以简洁、易读的方式构建复杂的查询。

1.1 基本查询

match查询是一个全文搜索查询,用于在一个或多个字段中搜索文本。以下是一个match查询示例:

{
   
  "query": {
   
    "match": {
   
      "title": "Elasticsearch"
    }
  }
}

在此示例中,我们构建了一个match查询,用于搜索title字段中包含"Elasticsearch"的文档。

要在Elasticsearch中执行查询,您可以使用_searchAPI。以下是一个使用curl命令执行查询的示例:

curl -X GET "localhost:9200/my_index/_search" -H 'Content-Type: application/json' -d'
{
  "query": {
    "match": {
      "title": "Elasticsearch"
    }
  }
}
'
1.1.1 Multi-match查询

multi_match查询允许您在多个字段中执行全文搜索。以下是一个multi_match查询示例:

{
   
  "query": {
   
    "multi_match": {
   
      "query": "Elasticsearch",
      "fields": ["title", "content"]
    }
  }
}

在此示例中,我们构建了一个multi_match查询,用于搜索titlecontent字段中包含"Elasticsearch"的文档。

1.1.2 Term查询

term查询用于在一个字段中搜索精确值。以下是一个term查询示例:

{
   
  "query": {
   
    "term": {
   
      "status.keyword": "published"
    }
  }
}

在此示例中,我们构建了一个term查询,用于搜索status.keyword字段中值为"published"的文档。

1.1.3 Range查询

range查询用于在一个字段中搜索范围内的值。以下是一个range查询示例:

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

在此示例中,我们构建了一个range查询,用于搜索publish_date字段中值在"2021-01-01"到"2021-12-31"之间的文档。

1.2 复合查询

复合查询允许您组合多个查询,以构建更复杂的查询条件。

1.2.1 Bool查询

bool查询允许您组合多个查询,使用逻辑运算符(如mustshouldmust_notfilter)来定义查询条件。以下是一个bool查询示例:

{
   
  "query": {
   
    "bool": {
   
      "must": {
   
        "match": {
   
          "title": "Elasticsearch"
        }
      },
      "filter": {
   
        "range": {
   
          "publish_date": {
   
            "gte": "2021-01-01"
          }
        }
      }
    }
  }
}

在此示例中,我们构建了一个bool查询,用于搜索title字段中包含"Elasticsearch"且publish_date字段大于等于"2021-01-01"的文档。

1.2.2 Disjunction Max查询(Dis Max查询)

dis_max查询允许您在多个查询中选择最高得分的查询结果。以下是一个dis_max查询示例:

{
   
  "query": {
   
    "dis_max": {
   
      "queries": [
        {
   
          "match": {
   
            "title": "Elasticsearch"
          }
        },
        {
   
          "match": {
   
            "content": "Elasticsearch"
          }
        }
      ]
    }
  }
}

在此示例中,我们构建了一个dis_max查询,用于搜索titlecontent字段中包含"Elasticsearch"的文档。查询结果将根据最高得分的查询进行排序。

1.3 嵌套查询

嵌套查询用于查询包含嵌套对象的文档。假设我们有一个包含comments嵌套对象的文档,每个评论都有一个authorcontent字段。以下是一个嵌套查询示例:

{
   
  "query": {
   
    "nested": {
   
      "path": "comments",
      "query": {
   
        "bool": {
   
          "must": [
            {
   
              "match": {
   
                "comments.author": "John Doe"
              }
            },
            {
   
              "match": {
   
                "comments.content": "Elasticsearch"
              }
            }
          ]
        }
      }
    }
  }
}

在此示例中,我们构建了一个嵌套查询,用于搜索comments.author字段为"John Doe"且comments.content字段包含"Elasticsearch"的文档。

1.4 聚合查询

聚合查询允许您对查询结果进行分组和统计。要在查询中添加聚合,您可以使用aggs参数。以下是一个聚合示例:

{
   
  "query": {
   
    "match": {
   
      "title": "Elasticsearch"
    }
  },
  "aggs": {
   
    "by_category": {
   
      "terms": {
   
        "field": "category.keyword"
      }
    }
  }
}

在此示例中,我们添加了一个名为by_category的聚合,该聚合按category.keyword字段对查询结果进行分组。terms聚合用于计算每个类别中的文档数量。

要获取聚合结果,您可以在响应中查看aggregations字段。以下是一个聚合结果示例:

{
   
  ...
  "aggregations": {
   
    "by_category": {
   
      "buckets": [
        {
   
          "key": "category1",
          "doc_count": 10
        },
        {
   
          "key": "category2",
          "doc_count": 5
        }
      ]
    }
  }
}

在此示例中,我们可以看到每个类别中的文档数量。例如,category1中有10个文档,category2中有5个文档。

2. 过滤

2.1 过滤与查询的区别

在Elasticsearch中,查询和过滤有以下主要区别:

  • 查询(Query):主要用于全文搜索,会计算文档的相关性得分(relevance
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值