laravel 分词搜索匹配度_elasticsearch基础笔记9-elasticsearch 词项全文搜索

ae59f4cd0a269c4a7a43177bbff83104.png

es的核心功能就是搜索和分析。那么我们看看搜索相关内容

1、搜索机制

7e3c4dfe6103ff6db833f875db6c3106.png

在进入搜索之前,会对查询体根据情况进行分析和处理。

82386501ba752add38dc956a2e44c68d.png

2、有哪些常用搜索类型

全文查询 词项查询 复合查询 嵌套查询 位置查询 特殊查询等。

我们常用到的就是前三种,学起来简单,用起来特别难。

3、看看这三种查询的区别。

词项查询用来查找指定字段中,包含给定的单词的文档,词项查询不会被解析,只有查询词和文档中的词精确匹配才会被搜索到,常见的应用场景为地名,人名等。我们的 准字号。

全文查询通常用于在全文进行搜索,全文查询的被查询字段是要被分析和分解的。

复合查询,就是把一些简单的查询组合在一起查询,实现更复杂的查询需求,此外,复合查询还可以控制另一个查询的行为。

我们先以term query 和matchquery 来进行对比讲解。(下面两部分第一项)

准备工作:

我们重新建一个sku索引,加入相应的数据;

3aa95762e61d684fe6bd10f471ecfa4f.png
a20a9a5d8de5deb6e1ccc7fa01e2e1cf.png

然后,我们确认下,新增的数据都已经存进来了

GET sku/_search

好,接下来我们来看看不同的查询出来的效果是怎么样的。

4、词项查旬

首先,我们查询下我们刚才录入的一个文档,

e3b4be83fafef9f8351e07d1687a2e2c.png

我们发现,并没有查到我们刚才存入的数据,这个就有点尴尬了。

那到底是什么原因呢?在想想我们对词项查询的定义,词项查询内容不会被解析,只有精确匹配到的才会被查询出来。那我们也就是说,需要我们的sku索引的相应字段要精确的匹配到"三黄片"这个词。那我们我们接下看看看索引字段是怎么存的。分词之后是什么样子的。

d5d2c897de568a5811cd660d1374cd7c.png

上面就是"三黄片"这个词在name这个字段上的分词结果。我们发现,分词结果是三、黄、片三个单独的词,而我们用"三黄片"整个词来匹配是匹配不到的。

如果我们将我们的搜索词改为"三",那么应该就会匹配到响应的数据如下:

889c506e4c45a0915211b3a82a87dba1.png

同样的情况,我们用全文查询查询一次看一下效果:参考match query内容部分

terms查询是term的升级版,用来查询文档中包含多个词项,词项间是或的关系。

比如,我们查刚才的sku 包含"三","jiaonang"的,会发现同时查到了两条记录。

dee0700c94e1b87c0ce5f159de829c12.png

prefix 查询用来查询某个字段中以给定的字段开头的文档。

da9598e3e3245cfba10cfcf72490764f.png

这个查询中我们发现,对于所查询的字段,还是用了分词的。

query

于此类似的还有 wildcard query 为通配符查询,这个查询支持单字或者多字的通配符查询。查询过程中,用'?'来匹配一个任意字符,'*'用来匹配0个或者多个字符。

7abfddc6a7921d1c9e052556f58ed9dc.png

exists 查询会查询出至少一个非空值的文档。

5、全文查询

同样的情况,我们用全文查询查询一次看一下效果:

448f7691630e88ab948ade1e8e9a3268.png

我们会发现,这个时候,无论我们怎么查,都能查到结果。这就是两种查询的区别。

match查询会对查询语句进行分词,分词之后查询语句中任何一个词项被匹配,文档就会被搜索到。

如果,想要所有词项都被搜索到才返回,则使用 and连接。 这就需要改换下写法(上面的写法是简单的写法)

完成写法如下:

577c502da33affd361fabdf9b57e0c87.png

