Elasticsearch系列(5):深入搜索

Stella981
• 阅读 565

结构化搜索

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

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

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

当进行精确值搜索时,我们会使用过滤器(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值

全文搜索

点赞
收藏
评论区
推荐文章
Karen110 Karen110
3年前
一篇文章带你了解JavaScript日期
日期对象允许您使用日期(年、月、日、小时、分钟、秒和毫秒)。一、JavaScript的日期格式一个JavaScript日期可以写为一个字符串:ThuFeb02201909:59:51GMT0800(中国标准时间)或者是一个数字:1486000791164写数字的日期,指定的毫秒数自1970年1月1日00:00:00到现在。1\.显示日期使用
待兔 待兔
4个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
ElasticSearch深度分页详解
1前言ElasticSearch是一个实时的分布式搜索与分析引擎,常用于大量非结构化数据的存储和快速检索场景,具有很强的扩展性。纵使其有诸多优点,在搜索领域远超关系型数据库,但依然存在与关系型数据库同样的深度分页问题,本文就此问题做一个实践性
Peter20 Peter20
3年前
mysql like查询(模糊查询)
在结构化查询语言中,LIKE语句有着至关重要的作用。  LIKE语句的语法格式是:select\from表名where字段名like对应值(子串),它主要是针对字符型字段的,它的作用是在一个字符型字段列中检索包含对应子串的。  A:%包含零个或多个字符的任意字符串:1、LIKE'Mc%'将搜索以字母Mc开头的所有字符串(如M
Stella981 Stella981
3年前
Elasticsearch与Solr优缺点比较
Elasticsearch简介Elasticsearch是一个实时的分布式搜索和分析引擎。它可以帮助你用前所未有的速度去处理大规模数据。它可以用于全文搜索,结构化搜索以及分析,也可以将这三者进行组合。Elasticsearch是一个建立在全文搜索引擎ApacheLucene™基础上的搜索引擎,可以说Lucen
Wesley13 Wesley13
3年前
Java日期时间API系列31
  时间戳是指格林威治时间1970年01月01日00时00分00秒起至现在的总毫秒数,是所有时间的基础,其他时间可以通过时间戳转换得到。Java中本来已经有相关获取时间戳的方法,Java8后增加新的类Instant等专用于处理时间戳问题。 1获取时间戳的方法和性能对比1.1获取时间戳方法Java8以前
Stella981 Stella981
3年前
Python 转化成 PB 格式数据
一、概述ProtocolBuffers是Google公司开发的一种轻便高效的结构化数据存储格式,可以用于结构化数据串行化,或者说序列化。它很适合做数据存储或RPC数据交换格式。可用于通讯协议、数据存储等领域的语言无关、平台无关、可扩展的序列化结构数据格式。ProtocolBuffers简称为protobuf或pb,下面
Stella981 Stella981
3年前
LEADTOOLS 2020年发布最新版v21!
30年前,LEAD由MoeDaher和RichLittle创建,其愿景是通过易于使用的软件开发工具包提供创新技术,从而帮助开发人员构建更好的应用程序。跨越这个重要的里程碑,LEAD继续通过发布LEADTOOLS版本21来实现这一愿景。该版本以新的前沿库和功能(包括可自动搜索,查找并采取行动的智能文档分析器)突出显示。基于任何结构化或非结构化形式的感兴趣数
Stella981 Stella981
3年前
LEADTOOLS v21最新版发布:更新包括AI驱动的文档分析器和ICR引擎
30年前,LEAD由MoeDaher和RichLittle创建,其愿景是通过易于使用的软件开发工具包提供创新技术,从而帮助开发人员构建更好的应用程序。跨越这个重要的里程碑,LEAD继续通过发布LEADTOOLS版本21来实现这一愿景。该版本以新的前沿库和功能(包括可自动搜索,查找并采取行动的智能文档分析器)突出显示。基于任何结构化或非结构化形式的感兴趣数
Stella981 Stella981
3年前
LEADTOOLS 2020年发布最新版v21!!
30年前,LEAD由MoeDaher和RichLittle创建,其愿景是通过易于使用的软件开发工具包提供创新技术,从而帮助开发人员构建更好的应用程序。跨越这个重要的里程碑,LEAD继续通过发布LEADTOOLS版本21来实现这一愿景。该版本以新的前沿库和功能(包括可自动搜索,查找并采取行动的智能文档分析器)突出显示。基于任何结构化或非结构化形式的感兴趣数