ElasticSearch 全文搜索引擎的查询详解①(Ubuntu版 v6.6.2)

  • 1. 前提
  • 2. 轻量搜索
    • 2.1 单条件查询
    • 2.2 多条件查询
    • 2.3 不指定属性查询(查询所有文档属性)--(_all查询)
  • 3 正式进行检索
    • 3.1 概念解读
    • 3.2 查询结构
      • 3.2.1 精确查找--简易的查询结构
        • 3.2.1.1 概念
        • 3.2.1.2 对于数字类型的精确
        • 3.2.1.3 对于文本类型的精确
      • 3.2.2 全文检索--组合查询结构
        • 3.2.2.1 布尔过滤器--最基本等权重结构
        • 3.2.2.2 嵌套布尔过滤器---嵌套权重分析结构
        • 3.2.2.3 权重分离化查询结构
        • 3.2.2.4 多字段查询结构--多字段进行模糊查询
    • 3.3 全文检索--细致化查询方案
      • 3.3.1 对于范围值处理
        • 3.3.1.1 指定多个精确值查询
        • 3.3.1.2 范围值查询
      • 3.3.2 存在查询--NULL值查询处理方案
        • 3.3.2.1 对于存在值进行查询 -- exists
        • 3.3.2.2 查找null值 -- missing
  1. 接着上一篇博客 ElasticSearch 全文搜索引擎的安装与使用,我们可以简单的认识到ElasticSearch的简单的安装和使用,不出问题都已做好了安装第一步,通过添加一些结构化数据(Document),如果没有的可以点击上面的连接。
  2. 本章主要是讲解ElasticSearch的查询功能(作为上一章的补充)
  3. 本章改了几次,就是在应用和官网文档得看更深入之后做的决策。当然肯定还有许多问题等,望读者多多斧正。
  4. 特别注意,对于 ES7.0以上版本,需要将本文中的 Type去掉,其他的似乎变化不大
  5. 这篇文章命名为①,学了之后不见得你有多厉害,但是还是能达到一定的水平和层次,学了这篇文章之后,能进行比较基本的查询能力。但是对于控制精确度还是比较欠缺的,需要后续进行学习,也可以持续关注本人博客,虽然更新比较慢。也可以进行管网进行快速学习开发。
  6. 下一章节将其应用在Springboot之中

1. 前提

  1. 需要安装ElasticSearch(本文以6.6.2版本为准,对其他版本一般具有兼容性),没有安装的请参照博客,地址: https://blog.csdn.net/weixin_44929998/article/details/110231530。
  2. 新增一个Index为test,type为user的索引Index(类似数据库),结构如下所示:
{"mappings": {"user": {"properties": {"id": {"type": "integer"},"name": {"type": "text","analyzer": "ik_max_word","search_analyzer": "ik_max_word"},"desc": {"type": "text","analyzer": "ik_max_word","search_analyzer": "ik_max_word"}}}}
}

2. 轻量搜索

2.1 单条件查询

对于字符串查询来说,单条件查询就好像url后面拼接字符串一样,示例如下:
curl 'localhost:9200/test/user/_search?q=desc:调皮捣蛋'结果如下:

(1)url规则: ip:port/[Index]/[Type]/_search?q=[属性]:[值]

2.2 多条件查询

  1. 当我们查询条件不仅仅限于单个条件,稍显复杂的业务都要求几个查询条件,此时就需要使用 百分比编码,示例如下:
    curl 'localhost:9200/test/user/_search?q=%2Bdesc%3A调皮捣蛋+%2Bname%3A张三' 结果如下:

    (1)统配规则:ip:port/[Index]/[Type]/_search?q=%2B[属性]%3A[值]+%2B[属性]%3A[值]

2.3 不指定属性查询(查询所有文档属性)–(_all查询)

  1. 不管是单字符查询和多字符查询似乎不太满足日常业务要求,我们在查询文章时往往不记得标题,这种模糊类查询我们经常有几个东西,比如标签,比如标题。但是我们想查询更多内容怎么办?,示例如下:
    curl 'localhost:9200/test/user/_search?q=李四' 结果如下:

    (1)url规则: ip:port/[Index]/[Type]/_search?q=[值]
  2. 原理:其实在做all查询是把所有的字段全部拼接起来,再进行检索。可以简单理解为多了一个字段,并且此字段包含了其他字段的全部内容。
  3. 因为_all查询是字符串查询,通过之前推的那篇博客我们知道es有许多不同的类型,所以不管是时间还是什么都会转换成字符串形式,故精度等都会出现问题

3 正式进行检索

3.1 概念解读

3.1.1 精确值
  1. 概念: 精确值是一个表达十分准确的值。
  2. 示例: 对于精确值来说,sql表示就是 = 、区分大小写、对于时间概念来说2020和2020-12-02不同 等等。
  3. 对于精确的值,我们可以用来表达网络地址信息(网址、邮箱等),可以用来表达身份证。