使用了and连接,也就是对查询内容进行分词,所有的词项都被命中后才返回。我们查询"三皇片"就不会查找到任何内容。查询"三片"就会查找到相应内容。

a3e7e5813974122d560c66d36e0fcf94.png
abdc29f2083120fd0fd39d433423d066.png

对于上面的搜索结构我们可以简单的分析一下,我们可以把match{}对象中的内容表述为这次匹配查询的参数(官方:top-level parameters for match)。"field"是要查询的字段,field{}对象内容部,是对field的参数。

这个参数可以有很多。具体如下:

query: 你要查询的内容,这个字段是必须的。

analyzer: 分词器(非必须),在搜索的时候可以制定分词器,这个时候就会由指定的分词器来分析你要的关键词。比如我们把刚才的搜索加上'keyword'分词,就不会搜到结果。如果我们不指定分词器,则会默认使用索引字段设定好的分词器。

9de853ad3b74930d5cfba2952bd24106.png

fuzziness: 允许模糊搜索。 分析出来的关键词之间允许相隔最大的字符数量。

e5dfcc22537a6719ee7bfc19e434fbbc.png

max_expansions : 查询的扩展词最大数量。默认为50。

operator :对查询文本的解析操作类型,包含两个值:OR AND 。

该查询首先会把要查询的内容分词,分词器可以自行定义。同时,文档内容必须满足两个条件才能被查询到:

1、分词后的所有的词项都要被命中

2、字段中的词项和查询中的词项顺序必须一致。

这里我们用两个查询看一下差别,我们用match查询 查询 '三片黄',发现是可以查询到结果的。

08e0c09b37956cbe573031157bf44abf.png

然后,我们换 match_phrase查询,则查询不到结果,因为分词后,顺序不匹配。

3404748e740f79209a19d3d7af673da2.png

match_phrase_prefix查询

match_phrase_prefix查询和 match_phrase比较像,不同的是最后一个词支持前缀匹配。比如我们查询'hello world' 这个词。用 、'hello w'也可以查询到。

查询,

multi_match可以看做是match的升级版,用于搜索多个字段。

我们可以再sku索引上增加一个字段,然后,新增一个商品来试验一下.(为甚不新增一个字段,然后直接修改新增字段这个值?可自己试验一次),我们发现,在'name'、'fullname'这两个字段上搜国药,是可以搜索到结果的。

768a577f4b952e0563301b924dfac2bc.png

同时,multi_match在字段名称上,还支持通配符查询。如下:

e91add5156e7cdcc99c846fe1c239d91.png

另外,multi_match在查询的时候,还可以通过指数符号指定字段的权重值。如下查询,我们会发现返回的sorce值变大了。

db3e01c05ebe3e13419577fe8776ba03.png

常用词项查询,算是一种稍微高级点的查询。所以,想要用好,还是要理解比较多的内容。必须解下停止词(顺手可以把同义词看了)。这个查询比较适合于停用词在语境中有重要作用的场景。按照官方例子来说:not 是个常见的停用词。happy 和 not happy 对比下,not的意义就很重要了。

所以,提供了一种解决方案,把query分词后的词项分成了重要词项和不重要词项。查询的时候,先查询重要词项。一般来说重要词项都是低频词。然后,在进行高频词搜索,这次只计算第一次匹配的文档评分。

词项是高频还是低频,可以自行通过cutoff_frequency来设定。

更高深的用法,可参看官方文档。这个查询可以很好的适应特定领域的停用词。

字符串查询,是对查询内容按运算规则进行分析分解的查询。比如:查询 "xxxxx AND yyyy "会被分解 query xxxx and query yyyyy的形式。这个查询支持的参数非常多,具体参考官方文档。对es搜索原理非常理解估计才能用的飞起。

这个是可以直接拿来用的字符串查询,查询在解析语句的过程中,不会抛出错误。用起放心些。

