结构化搜索

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

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

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

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

全文搜索

Elasticsearch系列(5):深入搜索的更多相关文章

  1. elasticsearch系列四:搜索详解(搜索API、Query DSL)

    一.搜索API 1. 搜索API 端点地址 从索引tweet里面搜索字段user为kimchy的记录 GET /twitter/_search?q=user:kimchy 从索引tweet,user里 ...

  2. Elasticsearch系列---结构化搜索

    概要 结构化搜索针对日期.时间.数字等结构化数据的搜索,它们有自己的格式,我们可以对它们进行范围,比较大小等逻辑操作,这些逻辑操作得到的结果非黑即白,要么符合条件在结果集里,要么不符合条件在结果集之外 ...

  3. Elasticsearch系列---深入全文搜索

    概要 本篇介绍怎样在全文字段中搜索到最相关的文档,包含手动控制搜索的精准度,搜索条件权重控制. 手动控制搜索的精准度 搜索的两个重要维度:相关性(Relevance)和分析(Analysis). 相关 ...

  4. elasticsearch系列五:搜索详解(查询建议介绍、Suggester 介绍)

    一.查询建议介绍 1. 查询建议是什么? 查询建议,为用户提供良好的使用体验.主要包括: 拼写检查: 自动建议查询词(自动补全) 拼写检查如图: 自动建议查询词(自动补全): 2. ES中查询建议的A ...

  5. Elasticsearch系列---多字段搜索

    概要 本篇介绍一下multi_match的best_fields.most_fields和cross_fields三种语法的场景和简单示例. 最佳字段 bool查询采取"more-match ...

  6. ElasticSearch 2 (18) - 深入搜索系列之控制相关度

    ElasticSearch 2 (18) - 深入搜索系列之控制相关度 摘要 处理结构化数据(比如:时间.数字.字符串.枚举)的数据库只需要检查一个文档(或行,在关系数据库)是否与查询匹配. 布尔是/ ...

  7. ElasticSearch 2 (17) - 深入搜索系列之部分匹配

    ElasticSearch 2 (17) - 深入搜索系列之部分匹配 摘要 到目前为止,我们介绍的所有查询都是基于完整术语的,为了匹配,最小的单元为单个术语,我们只能查找反向索引中存在的术语. 但是, ...

  8. ElasticSearch 2 (16) - 深入搜索系列之近似度匹配

    ElasticSearch 2 (16) - 深入搜索系列之近似度匹配 摘要 标准的全文搜索使用TF/IDF处理文档.文档里的每个字段或一袋子词.match 查询可以告诉我们哪个袋子里面包含我们搜索的 ...

  9. ElasticSearch 2 (15) - 深入搜索系列之多字段搜索

    ElasticSearch 2 (15) - 深入搜索系列之多字段搜索 摘要 查询很少是简单的一句话匹配(one-clause match)查询.很多时候,我们需要用相同或不同的字符串查询1个或多个字 ...

  10. ElasticSearch 2 (14) - 深入搜索系列之全文搜索

    ElasticSearch 2 (14) - 深入搜索系列之全文搜索 摘要 在看过结构化搜索之后,我们看看怎样在全文字段中查找相关度最高的文档. 全文搜索两个最重要的方面是: 相关(relevance ...

随机推荐

  1. RAID部署

    添加硬盘 1.创建一个RAID阵列卡 2.格式化刚刚做好的md0 3.创建挂载目录 4.自动挂载,永久生效 5.使用 创建RAID 1.创建一个RAID阵列卡 2.格式化 3.创建挂载目录 4.自动挂 ...

  2. 接口调试之Postman 使用方法详解

    一.Postman背景介绍 用户在开发或者调试网络程序或者是网页B/S模式的程序的时候是需要一些方法来跟踪网页请求的,用户可以使用一些网络的监视工具比如著名的Firebug等网页调试工具.今天给大家介 ...

  3. 【DFS】n皇后问题

    回溯: 递归调用代表开启一个分支,如果希望这个分支返回后某些数据恢复到分支开启前的状态以便重新开始,就要使用到回溯技巧,全排列的交换法,数独,部分和,用到了回溯.下一个状态在开始之前需要利用到之前的状 ...

  4. SDL 开发实战(六): 使用 SDL 实现 YUV 播放器

    前面铺垫了这么多,现在终于进入核心的主题了,那就是使用SDL播放视频,本节我们将使用SDL播放YUV视频,也就是做一个YUV播放器. 下面说明一下使用SDL播放YUV视频的基本流程,主要分为两大部分: ...

  5. java字符串应用之字符串编码转换

    [转载]原文地址:https://blog.csdn.net/zhouyong80/article/details/1900100 无论是对程序的本地化还是国际化,都会涉及到字符编码的转换的问题.尤其 ...

  6. Web前端-JavaScript基础教程上

    Web前端-JavaScript基础教程 将放入菜单栏中,便于阅读! JavaScript是web前端开发的编程语言,大多数网站都使用到了JavaScript,所以我们要进行学习,JavaScript ...

  7. [Swift]LeetCode26. 删除排序数组中的重复项 | Remove Duplicates from Sorted Array

    Given a sorted array nums, remove the duplicates in-place such that each element appear only once an ...

  8. [Swift]LeetCode833. 字符串中的查找与替换 | Find And Replace in String

    To some string S, we will perform some replacement operations that replace groups of letters with ne ...

  9. python爬虫数据解析之正则表达式

    爬虫的一般分为四步,第二个步骤就是对爬取的数据进行解析. python爬虫一般使用三种解析方式,一正则表达式,二xpath,三BeautifulSoup. 这篇博客主要记录下正则表达式的使用. 正则表 ...

  10. This relative module was not found:

    晚上项目敲完,关机睡觉!  早上醒来-----打开项目,惊呆了 !This relative module was not found: 如图   这个报错,我当时怎么也没看懂!!!   后来经过测试 ...