3.1.2 全文
  1. 概念:全文应该是在当前目录下做出的模糊性值。
  2. 示例:对于全文来说,包含sql所示的like,但是不能完全包含这个,毕竟我们搜索比较轻柔的棉鞋的时候,对于商品描述应该是材质轻柔,xxx棉鞋,这样也能进行匹配。
  3. 对于全文,适用范围要对文章、对商品描述的模糊信息更加高级。

3.2 查询结构

  1. 基于上述的概念,es对外提供接口主要是上述说的两大类
  2. 我们将查询主要分为上述两个概念大类的结构进行讲解
  3. 了解该结构内容,对后续的学习有个整体性概念不至于迷惑了
3.2.1 精确查找–简易的查询结构
3.2.1.1 概念

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

3.2.1.2 对于数字类型的精确

根据上文概念,我们将精确查找可以简单理解为sql 中的 = 进行匹配,示例如下:

curl  'localhost:9200/test/user/_search' -X POST -d '
{"query" : {"constant_score" : { "filter" : {"term" : { "id" : 111}}} }
}'
  1. 结果如下:
  2. 我们可以看到已经精准查找到id为111的结果。
  3. 此时我们看到的_score匹配率达到了1 这个应该是精确查找中所默认的
3.2.1.3 对于文本类型的精确

根据上文概念,我们将精确查找可以简单理解为sql 中的 = 进行匹配,那么对于文字我们进行下述实验,示例如下:

curl  'localhost:9200/test/user/_search' -X POST -d '
{"query" : {"constant_score" : { "filter" : {"term" : { "desc" : "test"}}}  }
}'
  1. (截取部分)结果如下:
  2. 发现除了查找到我们需要的test,居然还有test9300 这样like语句才能出现的全文检索的内容,这应该不是本处表达需要的结果。
  3. 此时我们看到的_score匹配率达到了1 ,说明这个地方好像是没有采取分词方案,到底是什么原因导致的?解析如下:
    (1)精确查找默认score评分为 1
    (2)对于上文中创建该index是,我们用到了分词器(中文的),当我们进行检索的时候,会默认启用了分词器(analyzer),这个时候如果需要满足自己的条件,那么需要进行分词器的删除操作,那么更改后结果如下图所示就不会出事了
3.2.2 全文检索–组合查询结构
3.2.2.1 布尔过滤器–最基本等权重结构
#组成结构:{"bool" : {"must" :     [],"should" :   [],"must_not" : [],}
}
  1. must:所有的语句都 必须(must) 匹配,与 AND 等价。
  2. must_not:所有的语句都 不能(must not) 匹配,与 NOT 等价。
  3. should: 至少有一个语句要匹配,与 OR 等价。
curl  'localhost:9200/test/user/_search' -X POST -d '
{"query" : {"bool" : {"should" : {"term" : {"desc" : "test"}},"must_not" : {"term" : {"desc" : "test93053"}}}}}'
  1. 结果如下:
  2. 对于该结果,不难看出,已经匹配了关于test的全部内容,但是对于test93053不被检索,是must not的功劳
3.2.2.2 嵌套布尔过滤器—嵌套权重分析结构
#组成结构:{"bool" : {"must" : [{"match":{...}}{"bool":{...}}],"should" :   [{"term":{...}}{"bool":{...}}],"must_not" : [...],}
}
  1. 对于嵌套中采用分权模式,第一个bool下的三个must、should、must_not是三权鼎立的地步,那么对于should下的term和bool,是在 1/3 蛋糕下的再各占的 1/2,这点 必须明确,也就是说同级同权限。
  2. 这个时候,大致框架已经了解了,学习两章内容,大致框架大概也应该了解了,下面开始了解各种类型的处理方案吧。
3.2.2.3 权重分离化查询结构

对于布尔查询有个权重问题,这个权重问题可能带来的一个差异化问题所在就是对于不管是文章还是商品来说,其中的标题和正文内容/商品详情 信息中包含的意思,在进行权重分配和进行计算的时候,我们往往可能需要标题出现更高的命中率,如果按照布尔查询习惯,可能部分会出现正文内容/商品详情的权重拉低标题权重导致我们不想要的结果,故有了词权重分离化查询,示例如下:

curl  'localhost:9200/test/user/_search' -X POST -d '
{"query":{"dis_max":{"queries":[{"match":{"desc":"活泼"}},{"match":{"desc":"大方"}}]}}
}'

1.结果如下:

  1. 至此我们看到结果中的评分是一样的,活泼和大方此时互不干扰,互相竞争
3.2.2.4 多字段查询结构–多字段进行模糊查询

