Elasticsearch 全文检索 分词检索-Elasticsearch文章四

文章目录

  • 官方文档地址
  • refercence文档
  • 全文搜索体系
  • match
    • 简单查询
    • match 多词/分词
    • 单字段分词
    • match多个词的逻辑
    • 控制match的匹配精度
    • match_pharse_prefix分词前缀方式
    • match_bool_prefix
    • multi_match多字段匹配
  • query string类型
  • Interval类型
  • DSL查询之Term详解
  • 聚合查询之Bucket聚合详解
  • 聚合查询之Metric聚合详解
  • 聚合查询之Pipline聚合详解
  • 其他
  • 外传

官方文档地址

https://www.elastic.co/guide/en/enterprise-search/current/start.html

refercence文档

https://www.elastic.co/guide/en/elasticsearch/reference/7.17/query-dsl-match-query.html

全文搜索体系

Full text Query中,我们只需要把如下的那么多点分为3大类,你的体系能力会大大提升

在这里插入图片描述

很多api都可以查得到,我们只要大概知道有支持哪些功能

在这里插入图片描述

match

简单查询

GET visit_log/_search
{"query": { "match": {"serverHostName": "wei"}},"sort": [{ "_id": "asc" }],"from": 0,"size": 10
}

Elasticsearch 执行上面这个 match 查询的步骤是:
1. 检查字段类型 。
标题 title 字段是一个 string 类型( analyzed )已分析的全文字段,这意味着查询字符串本身也应该被分析。
1. 分析查询字符串 。
将查询的字符串 wei cui传入标准分析器中,输出的结果是单个项 wei。因为只有一个单词项,所以 match 查询执行的是单个底层 term 查询。
1. 查找匹配文档 。
用 term 查询在倒排索引中查找 wei然后获取一组包含该项的文档,本例的结果是文档:1、2 和 3 。
1. 为每个文档评分 。
用 term 查询计算每个文档相关度评分 _score ,这是种将词频(term frequency,即词 quick 在相关文档的 title 字段中出现的频率)和反向文档频率(inverse document frequency,即词 quick 在所有文档的 title 字段中出现的频率),以及字段的长度(即字段越短相关度越高)相结合的计算方式。

查询结果:

{"took" : 1,"timed_out" : false,"_shards" : {"total" : 1,"successful" : 1,"skipped" : 0,"failed" : 0},"hits" : {"total" : {"value" : 1,"relation" : "eq"},"max_score" : null,"hits" : [{"_index" : "visit_log","_type" : "_doc","_id" : "nUL9rokBpGsmR0pP0VSc","_score" : null,"_source" : {"_class" : "org.lwd.microservice.boot.es.entity.VisitLog","id" : 7,"tableName" : "VisitLog","userLoginId" : 3,"serverIpAddress" : "127.0.0.1","serverHostName" : "liu wei","initialRequest" : "http://localhost:8023","msgContent" : "test es add7","createTime" : 1690446876000},"sort" : ["nUL9rokBpGsmR0pP0VSc"]}]}
}

match 多词/分词

单字段分词

查询字段包含wei cui两个词

GET visit_log/_search
{"query": { "match": {"serverHostName": "wei cui"}},"sort": [{ "_id": "asc" }],"from": 0,"size": 10
}

结果:

{"took" : 1,"timed_out" : false,"_shards" : {"total" : 1,"successful" : 1,"skipped" : 0,"failed" : 0},"hits" : {"total" : {"value" : 2,"relation" : "eq"},"max_score" : null,"hits" : [{"_index" : "visit_log","_type" : "_doc","_id" : "TEL9rokBpGsmR0pPXFMo","_score" : null,"_source" : {"_class" : "org.lwd.microservice.boot.es.entity.VisitLog","id" : 5,"tableName" : "VisitLog","userLoginId" : 3,"serverIpAddress" : "127.0.0.1","serverHostName" : "wang cui","initialRequest" : "http://localhost:8023","msgContent" : "test es add6","createTime" : 1690446876000},"sort" : ["TEL9rokBpGsmR0pPXFMo"]},{"_index" : "visit_log","_type" : "_doc","_id" : "nUL9rokBpGsmR0pP0VSc","_score" : null,"_source" : {"_class" : "org.lwd.microservice.boot.es.entity.VisitLog","id" : 7,"tableName" : "VisitLog","userLoginId" : 3,"serverIpAddress" : "127.0.0.1","serverHostName" : "liu wei","initialRequest" : "http://localhost:8023","msgContent" : "test es add7","createTime" : 1690446876000},"sort" : ["nUL9rokBpGsmR0pP0VSc"]}]}
}

