Elasticsearch的查询语法是DSL(Domain-Specific Language)的一部分,主要用于构建各种类型的查询。以下是一些常见的查询语法示例:

匹配查询(match)

查询特定字段包含指定文本的文档

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

多字段匹配查询(multi_match)

在多个字段中进行匹配查询

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

短语匹配查询(match_phrase)

查询包含指定短语的文档。

{
  "query": {
    "match_phrase": {
      "title": "Elasticsearch tutorial"
    }
  }
}

那么match_phrasematch有什么区别呢?

match 查询:

  • match 查询用于执行全文搜索,它会将查询字符串分词,然后在索引中查找包含任何一个分词的文档。默认情况下,match 查询使用分词器进行分词操作。

  • 适用于自然语言搜索,如对文本内容进行关键字匹配。

match_phrase 查询:

  • match_phrase 查询用于执行精确的短语匹配,它会将查询字符串视为一个整体,并在索引中查找包含完全匹配查询短语的文档。不会进行分词操作。

  • 适用于需要确保查询短语在文档中以特定顺序出现的场景。

布尔查询 (bool)

使用布尔逻辑组合多个查询条件,包括 must(与操作)、should(或操作)和 must_not(非操作)。

{
  "query": {
    "bool": {
      "must": [
        { "match": { "field1": "value1" } },
        { "range": { "field2": { "gte": 10, "lte": 20 } } }
      ],
      "should": [
        { "term": { "field3": "value2" } }
      ],
      "must_not": [
        { "exists": { "field": "field4" } }
      ]
    }
  }
}

范围查询 (range)

用于指定字段值在给定范围内的文档。

{
  "query": {
    "range": {
      "field_name": {
        "gte": 10,
        "lte": 20
      }
    }
  }
}

通配符查询 (wildcard)

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

{
  "query": {
    "wildcard": {
      "field_name": "search*"
    }
  }
}

正则表达式查询 (regexp):

使用正则表达式进行匹配。

{
  "query": {
    "regexp": {
      "field_name": ".*pattern.*"
    }
  }
}

模糊查询 (fuzzy)

允许在指定字段中进行模糊匹配。

{
  "query": {
    "fuzzy": {
      "title": {
        "value": "elasticserach",
        "fuzziness": 2
      }
    }
  }
}

match 查询:

  • match 查询用于执行全文搜索,它会将查询字符串分词,然后在索引中查找包含任何一个分词的文档。默认情况下,match 查询使用分词器进行分词操作。

  • 适用于自然语言搜索,如对文本内容进行关键字匹配。

fuzzy 查询:

  • fuzzy 查询用于执行模糊匹配,允许在匹配查询时包含一定程度的拼写错误或变体。它不进行分词,而是将整个查询字符串视为一个整体,尝试找到与之相似的文档。

  • 适用于处理可能存在拼写错误的场景,或者对于需要容忍一些文本变体的需求。