为了能加深意向,大家可多来几个例子,看到底能不能搜得到:

name: 分词器: 搜索类型: 搜索:

java编程思想 ik term java 思想 编程思想

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

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

相关文章

【学习笔记】第二章——进程同步、进程互斥、进程互斥的硬件/软件实现方法

文章目录一. 进程同步 && 进程互斥四个区域四个原则总结:二. 进程互斥的软件实现方法1)单标志法2)双标志先检查法3)双标志后检查法4)Peterson 算法总结三. 进程互斥的硬件实现方法1)中断屏蔽方法2&…

python的数据结构包括那些_python算法与数据结构-什么是数据结构

一、什么是数据结构 数据结构,直白地理解,就是研究数据的存储方式。 我们知道,数据存储只有一个目的,即为了方便后期对数据的再利用,就如同我们使用数组存储 {1,2,3,4,5} 是为了后期取得它们的值,因此&…

seo自动发外链_一套节约成本全网营销方案-小小课堂SEO培训教程

很多公司都是由一些小型工作室或个人工作室慢慢发展而来的,在这过程中,人员、资金链、资源、项目等因素一旦出现问题,可能会导致项目失败,那么在互联网上投入的资金如果过多,可能都是白白打了水漂。今天,小…

python 支付宝个人账单_金融支付财务融合业务-实践分享1:订单、账单、交易流水、账套知识解构、原理解析...

本文作者从实际工作实践出发,结合案例等分享了电商金融支付财务融合中的基本概念和相关原理解析,包括:订单、账单、交易流水和账知识解构,供大家一同参考和学习。从事电商、进销存、金融、支付、财务的产品同学,是否对…

【学习笔记】第二章——信号量机制 用信号量实现互斥、同步

文章目录一. 信号量机制整型信号量记录型信号量例子:总结二. 用信号量实现互斥、同步互斥同步前驱总结一. 信号量机制 信号量:一个用于表示系统中某种资源的数量的变量(整数 or 记录型变量)一对原语:wait(S) 和 signa…

opengl 安装_一步步学OpenGL(34) -《GLFX,一个OpenGL效果库》

教程 34GLFX,一个OpenGL效果库原文: http://ogldev.atspace.co.uk/www/tutorial34/tutorial34.htmlCSDN完整版专栏: https://blog.csdn.net/cordova/article/category/9266966理论介绍这篇教程暂时先不继续探索OpenGL的特性和3D技术了,来介绍…

【LeetCode笔记】剑指 Offer 60. n个骰子的点数(Java、动态规划)

文章目录题目描述代码 & 思路1. 二维数组(方便理解)2. 一维数组(节约空间)二刷鸽了好久的打题博客~要继续补起来了! 今天不打题,明天变垃圾 QAQ 题目描述 一眼就想先暴力枚举、或者递归呀&…

java 根据圆心计算圆弧上点的经纬度_【控制测量学】-高斯投影正算公式以及java代码