对于同一个单词,进行多个字段搜索,比如进行权重分离化查询,或者简单的多个字段查询,但是当我们的查询比如文章博客搜索中有标题、内容、标签…等进行权重分离化查询时,是不是多个match写的很累赘,多嵌套的则显得很杂乱。故这里提供了多字段查询结果的方案。[写的好像不太好懂,这个默认实现了dis_max将每个字段进行match查询]

curl  'localhost:9200/test/user/_search' -X POST -d '
{"query":{"multi_match":{"query":  "活泼","fields": ["name","desc"]}}
}'

1.结果如下:

  1. 看到结构,其实很简单 fields 参数使用了数组自己遍历多字段查询,某种程度上只是一种简单的方案查询结构,本质和上面的并无差异。

  2. 对于需要进行权重比例分配的结果,比如文章搜索标签和标题需要占的比例比较大,可以使用^ 进行权重分配,比如上文中的参数name默认为name^1,如果要实现dis_max查询结构只需要将请求参数改为以下规范就行了:

curl  'localhost:9200/test/user/_search' -X POST -d '
{"query":{"multi_match":{"query":  "活泼","fields": ["name","desc^2"]}}
}'

3.3 全文检索–细致化查询方案

3.3.1 对于范围值处理
  1. 概念: 范围值,这里主要是指
    (1) 指定多值,相当于sql中的 in (加上must no 是不是就是 not in)。
    (2) 范围值,相当于sql中的between…and…,< > <= >= 等。
  2. 原Index结构 已经开始不满足需求了,下面我们需要进行新建一个Index,结构如下:
#新建一个Index为student,type是user的索引(数据库),为了有个integer数据,用体重替代吧
curl -X PUT 'localhost:9200/student/user' -d '
{"mappings": {"user": {"properties": {"no": {"type": "text","index":"not_analyzed"},"name": {"type": "text","analyzer": "ik_max_word","search_analyzer": "ik_max_word"},"birth": {"type": "data"},"weight": {"type": "integer"},"desc": {"type": "text","analyzer": "ik_max_word","search_analyzer": "ik_max_word"}}}}
}'
3.3.1.1 指定多个精确值查询

指定多值也就是相当于sql中的 in ,示例如下:

curl  'localhost:9200/student/user/_search' -X POST -d '
{"query":{"bool":{"must":{"terms":{"weight":[60,65]}}}}
}'
  1. 结果如下:
  2. 对于该结果,不难看出,已经匹配查找只包含了60 65 体重的人
3.3.1.2 范围值查询
  1. 范围值查询应该包含数字、日期甚至文本类型的查询,但是文本类型查询肯定慢很多
  2. 范围值也就是相当于sql中的 > < >= <= ,
    (1)gt: > 大于(greater than)
    (2)lt: < 小于(less than)
    (3) gte: >= 大于或等于(greater than or equal to)
    (4)lte: <= 小于或等于(less than or equal to)
  3. 示例如下:
curl  'localhost:9200/student/user/_search' -X POST -d '
{"query":{"range":{"weight":{"gte":65,"lte":70}}  }
}'
  1. 结果如下:
  2. 对于该结果,不难看出,已经匹配查找包含了体重在[65,70]包含边界值的人
3.3.2 存在查询–NULL值查询处理方案
  1. 上一章博客在Document文档概念讲解到:同一个Index数据库下的Document文档不需要格式(scheme)一致,但是为了保证查找效率最好是一致的。
  2. 但是对于一些文档,确实有些字段的缺失,这是必然的,而对于缺失的文档进行倒序排序时没办法拥有token,所以我们需要一套解决方案来进行,这就是存在查询
    做点准备工作:
#此处我用的postman进行新增,使用post提交
curl -X PUT 'localhost:9200/test/user' -d '
{"id" : 253,"desc" : "调皮捣蛋"
}'
3.3.2.1 对于存在值进行查询 – exists
curl  'localhost:9200/student/user/_search' -X POST -d '
{"query" : {"exists" : { "field" : "name" }}
}'# 1. 此处没有对应的结果只是没有null值的数据,没必要展示了对吧
3.3.2.2 查找null值 – missing
curl  'localhost:9200/student/user/_search' -X POST -d '
{"query": {"bool": {"must_not": {"exists": {"field": "name"}}}}
}'
  1. 结果:
  2. 发现没有,exists和missing不是简单单词替换的查询结构,因为es官网删掉了missing接口,因为must_not 可以使用,故认为多余了
  3. 返回结构就是字段缺失的结果

上一章:ElasticSearch 全文搜索引擎的安装与使用(Ubuntu版 v6.6.2)

下一章:Springboot中的ElasticSearch

