Elastic中DSL语法整理

  1. Elasticsearch是一个基于Lucene库的开源搜索和分析引擎,设计用于云计算中,能够达到实时搜索,高可用,扩展性和管理的要求。
    • 索引(Index): 一个索引是一个文档的容器,类似于关系型数据库中的数据库概念。
    • 文档(Document): 一个文档是一个可被索引的基本信息单元,类似于关系型数据库中的一行记录。
    • 类型(Type): 在Elasticsearch 6.0.0及以上版本中,一个索引可以有多个类型,每个类型存储不同字段的文档。在Elasticsearch 7.0.0及以上版本中,类型的概念被移除。
    • 节点(Node): 一个Elasticsearch实例,可以是一个独立的服务器或者容器。
    • 集群(Cluster): 由多个节点组成的网络,它们共享数据并同步搜索请求。
    • 分片(Shard): 一个索引可以被分成多个分片,分布在不同的节点上存储和搜索。
    • 副本(Replica): 分片的副本,用于高可用性和提高搜索性能。
    • 分析器(Analyzers): 文本分析器,用于处理文本字段,例如分词、去除停用词等。
    • 映射(Mapping): 定义文档的字段名和字段类型的规则。
    • 搜索(Search): 基于查询条件,搜索和返回相关文档的过程。
  2. Elastic的知识点整理:
    • 正序索引,反向索引:在es的全文搜索中,也包括常规数据库的搜索通常都是通过key找到value的方式去查询对应的数据,key对应table中的列,这被称为正序索引,反向索引也被称为倒排索引,顾名思义其是由value的值去查询数据,而不是通过key去查询。这在全文搜索特别是关键字推荐中及其好用,比如在外卖中查询鸡排饭时候通过鸡和鸡排去查询数据并根据其相关度进行推荐,此时试用反向索引及其方便。
      • 反向索引的名词解释:
        • 词条:term,terms,es中最小的存储单元,全文搜索的时候es的数据存储会通过分词器将数据每一个单次切分存储,英文通常是一个词,中文通常是分词后的一个词(可以指定分词算法)。
        • 词典:词条的组合,搜索引擎的通常索引单位是单词,单词词典是文档集合中出现过的所有单词构成的字符串集合,单词词典内每条索引项记载单词本身的一些信息以及指向倒排所有的指针。
        • 倒排表:一个文档通常由多个词组成,倒排表记录的是某个词在哪些文档里出现过及出现的位置。每个记录称为一个倒排项(Posting),倒排表记录的不单单是文档编号,还记录了词频等信息(反向索引则是通过词条查询对应的指针进而查询对应的条目)
        • 倒排文件:所有单词的倒排列表往往顺序地存储在磁盘的某个文件里,这个文件被称之为倒排文件,倒排文件是存储倒排索引的物理文件。
      • es的反向索引分为两部分:数据存储和数据查询。
        • 数据的存储: 文档的存储的时候会先通过分词器分词,分词后将多文档每一个词的信息及其指针(词典是存放在内存中,顺序存储。所以每一个词都有一个对应的指针)生成一个词典 ,并将每一个词和词在各个文档中的位置(对文档进行排列,此处记录的是文档的位置)整理称为倒排表,并将所有的倒排表存放到倒排文件中(外存储文件)。
        • 数据的查询:根据要查询的词条去词典中查询查询到词条对应的信息和指针,然后根据这个词条的信息和指针去倒排表中查询对应的文档(value的值通过es的反向索引机制反查文档,通过这种机制可以简化词条的模糊匹配,也可以提升查询的效率),具体的查询语法参考下面的查询整理。
  3. 在当前的数据统计平台,特别是公司的大量数据平台中直接查询数据源库会很慢,所以可以将数据灌倒es中去,es可以看做一个数据库的快速查询插件,同样存在数据的增删改查,在使用过程中更多的是数据快速查询,对于其他三项通常是结合其他的逻辑进行处理(比如结合后端接口先将数据写入后端的redis或者数据库甚至文件中去,然后在通过脚本将其读出写入es中去(增改),对于删除一般数据不会删除,若删除则是通过脚本对其进行删除即可),此处的着重点是对其进行查询整理,用于统计,es的查询支持sql语句和DSL的查询,此文章着重整理DSL的查询语法:
    • es的数据查询:查询上下文(query)和过滤上下文(filter)
      • 在查询上下文中使用的查询子句回答了问题“此文档与此查询子句匹配程度如何?”除了决定文档是否匹配之外,查询子句还计算一个得分( _score )表示文档相对于其他文档的匹配程度,每当将查询子句传递给 query 参数(例如,search API中的 query 参数)时,查询上下文都有效。
      • 在过滤器上下文中,查询子句回答问题“此文档是否匹配此查询子句?”答案是一个简单的是或否——不计算得分。 过滤器上下文主要用于过滤结构化数据。
      • 简单理解就是查询上下文提供对应的查询条件,过滤上下文提供对应的过滤条件,对查询到的数据起到过滤的作用。
  4. es中的查询DSL关键字整理:下面是对其查询关键字的整理:
    • 查询语法中的关键字整理:
       基础DSL查询语言:
       {
         "query": {     // 查询的字段 类同于 where
             "match_all": {} // 匹配所有的即where为null
           },
         "from": 0,    // 从第几条文档开始查 from
         "size": 5,    // 取前五条 limit
         "_source":["balance"], //查询获取的列,可以多列,用,分割
         "sort": [  //排序关键字
                     {
                       "account_number": {  // 返回结果按哪个列排序
                       "order": "desc"    // 降序 order 固定写法
                         }
                     }
                   ]
       }
      备注:size:查询的每一页显示的数量,当前为5则说明此次查询获取5条数据,可以写为0,当前为0则是当次主查询的数据数量为0即不显示当次查询的详细结果(size设置为0表示我们不需要返回文档,只需要聚合结果),可以结合下面的聚合查询去处理,聚合查询可以根据聚合条件去设置不同的size,聚合设置size表示获取聚合后的数据数量。
           sort:排序,默认是降序desc,多字段排序,即可以写多个字段,字段间通过,分割先按照前面的字段排序,排序相同按照后面的字段排序。即
               {
                 ”query":{ 
                     ”match_all": { 
                       }
                 },
                 ”sort": [ 
                     {”create_time": { ”order": ”asc" }},
                     {”age": { ”order": ”desc" }}
                 ]
               }
           sort排序可以对一个字段的多值进行排序,即当前字段查出多个值,排序按照其平均数或者其他的聚合函数来排序,即(按照查询条件查询出来多值然后按照指定值的聚合函数进行排序,前提是值存在聚合,下面是按照创建时间的最小值进行排序):
              {
                 ”query":{ 
                     ”match_all": { 
                       }
                 },
                 ”sort": [ 
                     {”create_time": { ”order": ”asc","mode":"min/svg" }}
                 ]
               }
       //DSL中常见的关键字整理:
       match:匹配列的值是字符串:全文匹配包含字符串的行,匹配列的值非字符串则是精确匹配。
       match_phrase:匹配的值是字符串,多字符串不拆分,作为整体匹配且完全匹配上才算匹配。
       multi_match:多字段匹配,即同时匹配多个字段(此时字段是或的关系,只要一个字段能够匹配上即可),如:
       {
           "query": {
                 "multi_match": {  # 前面的match仅指定了一个字段。
                         "query": "Mill",
                         "fields": [ # state和address有mill子串  不要求都有
                               "state",
                               "address"
                                      ]
                           }
              }
         }
      
       term:类同于match的非text的匹配,同样是精确匹配,需要注意的是text的匹配不要使用term,试用match去处理,term处理的精确值可以是数字,时间,boolean或者未分词的字符串。
       terms:同term,不同的是次关键字可以指定多个值。
       terms_set:同terms,可以通过关键字minimum_should_match_field指定文档必须匹配到terms的几项进行过滤,required_matches:最小项,有一项复合即可以。
       match和term的区别;
            * 针对非text类型的匹配,二者基本相同,对于text类型二者是不同的,term是精确匹配,即不会分词,match则会分词,即多个词语的时候,match会分词去匹配。
       {
         "query": {
               "terms": {
               "title": ["love", "China"]
                 }
           }
       }
      // terms_set 案例:
      {
       "query": {
             "terms_set": {
                 "field": {
                     "terms": [ "a", "b", "c" ],
                     // 通过此字段控制文档必须匹配的项数,可以是数字,下面关键字是1,复合一项就可以
                     "minimum_should_match_field": "required_matches"
                   }
               }
             }
           }
      boost:为要查询的字段设置权重,此权重能够影响当前字段在此次查询中的影响度,由于es会给每一个查询到的文档打一个匹配度分数,多条件查询es会对多个条件综合打分,此时就可以在查询条件中对于某一个查询词条进行设置权重,或者每一个都设置权重。
       {
         "query": {
             "match_all": {
                 "boost": 2 //对匹配所有设置权重,都乘以2,单纯这个查询个人感觉无意义,原本所有又都同时扩展2倍
               }
         }
       }
       {
         "query": {
             "bool": {
               "should": [
                   { "match": { "title": { "query": "Elasticsearch", "boost": 2 } } },
                   { "match": { "content": "Elasticsearch" } }
                 ]
               }
             }
           } //此时查询中Title的影响排名和分数都扩展2倍
      aggs:聚合查询:对索引(es的索引可以看做数据库表的表)的查询通常不是单独的一项处理,可能查询,排序,分组,去重等几项同时处理。聚合提供了从数据中分组和提取数据的能力。最简单的聚合方法大致等于SQL Group by和SQL聚合函数。在elasticsearch中,执行搜索返回this(命中结果),并且同时返回聚合结果,把以响应中的所有hits(命中结果)分隔开的能力。这是非常强大且有效的,你可以执行查询和多个聚合,并且在一次使用中得到各自的(任何一个的)返回结果,使用一次简洁和简化的API啦避免网络往返。语法:
      "aggs":{ # 聚合
           "aggs_name":{ # 这次聚合的名字,方便展示在结果集中 随便起
                 "AGG_TYPE":{ # 聚合的类型(avg,term,terms)
                   } 
          }
       }
         备注:
           * 聚合是针对此次查询结果进行聚合的,操作的是主查询的数据结果
           * 聚合可以写多个,每一个聚合都会产生自己的结果集
      aggs:聚合查询可以存在子聚合查询,即在聚合查询中写聚合查询,此时子聚合查询的结果集相当于聚合查询的一个列元素。甚至复杂的聚合到多层聚合。
      range:取值范围,相对于时间或者值类型的字段,可以通过range取其特殊段范围内的数据。gt:>,gte:>=,lt:<,lte:<=。
       {
         "query": {
         "range": {
             "price": {
                 "gte": 1000,
                 "lte": 2000
               }
         }
       }
      }
      
      // DSL中的去重聚合操作(通过聚合cardinality,collapse,top_hits进行去重处理):
       {
         "size": 1,
         "_source": {
           "includes": ["设置需要的返回字段"],
           "excludes": []
         },
       "query": {
         "bool": {
           "设置查询条件": "使用term/terms/filter等"
           }
         },
       "aggregations": {
         "cardinality_field": {
             "cardinality": {  //单字段去重
                 "field": "设置根据哪个字段进行去重"
           }
         }
             //多字段去重
             "cardinality": {
                 "fields": ["field1", "field2"],
                 "precision_threshold": 40000
             }
       }
      }
       //通过聚合collapse进行去重处理
         {
           "size": 100,
           "query": {
             "设置查询条件"
           },
           "collapse": {
             "field": "orderId"
           }
         }
      
      
  5. Elastic中DSL的查询语句整理:DSl语句则是以json格式组建整个查询语句,使用其search接口对语句进行查询获取对应的数据,ElasticsearchHelper::search("l_stat_userday", $es_config):在php中es的查询语句,参数一是指名查询的索引名字,参数二是指名es的的配置。es的查询分为:all查询,复合查询,全文搜索,join查询,术语查询,地理位置查询,span查询,下面分章节去整理es这些查询机制:当前章节重点整理全匹配和复合查询和join查询和术语查询(术语查询结合在复合查询和全文搜索中解释说明)。
    • all查询:这个很简单,结合上面的关键字和下面的复合查询,全查询即获取所有的数据,语法:
       {
          "query": {
              "match_all": {
                  "boost": 2 //对匹配所有设置权重,都乘以2,单纯这个查询个人感觉无意义,原本所有又都同时扩展2倍
                }
          }
        }
      
    • 复合查询:复和查询即多条件查询,等于数据库sql语句中的and和or串联查询条件,在复合查询中bool查询实现多条件查询,其他的Constant Score,Dis Max,Function Score,Boosting, Indices等几项是影响bool查询的文档排序及其相关度的(通常是修改其文档匹配分数进行结果文档排序)。
      • bool查询:
         must: 等价于sql语句where中的 and:即查询文档must的条件必须满足
         should:等价于sql语句where中or:即查询文档should中的条件可以满足
             * query中没有其他几项条件即仅有should条件时,查询文档必须满足should中的一个条件。
             * 在must,must not条件的基础上,should不会影响最终的查询文档数量,只是不满足should条件的文档得分会降低,排序向后。
         must not:等价于sql语句where中的!:即查询文档must not中的条件必须不满足
         filter: 对查询后的文档进行过滤,起到筛选的过程。
           {
             "query": {
                 "bool": {
                   "must": [
                       { "match": { "title": "War and Peace" }},
                       { "match": { "author": "Leo Tolstoy" }}
                   ],
                  "should": [
                       { "match": { "translator": "Louise Maude" }}
                   ]
                 }
               }
             }
         备注:文档必须匹配title字段中的"War and Peace"以及author字段中的"Leo Tolstoy"。如果还有文档
               同时匹配translator字段中的"Louise Maude",那么这些文档会得到更高的得分。这个查询示例展
                 示了如何使用bool查询来结合must(所有的)和should(至少一个)子句
        
        // 嵌套查询:使用关键字nest进行嵌套
        {
         "query": {
             "nested": {
                 "path": "address",
                 "query": {
                     "bool": {
                         "must": [
                           { "match": { "address.city": "New York" } },
                           { "match": { "address.zipcode": "10001" } }
                           ]
                         }
                       }
                     }
                   }
                 }
        
         // 使用脚本进行查询:关键字 script
         {
           "query": {
             "script": {
               "script": {
                   "source": "doc['field1'].value > params.value",
                   "params": {
                       "value": 10
                    }
                  }
               }
             }
           }
        
        
    • 通过修改文档得分进而修改文档的最后顺序的几种查询方式:Constant Score查询,Function Score查询 Dis Max查询
      • Constant Score:针对查询仅关注查询到的文档列表,不关心文档列表之间的得分和文档之间的输出排列顺序的时候,可以使用这个查询,将其得分统一设置为一个常量,此时输出的查询后的文档没有得分之间的排列。
        • 使用场景:过滤查询结果(单纯的过滤结果,不关心得分)不关心文档得分
        • 语法结构:
        GET /index_name/_search
         {
           "query": {
                 "constant_score": {
                       "filter": {
                           "match": { "field_name": "value" }
                         },
                       "boost": 1.2  // 可以设置不同的评分值
                 }
             }
           }
        
      • Dis Max: 针对组合查询的场景,可以将每个查询后的文档组合到一起且通过关键字tie_breaker指定得分的权重和查询后文档得分计算得到分数作为文档的分数,且不同的文档的得分不同(针对每一个查询条件都会有得分,此处配置则是取最高分或者根据权重计算最后得分),分数的计算为。
        • tie_breaker:权重,范围是0和1,
          • 0:查询取得的文档的最高分为最终的文档分数(文档的每一个条件得分取最高分)
          • 1:查询取得的文档的分数加权平均后的分数为最终的文档分数(针对文档的没一个条件的得分)
          • 0~1: 利用下面算法计算所得的分数作为文档的最终分数
            new_score = (max_score_from_subqueries + (sum_of_other_subscores * tie_breaker_value)
            新分数 = (最高分数+(其他条件所有分数的和*权重))
              GET /_search
              {
                 "query": {
                     "dis_max": {
                          "queries": [
                               { "term": { "title": "Quick pets" } },
                               { "term": { "body": "Quick pets" } }
                               ],
                           "tie_breaker": 0.7
                         }
                       }
                      }
              备注:查询title和body的所有文档后合并并通过上面的计算算法计算最终的分数给到每一个文
                的最终分数。
            
      • Function Score:和上面两个一致,也是通过修改分数得到最终文档分数且排序,不同的是用户自定义函数进行最后分数的修改,即最后查询到的文档得分通过用户指定的规则或者用户指定的函数计算。 使用 function_score ,用户需要定义一个查询和一个或多个功能,即计算用于由查询返回的每个文档的新得分。
        • 此时查询的文档存在查询得分和函数计算得分两个,此二者可以通过boost_mode进行组合得到文档的最新得分。是否取代查询得分取决于boost_mode的配置。
         //单函数查询案例:
         //针对所有的查询,通过随机分数乘以文档查询得分及其加权值5计算最终所得的分数
         {
           "query": {
                 "function_score": {
                     "query": { "match_all": {} }, //对象
                     "boost": "5", //加权值:加权值和文档的查询得分
                     "random_score": { "seed": number }, //函数,此为随机函数
                     "boost_mode":"multiply" //函数和文档的查询得分如何操作,此为乘积
                     }
                   }
                 }
         // 针对多函数案例:score_mode: max标明各个函数的得分最终取大,boost_mode: multiply标明文档最终的函数得分与查询得分和加权值取乘得到最终的结果分数。
        {
         "query": {
        "function_score": {
        "query": { "match_all": {} }, //对象
        "boost": "5", //加权值:加权值和文档的查询得分
        "functions": [ //函数,多函数
           {
               "filter": { "match": { "test": "bar" } },
               "random_score": {}, //注释2
               "weight": 23
           },
           {
               "filter": { "match": { "test": "cat" } },
               "weight": 42
           }
        ],
        "max_boost": 42, //自定义函数的最终分数不能超过此分数
        "score_mode": "max", //由于多函数,文档最终函数得分如何计算,此为取大,即符合每一个函数的函数得分的最大值为当前文档的函数得分。
        "boost_mode": "multiply", //函数和文档的查询得分如何操作,此为乘积
        "min_score" : 42 //最终文档的最低分数不能小于42 
        }
        }
        }
        备注:针对上面案例进行关键字解释及其可以存在的值情况:
        score_mode: 针对多函数的一个参数,对于多函数中每个函数计算所得分数,此参数标明如何通过每个分数操作计算最终的文档函数分数。
           * multiply:乘积:多函数分数乘积后的值为文档最终函数分数
           * sum:求和 
           * avg:求平均数
           * first:第一个函数的值
           * max/min:最大/最小函数值
        weight:权重,针对每一个函数都可以指定其对应的权重,没有特殊指定的时候,函数得分即函数得分和权重乘积关系,但是当score_mode指定为avg的时候:(a+b)/ (a_weight+b_weight),此时两个函数并不是1:1的关系而是两个权重想加的关系。
        boost_mode:文档查询得分和函数得分两者如何计算得到当前文档的得分。
           * multiply:乘积:多函数分数乘积后的值为文档最终函数分数
           * sum:求和 
           * avg:求平均数
           * replace:仅使用函数得分,即函数得分替换掉查询得分
           * max/min:最大/最小函数值
        boost:文档查询得分占的比重或者加权,计算文档得分的时候试用查询得分和这个比重的乘积。
        max_boost:函数得分的最大分数,即函数得分最大不能超过这个分数。
        min_score: 整个文档得分的最小分数
        
        // function_score 查询提供的几种函数分数的类型
        script_score查询:用户自定义脚本参数进行最后函数分数的计算,即:其语法分为两部分第一部分指定查询
           文档的条件,第二部分指定分数重新计算的脚本及其脚本参数等。
           {
             "query": {
               "script_score": { //注意此处的关键字不是bool
                   "query": {
                         "match": { "field1": "value1" }
                     },
                   "script": {  //指定计算分数的脚本
                         "source": "_score * doc['field2'].value * params.factor", 
                         //_score:基于当前的查询所得查询得分
                         "params": { //指定上面脚本的参数
                               "factor": 1.5
                           }
                     }
                   }
                 }
              }
         weight查询:即上面的weight关键字,通过weight修改函数的得分比重。
         random_score查询:如上代码案例,通过随机函数给函数计算得分,根据 __uid_ 字段进行 hash 计算生成分数,可根据 seed 发生改变,如果 seed 未指定,当前时间被使用(可以通过seed指定随机,若不指定以当前的时间进行随机)
         field_value_factor查询:通过查询到的字段的值结合其他函数公式计算当前文档的函数得分,这个和前面的脚本script查询很相似,都可以使用查询到的字段,但是使用这个可以避免写脚本和脚本的开销。
         "field_value_factor": {
               "field": "popularity",
               "factor": 1.2,
               "modifier": "sqrt",
               "missing": 1
           }  
         备注:此查询内部的几个参数关键字的描述:
             field:查询后文档中的字段
             factor:与字段值(field)相乘的可选系数,默认为1,可以不设置
             modifier:字段的函数公式,用上面两个指定的参数计算的数学公式,包括值:none(不指定,field*factor),log(对数),log1p,log2p(对数),in,in1p,in2p,square,sqrt(开平方)等数学公式。
             missing:如果文档没有该字段,则使用此值。 修饰符和因子也使用此值,如同从文档中读取的字段一样使用,算是filed的一个默认值。
        
    • Boosting 查询:将bool查询替换为boosting查询,其分为主查询和副查询两种,通过主查询条件查询到对应的文档(主查询此时相当于原有的bool查询),查询后获取到的文档再经过副查询,符合副查询条件的文档条目得分会根据副查询的权重计算后下降,相应的排序也就向后面了,类似于过滤filter,但是和过滤filter不同的是其不会过滤掉对应的文档条目只是将符合的文档条目移动到后面去。调整算法:将主查询positive中的得分和副查询negative中的得分乘积作为最终的得分从而降低其得分。
GET /stu/_search
{
  "query": {
    "boosting": {
      "positive": {
        "match\_phrase": {
            "name": {
              "query": "张三",
              "\_name": "name"
            }
          }
      },
      "negative": {
        "term": {
            "age": {
              "value": "30",
              "\_name": "age"
            }
          }
      },
      "negative\_boost": 0.2
    }
  }
}

  • 复合查询中几种特殊的查询:type查询,非空值(exists)查询,ids查询,范围查询
    • type查询:通过给定的类型进行查询,比如查询文档类型,此查询在es7.0以后已经被去除不再使用。
    • exists查询:非空值查询,即查询文档中包含给定字段且给定字段不为空。
       {
         "query": {
             "exists": {
                "field": "field1"
                 }
               }
            }
      
    • ids查询:通过索引中的ids进行查询,且查询给定ids的值的文档,每个索引中都有唯一的id,等同于where id in ().
        {
          "query": {
              "ids": {
                 "values": ["1", "2", "3"]
                 }
               }
             }
      
    • 范围range查询,上面关键字中已经对其进行介绍此处是对其进行扩展:主要是range中日期的查询:语法格式基本一致,不同的是在日期查询中可以指定日期的格式和日期的时区。
        GET /my_index/_search
        {
          "query": {
                "range": {
                    "post_date": { // 假设post_date是日期类型字段
                        "gte": "2022-01-01", // 大于等于2022年1月1日
                        "lte": "2022-12-31", // 小于等于2022年12月31日
                        "time_zone":"+01:00",
                        "format": "yyyy-MM-dd" // 如果日期不是标准的Unix毫秒时间戳,需指定日期格式
                          }
                      }
                    }
                }
      
  1. es查询中的要点:全文搜索
    • match相关在关键字中有所整理,此处对其进行扩展整理:
      • zero_terms_query:没明白,看解释是查询某个字段没有文档时候也把查询到的文档返回????不理解什么意思。
      • 高低频(cutoff_frequency):common查询会把查询语句分成两个部分,较为重要的分为一个部分(这个部分的token通常在文章中出现频率比较低),不那么重要的为一个部分(出现频率比较高,以前可能被当作停止词),然后分别用low_freq_operator、high_freq_operator以及minimum_should_match来控制这些语句的表现。
        在进行查询之前需要指定一个区分高频和低频词的分界点,也就是cutoff_frequency,它既可以是小数比如0.001代表该字段所有的token的集合里面出现的频率也可以是大于1的整数代表这个词出现的次数。当token的频率高于这一个阈值的时候,他就会被当作高频词。
      GET /_search
      {
      "query": {
         "common": {
             "body": {
                 "query": "nelly the elephant as a cartoon", //需要查询的短语,会拆分为高频和低频
                 "cutoff_frequency": 0.001, //比率超出文档的0.1%为高频词
                 "low_freq_operator": "and" //针对低频词要做的操作,此为低频词查询的&&操作
               }
           }
         }
       }
      备注:二次查询,一是根据高频词先查询匹配的文档,二是结合低频词的匹配程度进行文档得分计算。
      
    • 模糊查询( fuzzy query):
         {
           "query": {
               "fuzzy" : {
                   "user" : {  //模糊匹配的字段
                        "value" :  "ki",  //模糊匹配的字段的值
                        "boost" :         1.0, //得分计算的权重
                        "fuzziness" :     2, //模糊匹配的编辑距离或者编辑次数
                        "prefix_length" : 0, //不能模糊的字符设置,前置length前的字符必须完全匹配,不能够模糊。
                        "max_expansions": 100 //给定匹配的字段模糊出来字段词的最大限制。
                   }
                 }
             }
       }
       备注:
           * fuzziness:模糊匹配的编辑距离或者编辑次数,值仅有0,1,2三种情况,0:完全匹配不能有任何编辑,
               1:存在一次编辑即可以有一个字符差异,2:存在2次编辑即存在2个字符差异,可以直接赋值但是其并是
                 直接0,1,2,而是0..2为0,3..5为1 >5为2,默认auto:3,6:最低编辑和最高编辑为3和6 
                 由上可知,3和6是一次和两次编辑,即默认可以存在两次编辑即两个字符差异。
           * max_expansions:给定匹配的字段模糊出来字段词的最大限制,比如ki,可以存在zi,ai,bi,ka,kb等 不限制会加重查询的力度,此处可以对其进行设置合适的值,即查询中查询到模糊词的给定值的变体就不在模糊其他的变体,减少查询的力度提升查询的效率。
      
    • 前缀查询: prefix查询,顾名思义通过给定文本作为前缀进行查询:
      {
       "query": {
           //前缀查询
           "prefix" : { 
                "user" :  {  //字段
                     "value" : "ki",  //值
                     "boost" : 2.0  //加权权重
                 }
          }
      
           //前缀短语精确查询
           "match_phrase_prefix" : {
                 "message" : {
                       "query" : "quick brown f",
                       "max_expansions" : 10 //和上面一样最大匹配数量
                   }
                 }
             }
           }
      
    • 正则表达式查询:利用给定的正则表达式查询字段
    • 通配符查询:和sql中的like语句相似通过统配符进行查询,此两处对应的正则语法和通配符的语法不在一一描述,到时使用的时候去参考网站去查询整理即可。
    • 多字段查询:在文档的多个字段查询给定的值,和terms不同的是,terms是一个字段有多个值匹配,而此是在多个字段中查询匹配的值。
       {
       "query": {
           "multi_match" : {
                 "query":      "brown fox", //查询的值
                 "type":       "best_fields", //多字段匹配类型,不设置默认值是best_fields
                 "fields":     [ "subject", "message" ], //要查询的字段
                 "tie_breaker": 0.3 //权重
             }
           }
       }
      备注:
         type:best_fields,most_fields,cross_fields, phrase, phrase_prefix ???? 暂时做整理,
           到目前还没有搞明白意思。
         tie_breaker: 权重,结合上面的参数,也是模棱两可,等待后续完善,当前暂时整理一下自己的目前理解。
           0: 混合查询将使用组中任何字段返回的最佳分数
           1:使用组中任何字段返回的分数加和
           0~1:分数最佳+tie_breaker*其他返回分数的和sum
      
    • 查询语句查询:

参考文章:
DSL语言
DSL语言去重实现
熬夜爆肝整理的elasticsearch中文手册文档
ElasticSearch基础:从倒排索引说起,快速认知ES
Elasticsearch复合查询之Boosting Query
Elasticsearch(3) dis_max的使用
Elasticsearch 基本使用(三)条件查询_es条件查询
ES中如何进行日期(数值)范围查询
ElasticSearch学习笔记七:ES查询(二)
ES常用查询操作
elasticsearch 7.4 常用查询/搜索方式

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,919评论 6 502
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,567评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,316评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,294评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,318评论 6 390
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,245评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,120评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,964评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,376评论 1 313
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,592评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,764评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,460评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,070评论 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,697评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,846评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,819评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,665评论 2 354