• Elasticsearch系列(5):深入搜索


    结构化搜索

    结构化搜索是指搜索那些具有内置结构数据的过程,比如日期,时间和数字都是结构化的,它们有精确的格式,我们可以对这些格式进行逻辑操作,比较常见的操作包括比较数字或时间的范围,或判定两个值的大小。

    在结构化搜索中,我们得到的结果总是非是即否,要么存在于集合之中,要么存在于集合之外,结构化查询不关心文件的相关度或评分,它简单的对文档包括或排除处理。

    这在逻辑上是能说通的,因为一个数字不能比其它数字更适合存在于某个相同的范围,结果只能是:存在于范围之中,抑或反之,同样,对于结构化文本来说,一个值要么相等,要么不相等,没有更似这种概念。

    当进行精确值搜索时,我们会使用过滤器(filter),过滤器很重要,因为它们执行速度非常快,不会计算相关度(直接跳过了整个评分阶段)而且很容易被缓存,所以,要尽可能多的使用过滤器搜索。

    一,精确值搜索

    说到精确值搜索,一定会使用到term查询,它可以处理数字(number),日期(date),布尔值(bool)和文本(text)。

    1,term查询数字

    比如,我要查询价格为20元的所有产品,我们可以使用term查询来实现需求,查询语句为:

    GET /my_store/products/_search
    {
      "query": {
        "term": {
          "price": {
            "value": "20"
          }
        }
      }
    }

    通常当查找一个精确值的时候,我们不希望对查询进行评分计算,只希望对文档进行包括或排除的计算,所以我们会使用constant_score查询以非评分模式进行term查询并以1作为统一评分,使用constant_score之后的查询语句为:

    GET /my_store/products/_search
    {
      "query": {
        "constant_score": {
          "filter": {
            "term": {
              "price": "20"
            }
          }
        }
      }
    }

    从以上查询语句可以总结出:

    • 通常使用constant_score将term查询转化为过滤器filter。
    • 查询置于filter语句内还进行评分和相关度的计算,所有的结果都会返回一个默认的评分1。

    2,term查询文本

    term查询文本和查询数字一样容易,比如,我们要查询ID为’XHDK-A-1293-#fJ3’的产品,查询语句为:

    GET /my_store/products/_search
    {
      "query": {
        "constant_score": {
          "filter": {
            "term": {
              "productID": "XHDK-A-1293-#fJ3"
            }
          }
        }
      }
    }

    注意:

    如果文本中带有元字符(比如连字符-和哈希符#),默认是查询不出任何结果的,原因是索引数据的方式不同,productID被拆分成了多个更小的token。为了避免这种问题,我们需要告诉es该字段具有精确值,要将其设置成not_analyzed无需分析的,再去查询就能得到正确的结果了。

    二,组合过滤器

    前面的例子都是单个过滤器(filter)的使用方式,但是在实际业务场景中,我们很有可能会过滤多个值或字段,这个时候就会用到布尔过滤器。

    1,布尔过滤器

    一个bool过滤器由三个部分组成:

    {
       "bool" : {
          "must" :     [],
          "should" :   [],
          "must_not" : [],
       }
    }

    must:表示所有的语句都必须匹配,相当于sql里的and。

    must_not:表示所有的语句都不能匹配,相当于sql里的not。

    should:表示至少有一个语句要匹配,相当于sql里的or。

    注意:

    一个bool过滤器的每个部分都是可选的,而且每个部分内容都可以只有一个或一组过滤器。

    比如,我们要查询价格为20元同时productID为“XHDK-A-1293-#fJ3”,且价格不为30元的产品,使用布尔过滤器的查询语句为:

    GET /my_store/products/_search
    {
       "query" : {
          "filtered" : { 
             "filter" : {
                "bool" : {
                  "should" : [
                     { "term" : {"price" : 20}}, 
                     { "term" : {"productID" : "XHDK-A-1293-#fJ3"}} 
                  ],
                  "must_not" : {
                     "term" : {"price" : 30} 
                  }
               }
             }
          }
       }
    }

    注意:

    • 需要使用filtered查询将所有的东西包起来。
    • 在should语句块里面的两个term过滤器与bool过滤器是父子关系,两个term条件需要匹配其一。
    • 在must_not语句块里,如果一个产品的价格是30元,那么它会自动被排除,因为它处于must_not语句里面。

    2,嵌套布尔过滤器

    //filtered不被支持???

    三,查找多个精确值


    四,范围


    五,处理NULL值



    全文搜索

  • 相关阅读:
    while循环和递归
    ASP.NET Core Swagger 显示接口注释
    ABP依赖注入
    EF Core 笔记
    .NET Core 管道过滤器扩展
    ABP权限认证
    552 you must authentication
    C# 多线程写文件,时常写不成功
    .Net 的一些插件
    多线程下HttpContext.Current 的问题
  • 原文地址:https://www.cnblogs.com/mcgrady/p/9040009.html
Copyright © 2020-2023  润新知