因为 match 查询必须查找两个词( [“liu”,“wei”] ),它在内部实际上先执行两次 term 查询,然后将两次查询的结果合并作为最终结果输出。为了做到这点,它将两个 term 查询包入一个 bool 查询中,
所以上述查询的结果,和如下语句查询结果是等同的

GET /visit_log/_search
{"query": {"bool": {"should": [{"term": {"serverHostName": "liu"}},{"term": {"serverHostName": "cui"}}]}}
}

match多个词的逻辑

上面等同于should(任意一个满足),是因为 match还有一个operator参数,默认是or, 所以对应的是should。

GET /visit_log/_search
{"query": {"match": {"serverHostName": {"query": "wang cui","operator": "or"}}}
}

多字段分词

GET /visit_log/_search
{"query": {"bool": {"should": [{ "match": { "serverHostName": "cui wei" }},{ "match": { "msgContent": "add3 add4" }}]}}
}

控制match的匹配精度

如果用户给定 3 个查询词,想查找至少包含其中 2 个的文档,该如何处理?将 operator 操作符参数设置成 and 或者 or 都是不合适的。
match 查询支持 minimum_should_match 最小匹配参数,这让我们可以指定必须匹配的词项数用来表示一个文档是否相关。我们可以将其设置为某个具体数字,更常用的做法是将其设置为一个百分数,因为我们无法控制用户搜索时输入的单词数量:

GET /visit_log/_search
{"query": {"match": {"serverHostName": {"query": "wang cui wangcui","minimum_should_match": "75%"}}}
}

当然也等同于

GET /visit_log/_search
{"query": {"bool": {"should": [{ "match": { "serverHostName": "wang" }},{ "match": { "serverHostName": "cui"   }},{ "match": { "serverHostName": "wangcui"   }}],"minimum_should_match": 2 }}
}

match_pharse_prefix分词前缀方式

那有没有可以查询出quick brown f的方式呢?ELasticSearch在match_phrase基础上提供了一种可以查最后一个词项是前缀的方法,这样就可以查询test es a了

GET /visit_log/_search
{"query": {"match_phrase_prefix": {"msgContent": {"query": "test es a"}}}
}

(ps: prefix的意思不是整个text的开始匹配,而是最后一个词项满足term的prefix查询而已)

match_bool_prefix

GET /visit_log/_search
{"query": {"match_bool_prefix": {"msgContent": {"query": "es test a"}}}
}

所以这样你就能理解,match_bool_prefix查询中的quick,brown,f是无序的。

multi_match多字段匹配

GET /visit_log/_search
{"query": {"multi_match" : {"query":    "add7 wang","fields": [ "msgContent", "*HostName" ] }}
}

结果:

{"took" : 1,"timed_out" : false,"_shards" : {"total" : 1,"successful" : 1,"skipped" : 0,"failed" : 0},"hits" : {"total" : {"value" : 3,"relation" : "eq"},"max_score" : 1.7917595,"hits" : [{"_index" : "visit_log","_type" : "_doc","_id" : "nUL9rokBpGsmR0pP0VSc","_score" : 1.7917595,"_source" : {"_class" : "org.lwd.microservice.boot.es.entity.VisitLog","id" : 7,"tableName" : "VisitLog","userLoginId" : 3,"serverIpAddress" : "127.0.0.1","serverHostName" : "liu wei","initialRequest" : "http://localhost:8023","msgContent" : "test es add7","createTime" : 1690446876000}},{"_index" : "visit_log","_type" : "_doc","_id" : "TEL9rokBpGsmR0pPXFMo","_score" : 1.0800905,"_source" : {"_class" : "org.lwd.microservice.boot.es.entity.VisitLog","id" : 5,"tableName" : "VisitLog","userLoginId" : 3,"serverIpAddress" : "127.0.0.1","serverHostName" : "wang cui","initialRequest" : "http://localhost:8023","msgContent" : "test es add6","createTime" : 1690446876000}},{"_index" : "visit_log","_type" : "_doc","_id" : "6UL9rokBpGsmR0pPjVOS","_score" : 1.0800905,"_source" : {"_class" : "org.lwd.microservice.boot.es.entity.VisitLog","id" : 6,"tableName" : "VisitLog","userLoginId" : 3,"serverIpAddress" : "127.0.0.1","serverHostName" : "wang ting","initialRequest" : "http://localhost:8023","msgContent" : "test es add6","createTime" : 1690446876000}}]}
}

*表示前缀匹配字段。

query string类型

此查询使用语法根据运算符(例如AND或)来解析和拆分提供的查询字符串NOT。然后查询在返回匹配的文档之前独立分析每个拆分的文本。
可以使用该query_string查询创建一个复杂的搜索,其中包括通配符,跨多个字段的搜索等等。尽管用途广泛,但查询是严格的,如果查询字符串包含任何无效语法,则返回错误。
例如:


