ES基本查询语法

本文详细介绍了Elasticsearch中的各种查询与过滤技术,包括term、terms、range、exists、missing、bool、match_all、match、multi_match、match_phrase、constant_score等,以及它们在实际场景中的应用。

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

1.term主要用于精确匹配哪些值,比如数字,日期,布尔值或 not_analyzed 的字符串(未经分析的文本数据类型):

{ “term”: { “age”: 26 }}

2.terms 跟 term 有点类似,但 terms 允许指定多个匹配条件。 如果某个字段指定了多个值,那么文档需要一起去做匹配:

{
“terms”: {
“tag”: [ “search”, “full_text”, “nosql” ]
}
}

3.range过滤允许我们按照指定范围查找一批数据:

{
“range”: {
“age”: {
“gte”: 20,
“lt”: 30
}
}
}

4.exists 和 missing 过滤可以用于查找文档中是否包含指定字段或没有某个字段,类似于SQL语句中的IS_NULL条件.

{
“exists”: {
“field”: “title”
}
}

这两个过滤只是针对已经查出一批数据来,但是想区分出某个字段是否存在的时候使用。

5.bool 过滤可以用来合并多个过滤条件查询结果的布尔逻辑,它包含一下操作符:

must :: 多个查询条件的完全匹配,相当于 and。
must_not :: 多个查询条件的相反匹配,相当于 not。
should :: 至少有一个查询条件匹配, 相当于 or。should
子句(查询)应该出现在匹配的文档中。如果 bool查询位于查询上下文中并且具有mustor filter子句,则bool即使没有should查询匹配,文档也将匹配该查询 。在这种情况下,这些条款仅用于影响分数。如果bool查询是过滤器上下文 或者两者都不存在,must或者filter至少有一个should查询必须与文档相匹配才能与bool查询匹配。这种行为可以通过设置minimum_should_match参数来显式控制 。
这些参数可以分别继承一个过滤条件或者一个过滤条件的数组:

{
“bool”: {
“must”: { “term”: { “folder”: “inbox” }},
“must_not”: { “term”: { “tag”: “spam” }},
“should”: [
{ “term”: { “starred”: true }},
{ “term”: { “unread”: true }}
]
}
}

6.match_all 查询可以查询到所有文档,是没有查询条件下的默认语句。

{
“match_all”: {}
}

此查询常用于合并过滤条件。 比如说你需要检索所有的邮箱,所有的文档相关性都是相同的,所以得到的_score为1.

7.match查询是一个标准查询,不管你需要全文本查询还是精确查询基本上都要用到它。

如果你使用 match 查询一个全文本字段,它会在真正查询之前用分析器先分析match一下查询字符:

{
“match”: {
“tweet”: “About Search”
}
}

如果用match下指定了一个确切值,在遇到数字,日期,布尔值或者not_analyzed 的字符串时,它将为你搜索你给定的值:

{ “match”: { “age”: 26 }}
{ “match”: { “date”: “2014-09-01” }}
{ “match”: { “public”: true }}
{ “match”: { “tag”: “full_text” }}

提示: 做精确匹配搜索时,你最好用过滤语句,因为过滤语句可以缓存数据。

match查询只能就指定某个确切字段某个确切的值进行搜索,而你要做的就是为它指定正确的字段名以避免语法错误。

8.multi_match查询允许你做match查询的基础上同时搜索多个字段,在多个字段中同时查一个:

{
“multi_match”: {
“query”: “full text search”,
“fields”: [ “title”, “body” ]
}
}

9.bool 查询与 bool 过滤相似,用于合并多个查询子句。不同的是,bool 过滤可以直接给出是否匹配成功, 而bool 查询要计算每一个查询子句的 _score (相关性分值)。

must:: 查询指定文档一定要被包含。
must_not:: 查询指定文档一定不要被包含。
should:: 查询指定文档,有则可以为文档相关性加分。
以下查询将会找到 title 字段中包含 “how to make millions”,并且 “tag” 字段没有被标为 spam。 如果有标识为 “starred” 或者发布日期为2014年之前,那么这些匹配的文档将比同类网站等级高:

{
“bool”: {
“must”: { “match”: { “title”: “how to make millions” }},
“must_not”: { “match”: { “tag”: “spam” }},
“should”: [
{ “match”: { “tag”: “starred” }},
{ “range”: { “date”: { “gte”: “2014-01-01” }}}
]
}
}

提示: 如果bool 查询下没有must子句,那至少应该有一个should子句。但是 如果有must子句,那么没有should子句也可以进行查询。