正算公式(将经纬度转化为坐标):java代码(附有源代码和修改后的代码):源代码:/** * 由经纬度反算成高斯投影坐标 * * param longitude * param latitude * return */ public static double[] GaussToBLToGauss( double longitude, double latitude) { …

【LeetCode笔记】剑指 Offer 59 - II. 队列的最大值(Java、辅助队列)

文章目录题目描述思路 && 代码二刷题目描述 恢复打题的第二天打卡~ 可以说是这道最小栈的兄弟题目了,很相似总体思路还是一样,靠空间换时间~也就是借助辅助队列 思路 && 代码 这篇题解的动图做得很好&#xff…

redis setnx原子性_不支持原子性的 Redis 事务也叫事务吗?

文章收录在 GitHub JavaKeeper ,N线互联网开发必备技能兵器谱 假设现在有这样一个业务,用户获取的某些数据来自第三方接口信息,为避免频繁请求第三方接口,我们往往会加一层缓存,缓存肯定要有时效性,假设我们…

【LeetCode笔记】剑指 Offer 67. 把字符串转换成整数 (Java、字符串)

文章目录题目描述思路 && 代码二刷题目描述 老阅读题了,感觉这道题有点类似写业务接口。 思路 && 代码 首先,把情况划分一下: 非正常值,直接给 0(这个实际上可以划分到2的代码中)可取…

详细描述三个适于瀑布模型的项目_信息系统项目管理师-第二三章:信息系统项目管理基础与立项管理2...

三、信息系统项目的生命周期1、项目生命周期的定义—项目从启动、组织与准备、执行到结束所经历的一系列阶段2、★项目生命周期的特征①成本与人力投入在开始时较低,在工作执行期间达到最高,并在项目快要结束时迅速回落②风险与不确定性在项目开始时最大,并在项目的整个生命周期…

【LeetCode笔记】剑指 Offer 64. 求1 + 2 + ... + n (Java、限制语法、二刷)

文章目录题目描述思路 && 代码注释版代码(方便理解):无注释版代码(方便背诵 )二刷题目描述 鬼鬼,又到了我最喜欢的戴着脚镣跳舞环节。 讲道理,我觉得这类题应该整个归纳啥的。。&#x…

虚拟dom_从0到1实现一个虚拟DOM

来源 | https://segmentfault.com/a/1190000021331850要构建自己的虚拟 DOM,需要知道两件事。你甚至不需要深入 React 的源代码或者深入任何其他虚拟 DOM 实现的源代码,因为它们是如此庞大和复杂——但实际上,虚拟 DOM 的主要部分只需不到 50…

【LeetCode笔记】剑指 Offer 31. 栈的压入、弹出序列 (Java、栈)

文章目录题目描述代码 && 思路二刷题目描述 打卡第三天!加油加油~ 数据结构笔试题貌似也会考 ,不过考法不一样,有点规律。总的来说还是挺有意思的,我们直接来看代码吧~ 代码 && 思路 O(…

【LeetCode笔记】剑指 Offer 20. 表示数值的字符串(Java、字符串)

文章目录题目描述思路 && 代码题目描述 呃…比较恶心的一道题,需要读好题,分完情况再下手有看到dalao用有限状态机来做,不过这边还是直接用了我自己的做法 思路 && 代码 ps:这里没有参考题解的写法&#xff…

【LeetCode笔记】剑指 Offer 16. 数值的整数次方(Java、分治)

文章目录题目描述思路 && 代码二刷题目描述 很棒的题目!便于分治思想的理解! 思路 && 代码 分情况是大头~递归结束的情况: x0x^0x0 1x1x^1x1 xx−1^-1−1 1 / x 偶数情况:直接二分递归奇数情况…

网站域名解析端口_环境测试必备,无需注册域名,免费动态IP解析一键解析本地网站...

localtunnel是基于Nodejs 开发的一个工具,开发者同时提供了Go语言版本。这个工具可以提供给你一个随机生成的二级域名,动态域名解析到你执行这个命令的服务器上,可以将域名解析到指定端口上。而且只需要一行代码。localtunnel安装在安装这个工…

【LeetCode笔记】剑指 Offer 33. 二叉树的后序遍历序列(Java、递归、栈)

文章目录题目描述思路 && 代码1. 递归做法2. 辅助栈做法二刷打卡第四天~昨天没来得及写博客 题目描述 无须多言,直接冲思路吧! 思路 && 代码 1. 递归做法 缺点:最差情况下,可能会退化成链表&…

LeetCode笔记】剑指 Offer 35. 复杂链表的复制(Java、哈希表、原地算法)

文章目录题目描述思路 && 代码1. 哈希表法2. 原地算法二刷题目描述 主要有两个考虑点: 不能改变原链表新链表赋予 next、random 时,复制结点不一定存在 思路 && 代码 1. 哈希表法 O(n)、O(n)参考了dalao的写法,这里哈希表…