ElasticSearch 全文搜索引擎的查询详解①(Ubuntu版 v6.6.2)相关推荐

  1. 【Elasticsearch】es 各种查询 详解

    文章目录 1.概述 1.4 为什么使用ES查询快? 1.5 ES几种查询方式的对比 1.6 查询调优 2. 基础查询 2.1 nust查询 2.2 nust_not 查询 2.3 should查询 2 ...

  2. Elasticsearch实战——function_score 查询详解

    Elasticsearch实战--function_score 查询详解 文章目录 Elasticsearch实战--function_score 查询详解 1. function_score简介 2 ...

  3. ElasticSearch——全文搜索引擎

    一.为什么需要全文搜索引擎? 首先先来了解一个概念,在我们生活中一般来说有两种数据:结构化数据.非结构化数据 结构化数据:指具有固定格式或有限长度的数据,如数据库,元数据等. 非结构化数据: 非结构化 ...

  4. 这就是搜索引擎:核心技术详解

    这就是搜索引擎:核心技术详解 张俊林 著 ISBN 978-7-121-14865-1 2012年1月出版 定价:45.00 元 16开 320页 宣传语:改变全世界人们生活方式的"信息之门 ...

  5. ftp linux包,图文详解Ubuntu搭建Ftp服务器的方法(包成功)

    一.今天下午由于课程的要求不得已做了Ubuntu搭建Ftp服务器的实验,但是实验指导书还是N年前的技术,网上搜了一大把,都是模模糊糊的! 在百般困难中终于试验成功,特把经验分给大家 希望大家少走弯路! ...

  6. elasticsearch性能测试工具rally深入详解

    Elasticsearch性能测试工具rally深入详解题记 elasticsearch性能测试研究了很久,自己想过通过批量导入数据,然后记录时间,统计CPU.内存等变化,计算得出某个性能指标.但显然 ...

  7. 一文看懂-ElasticSearch全文搜索引擎

    一文看懂-ElasticSearch全文搜索引擎 一.ElasticSearch简介 1.1 什么是ElasticSearch ElasticSearch简称ES,其中Elastic 从名字里我们可以 ...

  8. Elasticsearch全文搜索引擎-PHP使用教程。

    1.声明依赖关系:         比方说,你的项目中需要一个php版的elasticsearch框架.为了将它添加到你的项目中(下载),你所需要做的就是创建一个 composer.json 文件,其 ...

  9. PHP使用Elasticsearch 全文搜索引擎的开发

    PHP基于elasticsearch全文搜索引擎的开发 1.概述: 全文搜索属于最常见的需求,开源的 Elasticsearch (以下简称 Elastic)是目前全文搜索引擎的首选.Elastic ...

最新文章

  1. python爬取b站粉丝数_【python爬虫】每天统计一遍up主粉丝数!
  2. Xbox 2021年科隆展发表会将于8月25日凌晨1点开始
  3. Microsoft JET Database Engine 错误 #39;80004005#39;的解决方法
  4. hprose java 下载_Hprose Java|Hprose For Java下载v2017.2.0官方版 附使用教程 - 欧普软件下载...
  5. AIX安装中文语言包
  6. 《企业软件交付:敏捷与高效管理精要》——2.1 引言
  7. Exchange Server 2016管理系列课件03.管理邮箱配额限制
  8. Nginx的负载均衡 - 加权轮询 (Weighted Round Robin) 上篇
  9. centos7.x-firewalld防火墙常用命令收集
  10. java zinterstore_Java架构之Redis系列:通过文章点赞排名案例学习Sortedset命令
  11. 趋势officescan客户端迁移和升级
  12. mac m1 obs录制麦克风+桌面音频
  13. Keil MDK 编译器 AC5 和 AC6 优化选项重要内容和区别
  14. 为什么amd显卡便宜却买的人少_这7张显卡现在最好不要买,千万不要花钱当冤大头...
  15. 鸿蒙系统剽窃,外媒再爆猛料!质疑华为鸿蒙系统抄袭:被指山寨谷歌安卓11系统...
  16. js页面中实现加载更多功能
  17. 新颖的自我介绍_精选简单新颖的自我介绍
  18. 亿发软件:定制ERP管理系统在湖南建材行业的应用
  19. Tekton系列之理论篇【二】
  20. 3344avd_AVD生根

热门文章

  1. 新点软件登陆科创板:上市首日破发,腾讯、建发股份参与认购
  2. 先验概率、后验概率、贝叶斯公式_学习笔记
  3. 50多种 Kubernetes 工具汇总
  4. UWB高精度实时定位系统
  5. java消息队列使用场景
  6. 可以跨专业保研计算机吗,保研夏令营能跨专业吗?各位前辈,有没有跨专业保研的途径...
  7. 解决pyinstaller打包文件过大的问题(Anaconda)
  8. 如何音频转文字?仅需这三个步骤,简单易上手
  9. CAD二次开发仿系统直线命令
  10. 个人数学建模算法库之线性规划模型