GET /visit_log/_search
{"query": {"query_string": {"query": "(wangcui) OR (add6)","fields": [ "msgContent", "*HostName" ] }}
}

Interval类型

Intervals是时间间隔的意思,本质上将多个规则按照顺序匹配。


GET /visit_log/_search
{"query": {"intervals" : {"msgContent" : {"all_of" : {"ordered" : true,"intervals" : [{"match" : {"query" : "liu","max_gaps" : 0,"ordered" : true}},{"any_of" : {"intervals" : [{ "match" : { "query" : "es" } },{ "match" : { "query" : "add6" } }]}}]}}}}
}

因为interval之间是可以组合的,所以它可以表现的很复杂

DSL查询之Term详解

自行查官方文档,有可能后边会出详解

聚合查询之Bucket聚合详解

自行查官方文档,有可能后边会出详解

聚合查询之Metric聚合详解

自行查官方文档,有可能后边会出详解

聚合查询之Pipline聚合详解

自行查官方文档,有可能后边会出详解

其他

外传

😜 原创不易,如若本文能够帮助到您的同学
🎉 支持我:关注我+点赞👍+收藏⭐️
📝 留言:探讨问题,看到立马回复
💬 格言:己所不欲勿施于人 扬帆起航、游历人生、永不言弃!🔥

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/78318.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

dialog => :before-close的属性应用

在element-ui里面关闭弹窗的时候before-close会触发。 也就是点击X的时候回触发before-close这个属性, 代码实例: <el-dialogtitle"新增用户":visible.sync"dialogVisible"width"50%":before-close"handleClose"> handleClose…

百分点科技跻身中国智慧应急人工智能解决方案市场前三

近日&#xff0c; 全球领先的IT市场研究和咨询公司IDC发布了《中国智慧应急解决方案市场份额&#xff0c;2022》报告&#xff0c;数据显示&#xff0c;2022年中国智慧应急整体市场为104亿元人民币。其中&#xff0c;智慧应急人工智能解决方案子市场备受关注&#xff0c;百分点科…

小成本大幅度增幅CNN鲁棒性,完美的结合GLCM+CNN

本文以实验为导向&#xff0c;使用vgg16GLCM实现一场精彩的新冠肺炎的分类识别&#xff0c;并且对比不加GLCM后的效果。在这之前&#xff0c;我们需要弄明白一些前缀知识和概念问题&#xff1a; GLCM&#xff08;Gray-Level Co-occurrence Matrix&#xff09;&#xff0c;中文称…

使用ChatGPT编写技术文档

技术文档对于任何项目都是至关重要的&#xff0c;因为它确保所有利益相关者都在同一层面上&#xff0c;并允许有效的沟通和协作。创建详细而准确的技术文档可能既耗时又具有挑战性&#xff0c;特别是对于那些不熟悉主题或缺乏强大写作技巧的人来说。ChatGPT 是一个强大的人工智…

解密爬虫ip是如何被识别屏蔽的

在当今信息化的时代&#xff0c;网络爬虫已经成为许多企业、学术机构和个人不可或缺的工具。然而&#xff0c;随着网站安全防护的升级&#xff0c;爬虫ip往往容易被识别并屏蔽&#xff0c;给爬虫工作增加了许多困扰。在这里&#xff0c;作为一家专业的爬虫ip供应商&#xff0c;…

torchvision.datasets数据加载失败

torchvision.datasets数据加载失败 如何使用torchvision.datasets进行自动下载数据失败&#xff0c;可以使用手动下载数据 Ctrl点击可以进入相关包文件&#xff0c;查找下载地址&#xff1a;https://www.cs.toronto.edu/~kriz/cifar-10-python.tar.gz 手动下载之后解压&#x…

使用Vscode编辑keil工程

一、需要安装的插件 1. Keil Assistant 2. C/C 3. 中文配置&#xff1a; 二、插件配置 1. Keil Assistant 添加Keil的安装路径 接下来就可以使用vscode编辑Keil的工程了&#xff0c;调试编译和下载程序需要返回到Keil中进行操作。 三、Vscode常用快捷键 可以自定义进行配置…

微信小程序开通账号

https://mp.weixin.qq.com/ 在该页面使用一个新邮箱注册一个账号&#xff0c;并且绑定一个微信号作为管理者用户&#xff0c;下次登录&#xff0c;在该页面&#xff0c;直接使用微信扫码后&#xff0c;选择账号登录

Spring Cloud Alibaba (一)

