Elasticsearch常用查询实操之query_string

本文详细介绍Elasticsearch 6.8中query_string查询的使用技巧,包括统计总数、逻辑运算、分组聚合、过滤、去重、排序等实战示例,并展示了如何在日期处理和DSL编写上优化查询性能。

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

Elasticsearch常用查询实操之query_string

官方学习文档:
https://www.elastic.co/guide/en/elasticsearch/reference/6.8/index.html
1、es 7.X后,统计真实的所有数量,需要加上一个参数,"track_total_hits": true

{
  "track_total_hits": true,
  "query": {
    "match_all": {}
  }
}

2、AND、OR、NOT、exists、_missing_等关键字在query_string中的用法;

AND:表示条件与;
OR:表示条件或;
NOT:表示条件非;
_exists_:表示存在,且是存在对应字段;
_missing_:表示不存在或为空,此处为空建议用_exists_取非;
示例,如下DSL含义为:
查询 key_name_1 字段值为 value1,存在key_name_2字段,且key_time范围为time1到time2的所有数据,再按照时间字段key_time2及key_name_2字段进行分组;其中将时间字段key_time2格式化为yyyy-MM-dd HH的格式,"min_doc_count": 1,过滤分组结果大于等一1的数据
{
  "size": 0,
  "query": {
    "query_string": {
      "query": "key_name_1:value1 AND _exists_:key_name_2 AND key_time:[\"time1\" TO \"time2\"]"
    }
  },
  "aggs": {
    "group_by_time1": {
      "date_histogram": {
        "field": "key_time2",
        "interval": "day",
        "time_zone": "Asia/Shanghai",
        "format": "yyyy-MM-dd HH",
        "min_doc_count": 0
      },
      "aggs": {
        "group_by_key_name_2": {
          "terms": {
            "field": "key_name_2"
          }
        }
      }
    }
  }
}

3、having 用法,过滤分组结果

{
  "size": 0,
  "query": {
    "query_string": {
      "query": "key_name_1:value1"
    }
  },
  "aggs": {
    "group_key_name_2": {
      "terms": {
        "field": "key_name_2",
        "size": 1000
      },
      "aggs": {
        "having": {
          "bucket_selector": {
            "buckets_path": {
              "view_count": "_count"
            },
            "script": "params.view_count >1"
          }
        }
      }
    }
  }
}

4、cardinality 关键词,分组去重

{
  "aggs": {
    "group_by_key_name_1": {
      "cardinality": {
        "field": "key_name_1",
        "size": 100
      }
    }
  }
}

5、order的用法,可用于分组后再按内层结果排序

{
  "aggs": {
    "group_by_key_name_1": {
      "terms": {
        "field": "key_name_1",
        "size": 100,
        "order": {
          "dist_key_name_2": "desc"
        }
      },
      "aggs": {
        "dist_key_name_2": {
          "cardinality": {
            "field": "key_name_2"
          }
        }
      }
    }
  }
}

6、日期date存储为long类型时可以进行格式化

