ElasticSearch Query DSL之term-level queries

本文详细介绍了Elasticsearch中的term-level查询,包括termquery、termsquery、terms_setquery、rangequery、existsquery等,强调了它们在结构化数据查询中的应用和注意事项,如字段类型限制、查询原理和性能优化。示例代码和数据演示了各种查询的用法,帮助读者理解如何在实际场景中正确使用这些查询。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

概述

注:

  1. 本篇博客的内容参考自 es 7.x版本的官方文档:https://www.elastic.co/guide/en/elasticsearch/reference/7.x/term-level-queries.html
  2. 博客中的所有代码示例,都已经在7.1.1版本的es集群中验证通过

term-level查询,通常使用在结构化数据的查询中,是用于精确值查找的。

所谓的结构化数据,指的是比如数值(short、integer、long、float、double等8种类型)、日期(date)、keyword、boolean、ip等类型。

跟全文检索不一样的是,term-level查询不会对输入进行分词,相反的,它会直接将输入作为精确值,去做精确匹配查找

term-level查询有如下几种类型:

  1. term query

    term query 查找 指定字段中包含了某个精确值的文档,类似于java中xxSet.contains(“xxx”)。

  2. terms query

    查找指定字段中包含 查询词根集合中 的任意一个精确值的文档。类似于java中的xxSet.contains(“xxx_1”) or xxSet.contains(“xxx_2”)。

  3. terms_set query

    查找与一个或多个指定词根相匹配的文档,而匹配的项的数量则可以由参数来指定。

  4. range query

    范围查询
    类似于如下sql

    select * from tb where price >= 10 and price < 20
    
  5. exists query

    返回在原始字段中至少有一个非空值的文档
    类似于如下sql

    select * from tb where dept_id is null
    或者
    select * from tb where dept_id is not null
    
  6. prefix query

    前缀查询
    类似于如下sql

    select * from tb where name like '苏%'
    
  7. wildcard query

    通配符查询

  8. fuzzy query

    模糊查询

  9. regexp query

    正则表达式查询

  10. type query

    指定类型查询

  11. ids query

    ids数组查询。

通俗易懂的说,上面的11中查询类型,也就是接下来要详细讲解的东西,对比到sql上,其实就是教大家在查询的时候如何去写where条件的,而且是:在面对各种数据类型的字段、或者是特定某类查询的时候,该如何正确的书写where条件。并且,本篇博客所讲的,还是where条件的最小单元——也就说,举个例子,当我们讲解到term query的时候,我们只会讲到如何去查询dept = “IT”,而不会讲到复合查询dept = “IT” or dept = “BIGDATA”


样例数据

在开始之前,为了后面的测试方便,这里我统一设置了一个名为idx-susu-test-term-query的索引,使用手动设置mappings的方式,尽可能多的插入了不同类型的字段,并且也插入了尽可能多情形的数据。

# 1.为了防止index已存在,先删除一下
DELETE idx-susu-test-term-query


# 2.手动设置index的mapping
PUT idx-susu-test-term-query/
{
   
   
  "mappings": {
   
   
    "properties": {
   
   
      "id": {
   
   
        "type": "long"
      },
      "birth": {
   
   
        "type": "date",
        "format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"
      },
      "salary": {
   
   
        "type": "float"
      },
      "detp": {
   
   
        "type": "keyword"
      },
      "skill": {
   
   
        "type": "keyword"
      },
      "skill_count": {
   
   
        "type": "short"
      },
      "skill_required_matches": {
   
   
        "type": "integer"
      },
      "addr": {
   
   
        "type": "text",
        "analyzer": "ik_max_word"
      },
      "isBoss": {
   
   
        "type": "boolean"
      }
    }
  }
}


