目 录CONTENT

文章目录

【Elastic Search】 全文检索指南

EulerBlind
2025-07-01 / 0 评论 / 0 点赞 / 0 阅读 / 0 字
  1. 官方文档

    概述

    用于在多个字段上执行相同查询

    格式样例

    {
        "multi_match": {
            "query":                "Quick brown fox",    # 查询词
            "type":                 "best_fields",        # 匹配方式
            "fields":               [ "title", "body" ],  # 查询字段
            "tie_breaker":          0.3,                  # 多个字段的相关性
            "minimum_should_match": "30%",                # 匹配度
            "analyzer":             "standard",           # 分词器
            "operator":             "and"                 # 匹配逻辑
        }
    }
    

    点击并拖拽以移动

    参数解释

    • query : 查询词、句,

    • type :匹配方式,有三种方式可选

      • best_fields 最佳匹配 (默认类型,可不指定)

      • most_fields 多数字段匹配

        {
          "query": {
            "multi_match" : {
              "query":      "quick brown fox",
              "type":       "most_fields",
              "fields":     [ "title", "title.original", "title.shingles" ]
            }
          }
        }
        相当于
        {
          "query": {
            "bool": {
              "should": [
                { "match": { "title":          "quick brown fox" }},
                { "match": { "title.original": "quick brown fox" }},
                { "match": { "title.shingles": "quick brown fox" }}
              ]
            }
          }
        }
        

        点击并拖拽以移动

      • cross_fields 跨字段匹配

        • 所有的匹配词必须至少在一个字段中出现才会匹配(通常对boost为1的短字符串有用)
        • fuzziness参数不可和cross_fields一起使用
        {
          "query": {
            "multi_match" : {
              "query":      "Will Smith",
              "type":       "cross_fields",
              "fields":     [ "first_name", "last_name" ],
              "operator":   "and"
            }
          }
        }
        相当于
        +(first_name:will last_name:will)+(first_name:smith last_name:smith)
        

        点击并拖拽以移动

        {
          "query": {
            "multi_match" : {
              "query":      "Jon",
              "type":       "cross_fields",
              "fields":     [
                "first", "first.edge",
                "last",  "last.edge"
              ]
            }
          }
        }
        相当于
        blended("jon", fields: [first, last])
        | (
            blended("j",   fields: [first.edge, last.edge])
            blended("jo",  fields: [first.edge, last.edge])
            blended("jon", fields: [first.edge, last.edge])
        )
        

        点击并拖拽以移动

      • phrase 短语匹配,该方式下不会被分词。(该方式因为不会被分词,用于精确匹配)

      • phrase_prefix 前缀短语匹配

        {
          "query": {
            "multi_match" : {
              "query":      "quick brown f",
              "type":       "phrase_prefix",
              "fields":     [ "subject", "message" ]
            }
          }
        }
        相当于
        {
          "query": {
            "dis_max": {
              "queries": [
                { "match_phrase_prefix": { "subject": "quick brown f" }},
                { "match_phrase_prefix": { "message": "quick brown f" }}
              ]
            }
          }
        }
        

        点击并拖拽以移动

      • bool_prefix 指定为该方式,表明只希望查询到一个bool值

    • fields :需要查询的字段列表,默认最多给定 1024个 。

      • **给定字段本身支持模糊查询,如 **"fields": "*_title"
      • **可以指定每个字段的匹配权重,如 **"fields": [ "*_title", "chapter_title^2" ] ,其中chapter_title字段的boost为2,
    • tie_breaker:字段之间的相关度

      分数 解释
      0.0 从(例如)first_name:will 和last_name:will(默认)中取出单个最佳分数
      1.0 将(例如)first_name:will 和 last_name:will 的分数加在一起
      0.0 < n < 1.0 将单个最佳得分加上 tie_breaker 乘以其他匹配字段/组的每个得分
    • minimum_should_match :匹配阈值

    • operator :指定给定词之间的逻辑(默认使用的是or),具体示例如下
      对于如下匹配

      •
      目录
      ​
      间隔查询(Intervals)
      ​
      ​
      ​
      ​
      ​
      ​
      ​
      ​
      ​
      ​
      ​
      Match匹配
      ​
      ​
      ​
      间隔查询(Intervals)
      官方文档
      ​
      功能描述
      一种用于在文本字段中执行精确的短语匹配的高级查询方式,在该方式中,通过intervals的特殊数据结构,可以更精确控制匹配行为的场景,如要求匹配的短语具有特定的顺序或距离限制。
      ​
      结构示例
      {
        "query": {
          "intervals" : {
            "my_text" : {
              "all_of" : {
                "ordered" : true,
                "intervals" : [
                  {
                    "match" : {
                      "query" : "my favorite food",
                      "max_gaps" : 0,
                      "ordered" : true
                    }
                  },
                  {
                    "any_of" : {
                      "intervals" : [
                        { "match" : { "query" : "hot water" } },
                        { "match" : { "query" : "cold porridge" } }
                      ]
                    }
                  }
                ]
              }
            }
          }
        }
      }
      查询解释:
      ​
      查询字段名称为 "my_text"。
      使用 "all_of" 子句,表示要求所有指定的间隔匹配
      "ordered" 参数设置为 true,表示要求短语的间隔按照指定的顺序出现
      第一个间隔是 "my favorite food",要求该短语的间隔没有任何间隔(max_gaps: 0)且按照指定的顺序出现(ordered: true)
      第二个间隔使用 "any_of" 子句,表示至少要有一个间隔匹配。在这个例子中,有两个候选短语:"hot water" 和 "cold porridge"。只要有一个短语的间隔满足条件即可。
      参数解释
      参数名称  参数描述
      match match 匹配
      prefix  前缀匹配
      wildcard  通配符匹配
      fuzzy 模糊匹配
      all_of  所有指定间隔匹配,给定匹配中必须都要满足
      any_of  存在一个指定间隔匹配,给定匹配中只需要满足一个
      Match匹配参数
      参数名称  是否必要  参数类型  参数描述  默认参数
      query 是 str 查询词/句 
      max_gaps  否 int 匹配词之间的最大间隔数,如果未指定或设置为 -1,则匹配没有宽度限制。 如果设置为 0,则这些术语必须相邻出现。  -1
      ordered 否 bool  是否需要保证顺序出现  false
      analyzer  否 str 指定分词器类型 默认为顶层分词器类型
      filter  否 interval filter rule object 使用interval filter 进行过滤  
      use_field 否 str 指定匹配方式 postings:指定倒排索引匹配 doc_values: 使用文档的doc_values匹配 freqs: 使用词频匹配 positions: 使用词项的位置信息进行匹配 
      Prefix 匹配参数
      用于匹配指定前缀,前缀匹配词个数最多为128个。
      ​
      参数名 是否必要  参数类型  参数描述  默认参数
      prefix  是 str 指定前缀  
      analyzer  否 str 分词器 
      use_field 否 str 匹配方式  
      Wildcard匹配参数
      指定通配符进行匹配,最多扩展到128个匹配词。
      ​
      参数名 是否必要  参数类型  参数描述  默认参数
      pattern 是 str 匹配字符串 允许使用 [*?]进行匹配 *:任意个字符匹配,包括0 ?:单个字符匹配 避免使用 [*?] 匹配开头,会导致性能下降 
      analyzer  否 str 分词器 
      use_field 否 str 匹配方式  
      Fuzzy匹配参数
      跟据模糊规则匹配给定匹配词,最多128个匹配词。
      ​
      参数名 是否必要  参数类型  参数描述  默认参数
      term  是 str 匹配词 
      prefix_length 否 int 用于控制前缀长度  0
      transpositions  否 bool  控制词项交换参数,即是否允许词项交换(ab→ba) true
      fuzziness 否 str 最多进行模糊操作个数  auto
      analyzer  否 str 分词器 
      use_field 否 str 匹配方式,除非单独指定分析器,否则使用该字段中的搜索分析器对该术语进行规范化。 
      All_of
      参数名称  是否必要  参数类型  参数描述  默认参数
      intervals 是 匹配数组  具体匹配规则列表  
      max_gaps  否 int 匹配词之间的最大间隔数,如果未指定或设置为 -1,则匹配没有宽度限制。 如果设置为 0,则这些术语必须相邻出现。  -1
      ordered 否 bool  是否需要顺序出现  false
      filter  否 interval 规则对象 过滤器 
      Any_of
      参数名称  是否必要  参数类型  参数描述  默认参数
      intervals 是 匹配数组  具体匹配规则列表  
      filter  否 interval 规则对象 过滤器 
      Filter
      参数名称  是否必要  参数类型  参数描述  默认参数
      after 否 查询对象  用于返回过滤规则中某个间隔之后的间隔的查询 
      before  否 查询对象  用于返回过滤规则中某个间隔之前发生的间隔的查询 
      contained_by  否 查询对象  用于返回过滤规则中的间隔所包含的间隔的查询 
      containing  否 查询对象  用于返回包含过滤规则中的间隔的查询 
      not_contained_by  否 查询对象  用于返回过滤规则中的间隔未包含的间隔的查询 
      not_containing  否 查询对象  用于返回不包含过滤规则间隔的间隔的查询 
      not_overlapping 否 查询对象  用于返回与过滤规则中的间隔不重叠的间隔的查询  
      overlapping 否 查询对象  用于返回与过滤规则中的间隔重叠的间隔的查询 
      script  否 查询对象  用于返回匹配文档的脚本 
      Match匹配
      官方文档
      ​
      结构示例
      {
        "query": {
          "match": {
            "message": {
              "query": "this is a test"
            }
          }
        }
      }
      message: 字段名称 query:需要匹配的字段值
      ​
      参数详解
       
      参数名 是否必要  参数类型  参数描述  默认值
      query 是 str、int、.etc  需要匹配的字段值  
      analyzer  否 str 分词器 
      auto_generate_synonyms_phrase_query 否 bool  控制在查询时是否自动生成短语查询中的同义词 true
      fuzziness 否 str 模糊容忍度 “0”:精确匹配 “1“: 允许一个编辑操作。例如,插入、删除或替换一个字符 “2”: 允许两个编辑操作 ”auto”: 基于目标词的长度决定最大编辑距离。一般情况下,长度小于等于两个字符的词允许一个编辑操作,长度大于两个字符的词允许两个编辑操作。 ”2s": 允许两个编辑操作,但对较短的词应用了更严格的限制 
      max_expansions  否 int 控制查询时查询词展开的最大数量 适用于某些查询类型,如前缀查询(Prefix Query)和通配符查询(Wildcard Query) 50
      prefix_length 否 int 在模糊匹配中保留字符串开头的字符数 0
      fuzzy_transpositions  否 bool  是否允许交换词 true
      fuzzy_rewrite 否 str 指定查询的重写方法 
      lenient 否 bool  是否启用宽松模式,用于控制是否忽略格式错误。  false
      operator  否 str 指定bool运算的操作符 or: 给定词任意一个匹配即可 and: 给定词全部匹配才行 or
      minimum_should_match  否 str 指定返回最小匹配子句数,可给如下格式 1. 具体数值:必须匹配的最小子句数 2. 百分比值:表示根据总子句数计算的最小匹配子句数 3. "number" 或 "percentage" 加一个 "+" 号:表示匹配的子句数超过指定值 4. "number" 或 "percentage" 加一个 "-" 号:表示匹配的子句数少于指定值  
      zero_terms_query  否 str 零词查询,指定当分析器移除所有词项时是否返回文档 "none"(默认值):如果分析器移除了所有词项,则不返回任何文档。这意味着如果查询经过分析后不剩下任何词项,将不会有文档被返回 "all":返回所有文档,类似于使用"match_all"查询。即使查询经过分析后不剩下任何词项,也会返回所有文档 none
      •
      

      点击并拖拽以移动

      实际执行逻辑如下,即所有匹配词必须 同时满足到一个给定字段(区别于or,只需要满足一个匹配即匹配)

      (+first_name:will +first_name:smith) | (+last_name:will  +last_name:smith)
      

      点击并拖拽以移动

      组合字段查询(combined_fields)以及cross_fields模式可以打破单个字段限制

    • analyzer 指定分词器

0

评论区