可用的时间间隔表达式有:
year-1y:表示1年;
quarter-1q:表示1季度;
month-1M:表示1个月;
week-1w:表示1星期;
day-1d:表示1天;
hour-1h:表示1小时;
minute-1m:表示1分钟;
second-1s:表示1秒;
用法示例:1.5h可以用分钟表示为90m;
时间格式:yyyy-MM-dd HH:mm:ss 其中大写的HH代表24小时制
用法示例:
{
  "aggs": {
    "group_by_time": {
      "date_histogram": {
        "field": "key_time",
        "interval": "hour",
        "time_zone": "Asia/Shanghai",
        "format": "yyyy-MM-dd HH",
        "min_doc_count": 0,
        "extended_bounds": {
          "min": "2020-12-06 00",
          "max": "2020-12-06 23"
        }
      }
    }
  }
}
<think>好的,用户想了解关于Elasticsearch中`es simple_query_string`的使用示例。首先,我需要确认用户的需求是什么。他们可能是在使用Elasticsearch时遇到了查询构造的问题,或者想了解如何更灵活地进行搜索。`simple_query_string`查询相对于`query_string`来说更简单,适合用户输入,因为它会忽略无效的语法,并且默认使用OR作符。 接下来,我需要回忆`simple_query_string`的主要特性和用法。它支持常用作符,如`+`表示必须,`|`表示OR,`-`表示NOT,还支持分组和通配符。不过,它不像`query_string`那样支持所有Lucene语法,所以需要明确说明它的限制。 然后,我应该考虑如何组织示例。用户可能需要基础的查询示例,包括不同作符的使用,以及字段限定、默认作符的设置等高级用法。此外,多字段搜索和模糊匹配也是常见的用例,应该包含进去。 还要注意语法正确性,确保每个示例中的JSON结构正确,特别是转义字符的处理,比如在字符串中使用引号需要转义。同时,需要解释每个参数的作用,比如`query`、`fields`、`default_operator`等,帮助用户理解如何调整查询。 用户可能的疑问点包括作符的具体作用、字段加权的意义、模糊查询的参数设置,以及默认作符的影响。因此,在解释每个示例时,需要简明扼要地说明这些参数的效果,比如`^3`表示提升字段的权重,`~2`表示允许两个编辑距离的模糊匹配。 最后,总结`simple_query_string`的优势和适用场景,强调其用户友好性和容错性,适合直接处理用户输入的搜索条件。同时提醒用户注意它与`query_string`的区别,避免误用。 检查是否有遗漏的重要特性,比如对特殊字符的处理、性能方面的考虑,或者是否支持短语查询。确认所有示例都能正确运行,并且语法符合Elasticsearch的版本要求。确保使用中文清晰解释,结构层次分明,方便用户逐步理解和应用。</think>以下是对 Elasticsearch 中 `simple_query_string` 查询的详细介绍及使用示例: --- ### 一、`simple_query_string` 是什么? - 一种更简单、容错性更强的查询语法,适合直接处理用户输入的搜索条件 - 支持常用作符:`+`(必须包含)、`|`(或)、`-`(排除)、`*`(通配符)等 - **特点**:自动忽略无效语法,默认使用 `OR` 作符 --- ### 二、基础使用示例 #### 示例1:简单搜索 ```json GET /products/_search { "query": { "simple_query_string": { "query": "apple +phone -samsung", "fields": ["name", "description"] } } } ``` - **含义**:搜索包含 `apple` 且包含 `phone`,但不含 `samsung` 的文档 - **字段限定**:只在 `name` 和 `description` 字段中搜索 --- #### 示例2:逻辑作符 ```json { "query": { "simple_query_string": { "query": "(laptop | notebook) +16GB", "default_operator": "AND" } } } ``` - **含义**:搜索同时包含 `16GB` 和 (`laptop` 或 `notebook`) 的文档 - `default_operator`:指定默认逻辑关系为 AND --- ### 三、高级用法 #### 示例3:字段加权 ```json { "query": { "simple_query_string": { "query": "error~2", "fields": ["title^3", "content"] } } } ``` - **含义**: - `title^3`:`title` 字段权重是 `content` 字段的 3 倍 - `error~2`:支持模糊匹配(允许 2 个字符的编辑距离) --- #### 示例4:短语搜索 ```json { "query": { "simple_query_string": { "query": "\"wireless charger\"", "quote_field_suffix": ".exact" } } } ``` - **含义**:精确匹配短语 `wireless charger` - `quote_field_suffix`:指定使用 `.exact` 后缀字段进行精确匹配 --- ### 四、参数说明 | 参数 | 说明 | |---------------------|----------------------------------------------------------------------| | `query` | 查询字符串,支持特殊符号(自动忽略无效语法) | | `fields` | 指定搜索字段,支持通配符(如 `*_name`)和加权(如 `title^2`) | | `default_operator` | 默认逻辑作符(`OR` 或 `AND`),默认为 `OR` | | `analyzer` | 指定分词器 | | `flags` | 启用特定语法功能(如 `PHRASE`、`FUZZY` 等) | --- ### 五、适用场景 1. 用户直接输入的搜索框查询 2. 需要自动容错的简单搜索 3. 快速现多字段组合查询 注意:与 `query_string` 查询相比,`simple_query_string` **不支持**正则表达式、邻近搜索等高级功能,但安全性更高。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值