1 微服务介绍 1.1 系统架构演变 随着互联网的发展&#xff0c;网站应用的规模也在不断的扩大&#xff0c;进而导致系统架构也在不断的进行变化。 从互联网早起到现在&#xff0c;系统架构大体经历了下面几个过程: 单体应用架构--->垂直应用架构--->分布 式架构--->S…

新手入门吉他买什么好?千元内VEAZEN费森VZ200和恩雅X1pro综合评测,你会选新型材质HPL还是传统木吉他?

千元内入门吉他少不了VEAZEN费森VZ200单板系列和恩雅X1 PRO系列这两款热门系列&#xff0c;最近很多初学者朋友来私信&#xff0c;咨询这两款琴有什么优缺点&#xff0c;哪一款更值得初学者选购&#xff0c;那么今天&#xff0c;就以它们为本期的评测主角&#xff0c;全方位评测…

《吐血整理》进阶系列教程-拿捏Fiddler抓包教程(19)-Fiddler精选插件扩展安装,将你的Fiddler武装到牙齿

1.简介 Fiddler本身的功能其实也已经很强大了&#xff0c;但是Fiddler官方还有很多其他扩展插件功能&#xff0c;可以更好地辅助Fiddler去帮助用户去开发、测试和管理项目上的任务。Fiddler已有的功能已经够我们日常工作中使用了&#xff0c;为了更好的扩展Fiddler&#xff0c…

【数据结构与算法——TypeScript】算法的复杂度分析、 数组和链表的对比

【数据结构与算法——TypeScript】 算法的复杂度分析 什么是算法复杂度(现实案例)&#xff1f; ❤️‍&#x1f525; 前面已经解释了什么是算法&#xff1f; 其实就是解决问题的一系列步骤操作、逻辑。 ✅ 对于同一个问题&#xff0c;我们往往有很多种解决思路和方法&#x…

flink1.17 eventWindow不要配置processTrigger

理论上可以eventtime processtime混用,但是下面代码测试发现bug,输入一条数据会一直输出. flink github无法提bug/问题. apache jira账户新建后竟然flink又需要一个账户,放弃 bug复现操作 idea运行代码后 往source kafka发送一条数据 a,1,1690304400000 可以看到无限输出…

迭代器模式(Iterator)

迭代器模式是一种行为设计模式&#xff0c;可以在不暴露底层实现(列表、栈或树等)的情况下&#xff0c;遍历一个聚合对象中所有的元素。 Iterator is a behavior design pattern that can traverse all elements of an aggregate object without exposing the internal imple…

排序八卦炉之归并、计数

文章目录 1.归并排序1.1初识代码1.2代码分析1.3复杂度1.4非递归版本1.01.初识代码2.代码分析 1.5非递归版本2.01.初识代码2.代码分析 2.计数排序2.1初始代码2.2代码分析 1.归并排序 1.1初识代码 //归并排序 时间复杂度&#xff1a;O(N*logN) 空间复杂度&#xff1a;O(N) vo…

java中io流、属性集Properties、缓冲流、转换流、序列化和反序列化、打印流、网络编程(TCP通信程序、文件复制案例、文件上传案例、B/S服务案例)

IO流&#xff1a; io流中i表示input输入&#xff0c;o表示output输出&#xff0c;流表示数据&#xff08;字符&#xff0c;字节&#xff0c;1个字符2个字节8个位&#xff09;&#xff1b;这里的输入输出是以内存为基础&#xff0c;将数据从内存中输出到硬盘的过程称为输出&…

复旦大学计算机考研分析

关注我们的微信公众号 姚哥计算机考研 更多详情欢迎咨询 24计算机考研|上岸指南 复旦大学 复旦大学计算机考研招生学院是计算机科学与技术学院&#xff0c;软件学院&#xff0c;工程与应用技术研究院。目前均已出拟录取名单。 复旦大学计算机学科创建于中国计算机事业的起…

C语言数组笔试题(详解)

目录 插入知识&#xff1a; 一.指向函数指针数组的指针 二.回调函数 什么是回调函数&#xff1f; 三.数组笔试题 个人名片&#xff1a; &#x1f43c;作者简介&#xff1a;一名乐于分享在学习道路上收获的大二在校生&#x1f43b;‍❄个人主页&#xff1a;GOTXX &#x1f4…

试用AI生成代码工具Fauxpilot,详细安装过程

设置服务 预先说明 需要预先安装支持NVIDIA的docker,docker compose > 1.28不能再容器里运行&#xff0c;否则出现以下报错&#xff1a; rootc536ca0dbd64:/test/fauxpilot-main# ./setup.sh Checking for curl ... /usr/bin/curl Checking for zstd ... /opt/conda/bin…