10.短语匹配(Phrase Matching),当你需要寻找邻近的几个单词时,你会使用match_phrase查询:

GET /my_index/my_type/_search
{
“query”: {
“match_phrase”: {
“title”: “quick brown fox”
}
}
}
和match查询类似,match_phrase查询首先解析查询字符串来产生一个词条列表。然后会搜索所有的词条,
但只保留含有了所有搜索词条的文档,并且词条的位置要邻接。一个针对短语quick fox的查询不会匹配
我们的任何文档,因为没有文档含有邻接在一起的quick和box词条。
match_phrase查询也可以写成类型为phrase的match查询:

“match”: {
“title”: {
“query”: “quick brown fox”,
“type”: “phrase”
}
}

11.constant_score:通常当查找一个精确值的时候,我们不希望对查询进行评分计算。只希望对文档进行包括或排除的计算,所以我们会使用 constant_score 查询以非评分模式来执行 term 查询并以一作为统一评分。

最终组合的结果是一个 constant_score 查询,它包含一个 term 查询:

GET /my_store/products/_search
{
“query” : {
“constant_score” : {

        "filter" : {
            "term" : { 
                "price" : 20
            }
        }
    }
}

}

### Elasticsearch SQL 查询语法 示例教程 Elasticsearch 提供了对 SQL 查询的支持,允许用户通过熟悉的 SQL 语法查询数据[^3]。以下是关于 Elasticsearch SQL 查询语法的详细说明和示例: #### 1. 基本查询 Elasticsearch SQL 支持使用标准的 SQL SELECT 语句来查询数据。以下是一个简单的查询示例,展示如何从索引中检索所有字段的数据: ```sql SELECT * FROM my_index; ``` 此查询将返回 `my_index` 索引中的所有文档[^3]。 #### 2. 指定字段查询 如果只需要查询某些特定字段,可以在 SELECT 子句中指定字段名称。例如: ```sql SELECT name, age FROM my_index; ``` 上述查询仅返回 `name` 和 `age` 字段的值。 #### 3. 条件过滤 可以使用 WHERE 子句添加条件过滤。例如,查询年龄大于 25 的文档: ```sql SELECT * FROM my_index WHERE age > 25; ``` 此外,还可以结合多个条件进行过滤。例如,查询年龄大于 25 且性别为男性的文档: ```sql SELECT * FROM my_index WHERE age > 25 AND sex = '1'; ``` #### 4. 排序 可以使用 ORDER BY 子句对结果进行排序。例如,按照年龄降序排列: ```sql SELECT * FROM my_index ORDER BY age DESC; ``` 如果需要指定缺失值的处理方式,可以使用 `MISSING` 关键字。例如,当 `age` 字段缺失时将其排在最前面: ```sql SELECT * FROM my_index ORDER BY age DESC MISSING '_first'; ``` #### 5. 分页 Elasticsearch SQL 支持分页查询,可以通过 LIMIT 和 OFFSET 子句实现。例如,查询前 10 条记录: ```sql SELECT * FROM my_index LIMIT 10; ``` 或者跳过前 10 条记录并查询接下来的 10 条记录: ```sql SELECT * FROM my_index LIMIT 10 OFFSET 10; ``` #### 6. 聚合查询 Elasticsearch SQL 还支持聚合操作。例如,统计每个城市的文档数量: ```sql SELECT city, COUNT(*) AS count FROM my_index GROUP BY city; ``` 此查询将返回每个城市对应的文档计数。 #### 7. 时间字段查询 对于时间字段,可以使用日期格式化功能。例如,查询发布日期在 2023 年之后的文档: ```sql SELECT * FROM my_index WHERE release_date > '2023-01-01'; ``` #### 8. 处理空值 可以使用 IS NULL 或 IS NOT NULL 判断字段是否为空。例如,查询 `city` 字段为空的文档: ```sql SELECT * FROM my_index WHERE city IS NULL; ``` #### 9. 自定义字段格式 可以使用 FORMAT 子句自定义字段的输出格式。例如,将日期字段格式化为特定格式: ```sql SELECT release_date FORMAT 'yyyy-MM-dd' FROM my_index; ``` ### 注意事项 - Elasticsearch SQL 查询需要启用 SQL 功能,并确保相关插件已安装[^5]。 - 查询性能可能受索引设计和数据量影响,建议优化查询语句以提高效率[^3]。 ```python # 示例:通过 Python 使用 Elasticsearch SQL API from elasticsearch import Elasticsearch es = Elasticsearch() response = es.sql.query(body={ "query": "SELECT * FROM my_index WHERE age > 25" }) print(response) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值