# 3.批量插入数据,同时刷新index
POST idx-susu-test-term-query/_bulk?refresh=true
{
   
    "index": {
   
    "_id": "1"              }}
{
   
    "id": 1, "birth": "1980-01-01 00:00:00", "salary": 40000, "dept": "BIGDATA", "skill": ["HADOOP", "JAVA", "PYTHON"],  "skill_count": 3, "skill_required_matches": 2, "addr": "北京昌平区", "isBoss": false}
{
   
    "index": {
   
    "_id": "2"              }}
{
   
    "id": 2, "birth": "1985-02-01 10:20:00", "salary": 35000, "dept": "BIGDATA", "skill": ["JAVA", "PYTHON"],            "skill_count": 2, "skill_required_matches": 2, "addr": "北京海淀区", "isBoss": false}
{
   
    "index": {
   
    "_id": "3"              }}
{
   
    "id": 3, "birth": "1989-11-01 05:00:10", "salary": 50000, "dept": "SALE",    "skill": ["PPT", "EXCEL"],              "skill_count": 2, "skill_required_matches": 1,  "addr": "北京朝阳区", "isBoss": false}
{
   
    "index": {
   
    "_id": "4"              }}
{
   
    "id": 4, "birth": "1990-01-01 11:11:11", "salary": 40000, "dept": "IT",       "skill": ["HADOOP", "PHP", "C++"],     "skill_count": 3, "skill_required_matches": 3,  "addr": "北京昌平区", "isBoss": false}
{
   
    "index": {
   
    "_id": "5"              }}
{
   
    "id": 5, "birth": "1991-06-01 12:12:12", "salary": 30000, "dept": "IT",       "skill": ["HADOOP", "JAVA", "C++"],    "skill_count": 3, "skill_required_matches": 4,  "addr": "北京昌平区", "isBoss": false}
{
   
    "index": {
   
    "_id": "6"              }}
{
   
    "id": 6, "birth": "2001-03-01 13:13:13", "salary": 40000, "dept": "IT",       "skill": null,                         "skill_count": 0, "skill_required_matches": 0,  "addr": "北京昌平区", "isBoss": false}
{
   
    "index": {
   
    "_id": "7"              }}
{
   
    "id": 7, "birth": "1995-09-01 16:16:16", "salary": 20000, "dept": "UI",       "skill": [null, "EXCEL"],          
<think>嗯,用户想了解ElasticsearchQuery DSL使用方法及示例。首先,我需要回忆一下Elasticsearch的查询类型,记得有Term-level查询和全文查询两大类。Term-level用于精确匹配,比如keyword字段,而全文查询则会用到分词器,适用于text类型的字段。 用户可能不太清楚这两者的区别,所以需要先解释清楚。然后,常见的查询类型比如term、match、range、bool这些应该都是基础且常用的,需要给出每个的示例。比如term查询是精确匹配,而match会进行分词处理。 还要注意用户提供的引用内容,他们提到了Term level queries和prefix、regexp的例子,所以在回答中要涵盖这些。可能需要分点介绍不同的查询类型,每个类型给出一个示例,并说明使用场景。 另外,用户可能希望看到实际的JSON结构示例,这样更容易理解如何构造查询。比如term查询的结构,或者bool查询如何组合多个条件。同时,要提到如何在实际代码中执行这些查询,比如使用Java High Level REST Client,如引用中的SearchResponse和searchRequest的用法。 还要考虑用户的实际应用场景,比如日志分析、商品搜索,这样举例会更贴近实际需求。最后,生成的相关问题需要引导用户进一步学习,比如如何优化查询性能,或者如何处理复杂查询组合。 需要检查是否有遗漏的查询类型,确保覆盖主要的查询方式,同时保持结构清晰,步骤明确。可能还需要提醒用户注意字段类型的影响,比如text和keyword的区别,避免常见的错误用法。</think>### Elasticsearch Query DSL 使用方法及示例 Elasticsearch Query DSL(领域特定语言)提供了灵活的搜索条件定义方式,可分为**Term-level查询**(精确匹配)和**全文查询**(分词匹配)两类[^1][^2]。以下是核心功能及示例: --- #### 一、基础查询类型 1. **Term 查询** 精确匹配字段值,适用于`keyword`类型字段: ```json { "query": { "term": { "status": "published" // 完全匹配"published"的文档 } } } ``` 2. **Match 查询** 对`text`类型字段进行分词搜索: ```json { "query": { "match": { "content": "搜索引擎原理" // 拆分为"搜索引擎"、"原理"进行匹配 } } } ``` 3. **Range 查询** 数值/日期范围筛选: ```json { "query": { "range": { "price": { "gte": 100, "lte": 500 } } } } ``` --- #### 二、复合查询 1. **Bool 查询** 组合多个查询条件: ```json { "query": { "bool": { "must": [ // 必须满足 { "match": { "title": "手机" } } ], "filter": [ // 过滤条件(不计分) { "range": { "stock": { "gt": 0 } } } ] } } } ``` 2. **Prefix 查询** 前缀匹配(适合自动补全场景): ```json { "query": { "prefix": { "user.name": "zhang" // 匹配"zhangsan"等 } } } ``` --- #### 三、实战示例(日志分析) 查找2023年包含"error"且来自"server-01"的日志: ```json { "query": { "bool": { "must": [ { "match": { "message": "error" } }, { "term": { "hostname": "server-01" } } ], "filter": [ { "range": { "@timestamp": { "gte": "2023-01-01" } } } ] } } } ``` --- #### 四、Java客户端调用示例 ```java SearchRequest searchRequest = new SearchRequest("logs"); SearchSourceBuilder sourceBuilder = new SearchSourceBuilder(); sourceBuilder.query(QueryBuilders.termQuery("level", "error")); searchRequest.source(sourceBuilder); SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT); // ``` --- ### 应用场景建议 1. **电商搜索**:组合`match`(商品名称)、`range`(价格区间)、`term`(分类) 2. **日志分析**:使用`bool`+`range`进行时间范围过滤 3. **内容平台**:`match_phrase`实现精准短语匹配 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值