Elasticsearch 查询分类及功能关键字

一、全文检索查询 (Full Text Queries)

这类查询用于搜索文本内容,会对查询语句进行分词处理,适用于 text 类型的字段。

  1. multi_match

    • 功能:在多个字段上执行相同的 match 查询。

    • 示例:同时在 title 和 content 字段中搜索关键词。

    json

    {
      "query": {
        "multi_match": {
          "query": "quick brown fox",
          "fields": ["title", "content"]
        }
      }
    }
  2. match_phrase

    • 功能:匹配包含完全相同且顺序一致的短语的文档。它考虑了单词的顺序。

    • 示例:精确匹配短语 “quick brown fox”。

    json

    {
      "query": {
        "match_phrase": {
          "message": "quick brown fox"
        }
      }
    }
  3. match_phrase_prefix

    • 功能:与 match_phrase 类似,但允许对最后一个词项进行前缀匹配(即通配符搜索)。

    • 示例:匹配以 “quick brown f” 开头的短语,用于实现搜索建议。

    json

    {
      "query": {
        "match_phrase_prefix": {
          "message": "quick brown f"
        }
      }
    }
  4. query_string

    • 功能:支持复杂的、紧凑的Lucene查询字符串语法,允许使用 AND, OR, NOT, 通配符 *, 模糊匹配 ~ 等操作符在一个查询字符串中表达复杂逻辑。

    • 注意:非常强大但也很危险(语法严格易出错),通常不推荐用于用户直接输入(有注入风险)。

    json

    {
      "query": {
        "query_string": {
          "default_field": "content",
          "query": "(elasticsearch AND learning) OR (kibana tutorial)"
        }
      }
    }
  5. simple_query_string

    • 功能query_string 的一个更安全、更简单的版本。它会忽略无效的语法部分而不是直接报错,更适合暴露给用户直接使用。

    json

    {
      "query": {
        "simple_query_string": {
          "query": "elasticsearch -kibana",
          "fields": ["content"],
          "default_operator": "and"
        }
      }
    }

二、词项级查询 (Term-level Queries)

这类查询用于精确匹配未经分词的精确值,如数字、日期、关键字(keyword),不进行评分(只关心是否匹配),通常用于过滤。

  1. exists

    • 功能:查找包含指定字段(且该字段值不为 null 或空数组)的文档。

    json

    {
      "query": {
        "exists": {
          "field": "user"
        }
      }
    }
  2. prefix

    • 功能:查找在指定字段中包含以给定前缀开头的词项的文档。

    json

    {
      "query": {
        "prefix": {
          "user": "ki" // 匹配 "kimchy", "kirk", 等
        }
      }
    }
  3. wildcard

    • 功能:使用通配符进行匹配。* 代表多个字符,? 代表一个字符。

    • 注意:通配符查询在大型索引上可能很慢,尽量避免以 * 或 ? 开头。

    json

    {
      "query": {
        "wildcard": {
          "user": "ki*y" // 匹配 "kimchy", "kirkby", 等
        }
      }
    }
  4. regexp

    • 功能:使用正则表达式进行匹配。功能最强大,但性能代价也最高。

    json

    {
      "query": {
        "regexp": {
          "user": "k[ie].*y"
        }
      }
    }
  5. fuzzy

    • 功能:匹配与搜索词项相似(允许一定程度的拼写错误/编辑距离)的文档。基于Levenshtein编辑距离。

    json

    {
      "query": {
        "fuzzy": {
          "user": {
            "value": "ki", // 可能会匹配 "kimchy", "kirk", "cie" 等
            "fuzziness": "AUTO"
          }
        }
      }
    }
  6. ids

    • 功能:根据文档的 _id 字段来查询文档。

    json

    {
      "query": {
        "ids": {
          "values": ["1", "2", "3"]
        }
      }
    }

三、复合查询 (Compound Queries)

这类查询可以将其它查询组合起来,实现复杂的逻辑。

  1. bool (这是最重要的复合查询)

    • 功能:将多个查询子句通过逻辑关系组合在一起。

    • 子句

      • must必须匹配,贡献得分 (AND)

      • filter必须匹配,但不贡献得分(性能更高,常用于过滤)

      • should应该匹配(满足其中一部分即可,与 minimum_should_match 参数配合使用)(OR)

      • must_not必须不匹配,不贡献得分 (NOT)

    json

    {
      "query": {
        "bool": {
          "must": [
            { "match": { "title": "elasticsearch" } }
          ],
          "filter": [
            { "range": { "date": { "gte": "2023-01-01" } } },
            { "term": { "status": "published" } }
          ],
          "must_not": [
            { "term": { "tags": "experimental" } }
          ],
          "should": [
            { "match": { "content": "performance" } },
            { "match": { "content": "scalability" } }
          ],
          "minimum_should_match": 1
        }
      }
    }
  2. boosting

    • 功能:返回匹配 positive 查询的文档,但同时降低也匹配 negative 查询的文档的得分。

    json

    {
      "query": {
        "boosting": {
          "positive": {
            "match": { "text": "apple" }
          },
          "negative": {
            "match": { "text": "pie" }
          },
          "negative_boost": 0.5 // 匹配 negative 子句的文档,其得分会乘以 0.5
        }
      }
    }

四、地理查询 (Geo Queries)

用于基于地理坐标的搜索。

  1. geo_distance

    • 功能:查找距离某个中心点一定距离内的所有文档。

    json

    {
      "query": {
        "geo_distance": {
          "distance": "200km",
          "pin.location": {
            "lat": 40,
            "lon": -70
          }
        }
      }
    }
  2. geo_bounding_box

    • 功能:查找位于一个矩形框内的所有文档。

    json

    {
      "query": {
        "geo_bounding_box": {
          "pin.location": {
            "top_left": {
              "lat": 40.73,
              "lon": -74.1
            },
            "bottom_right": {
              "lat": 40.01,
              "lon": -71.12
            }
          }
        }
      }
    }

五、特殊查询 (Specialized Queries)

  1. script

    • 功能:使用脚本(如 Painless)来自定义查询逻辑,功能极其强大,但性能开销大。

    json

    {
      "query": {
        "script": {
          "script": {
            "source": "doc['price'].value > params.threshold",
            "params": {
              "threshold": 100
            }
          }
        }
      }
    }
  2. percolate

    • 功能反向查询。不是根据查询找文档,而是根据文档(存储的查询)找哪些查询会被该文档匹配。常用于告警系统或内容推荐(“为我保存这篇文章”)。

六、跨度查询 (Span Queries)

用于非常精确地控制词项的顺序和位置关系,常用于法律或专利文档的高精度检索。

  • span_nearspan_termspan_first 等。

总结

类别常用查询用途
全文检索multi_matchmatch_phrasequery_string在文本中搜索关键词或短语
词项级existsprefixwildcardfuzzy精确匹配、过滤、前缀/模糊搜索
复合查询bool (最重要)组合多个查询,实现 AND/OR/NOT 逻辑
地理查询geo_distancegeo_bounding_box基于地理位置搜索
特殊查询scriptpercolate自定义脚本逻辑、反向查询

bool 复合查询是构建复杂、高效 Elasticsearch 搜索功能的关键。bool 查询的 filter 上下文因其不计算得分和可缓存的特点,被广泛用于提高查询性能。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值