Elasticsearch的一些基本查询

技术 · 2023-10-11

Elasticsearch 是一个开源的分布式搜索和分析引擎,它可以用于快速查询、分析和探索大量的数据。在 Elasticsearch 中,你可以使用查询语句来搜索索引中的文档。以下是 Elasticsearch 中的一些基本查询示例:

1. 匹配查询(Match Query)

匹配一个字段中包含特定词语的文档。

{
  "query": {
    "match": {
      "field_name": "search_term"
    }
  }
}

2. 短语匹配查询(Match Phrase Query)

匹配一个字段中包含特定短语的文档。

{
  "query": {
    "match_phrase": {
      "field_name": "search_phrase"
    }
  }
}

3. 范围查询(Range Query)

匹配一个字段中在指定范围内的值。

{
  "query": {
    "range": {
      "field_name": {
        "gte": "min_value",
        "lte": "max_value"
      }
    }
  }
}

4. 通配符查询(Wildcard Query)

使用通配符进行模糊匹配。

{
  "query": {
    "wildcard": {
      "field_name": "wildcard_pattern"
    }
  }
}

5. 布尔查询(Boolean Query)

组合多个查询条件,支持 AND、OR、NOT 操作。

{
  "query": {
    "bool": {
      "must": [
        { "match": { "field1": "value1" }},
        { "range": { "field2": { "gte": "value2" }}}
      ],
      "must_not": [
        { "term": { "field3": "value3" }}
      ],
      "should": [
        { "match": { "field4": "value4" }}
      ]
    }
  }
}

6. 模糊查询(Fuzzy Query)

在词语的拼写不准确的情况下进行查询。

{
  "query": {
    "fuzzy": {
      "field_name": {
        "value": "search_term",
        "fuzziness": "2"
      }
    }
  }
}

以上是一些基本的 Elasticsearch 查询示例。你可以根据实际需求组合这些查询条件,也可以使用更高级的查询和过滤器来满足特定的需求。请确保你的 Elasticsearch 索引和文档结构符合你的查询需求。

在Elasticsearch的查询中,mustshouldmust_not是布尔查询(Boolean Query)中的关键字,用于组合多个查询条件。这些关键字允许你构建复杂的查询逻辑,以满足更精细化的搜索需求。

  • must(与逻辑,AND): 所有的条件都必须匹配,文档才会被检索出来。

    {
      "query": {
        "bool": {
          "must": [
            { "match": { "field1": "value1" }},
            { "range": { "field2": { "gte": "value2" }}}
          ]
        }
      }
    }
  • should(或逻辑,OR): 至少一个条件匹配,文档就会被检索出来。should查询可以增加文档的相关性得分,但不是必须的。

    {
      "query": {
        "bool": {
          "should": [
            { "match": { "field1": "value1" }},
            { "match": { "field2": "value2" }}
          ]
        }
      }
    }
  • must_not(非逻辑,NOT): 匹配这个条件的文档会被排除在搜索结果之外。

    {
      "query": {
        "bool": {
          "must_not": [
            { "term": { "field1": "value1" }}
          ]
        }
      }
    }

你可以组合使用这些关键字,构建更为复杂的查询逻辑。例如,你可以使用must来确保某个字段包含某个值,同时使用should来提高包含其他特定关键词的文档的相关性得分。布尔查询允许你在一个查询中包含多个不同的条件,以便更精确地过滤和排序搜索结果。

在Elasticsearch中,有多种查询和过滤器可以用来满足不同的搜索需求。以下是关于常用查询和过滤器的详细解释:

查询(Queries):

  1. match查询:

    • 用于在指定字段中进行全文搜索。
    • 语法:{"match": {"field_name": "search_text"}}
  2. term查询:

    • 用于精确匹配指定字段中的确切值。
    • 语法:{"term": {"field_name": "exact_value"}}
  3. terms查询:

    • 用于匹配字段中包含指定多个值中的任意一个值的文档。
    • 语法:{"terms": {"field_name": ["value1", "value2"]}}
  4. exists查询:

    • 用于匹配指定字段存在值的文档。
    • 语法:{"exists": {"field": "field_name"}}
  5. missing查询(在Elasticsearch 7.x及以上版本中已废弃,可以用must_not结合exists代替):

    • 用于匹配指定字段不存在值的文档。
    • 语法:{"missing": {"field": "field_name"}}
  6. wildcard查询:

    • 用于使用通配符进行模糊匹配。
    • 语法:{"wildcard": {"field_name": "wildcard_pattern"}}
  7. 范围查询(Range Queries):

    • lt:匹配小于指定值的文档。
    • lte:匹配小于或等于指定值的文档。
    • gt:匹配大于指定值的文档。
    • gte:匹配大于或等于指定值的文档。
    • 语法:{"range": {"field_name": {"lt": value, "lte": value, "gt": value, "gte": value}}}

过滤器(Filters):

过滤器是一种用来筛选文档的查询,它不会计算相关性分数,仅仅根据条件匹配或不匹配文档。在Elasticsearch中,过滤器被广泛用于过滤查询结果。

  1. term过滤器:

    • 用于精确匹配指定字段中的确切值。
    • 语法:{"term": {"field_name": "exact_value"}}
  2. terms过滤器:

    • 用于匹配字段中包含指定多个值中的任意一个值的文档。
    • 语法:{"terms": {"field_name": ["value1", "value2"]}}
  3. 范围过滤器(Range Filters):

    • lt:匹配小于指定值的文档。
    • lte:匹配小于或等于指定值的文档。
    • gt:匹配大于指定值的文档。
    • gte:匹配大于或等于指定值的文档。
    • 语法:{"range": {"field_name": {"lt": value, "lte": value, "gt": value, "gte": value}}}

以上查询和过滤器提供了丰富的功能,使得你可以根据具体的需求来构建复杂的搜索逻辑。在实际应用中,你可以根据需要组合这些查询和过滤器,以满足不同的查询需求。

Elasticsearch
Theme Jasmine by Kent Liao