MySQL 全文搜索 相关度_ElasticStack学习(九):深入ElasticSearch搜索之词项、全文本、结构化搜索及相关性算分...

一、基于词项与全文的搜索

1、词项

Term(词项)是表达语意的最小单位,搜索和利用统计语言模型进行自然语言处理都需要处理Term。

Term的使用说明:

1)Term Level Query:Term Query、Range Query、Exists Query、Prefix Query、Wildcard Query;

2)在ES中,对于Term查询的输入是不做分词处理的,会将输入作为一个整体,在倒排索引中查找准确的词项,并且使用相关度算分公式为每个包含该词项的文档进行相关度算分;

3)通过Constant Score将查询转换成一个Filtering,以避免处分,利用缓存,提高查询性能;

2、词项查询使用

1)批量创建一个索引,并插入数据,查看该索引的mapping,会发现相应字段是text类型,同时有子字段keyword。

83b932eb55b03be904744b0c2526cd9f.png

2)现进行对name或stuId字段的查询。

e3df308576b559fd4fae95324aec6ab0.png

01f68e57862a052e8f7be8235887511e.png

fc5cb13624d5ca077a471f0611380b5e.png

390b3665f4dca7a9cc6660ef6d730021.png

aa9c993201bcc5b0f73cf29035ed810f.png

3)通过上述对两个字段不同查询条件的,以及查询方式的对比,我们可以总结如下:

a)对于字段类型为text的字段,其会按照默认analyzer进行分词,如下图所示:STU-001被分词为两个stu和001,所以当查询stu-001或者STU-001是,是无法被索引到相当的文档上去的;

c92ae48ea0759c29725d5b002b14a8c7.png

同理,也就是为什么查询name时,用john可以查询到,用John就无法查询到的原因。因为默认analyzer:standard会将字段name中的大写字母转化为小写,而当以Term方式查询John,Term因为不做分词处理(原样查询),也就无法查询到能够匹配John的信息。而用john查询正好可以查询到相应的文档。

b)基于此种情况下,用stuId.keyword或者name.keyword,进行原样查询信息查询时,就可以查询到相应的文档。 这是因为相应字段中的子字段keyword是不做分词处理的,所以如果要查询字段中原始内容一样的信息时,要加上column.keyword。

4)词项算分使用

通过上图中的查询结果可以看到,相应结果有一个指标_score,这是相应查询文档的算分。

如果在查询中,希望跳过算分的过程,忽略TF-IDF(TF【词频】:Term Frequency;IDF【逆文本频率指数】:Inverse Document Frequency)的计算,以避免相关性算分而引发的性能开销,可以使用constant_score转化为Filter,取消算分的环节。同时Filter可以有效利用缓存,以提升性能。

117ad858e986d67d75b49686e2c32e05.png

从上图查询结果可以得到,_score分数为1.0。

3、全文本查询

全文本查询的说明:

1)基于全文本查询有:Match Query、Match Phrase Query、Query String Query;

2)索引与搜索时都会进行分词,查询字符串会先传递给一个合适的分词器,然后生成一个供查询的词项列表;

3)查询时,会对输入的查询进行分词,然后每个词项逐个进行查询,同时为每个文档生成一个算分,最终将结果进行合并。例如对STU-001进行查询,若采用默认analyzer,会对相应字段进行stu或001的查询;

4)如果想对某个字段做精准查询,不想做分词处理,可以在mapping当中,将相应字段由text类型定义成keyword类型;

cb02d535f8d20dd19c2a18ff4a047a00.png

4、全文本查询使用

421959a27a9c3ceeaf4a4391f54552db.png

9e0bc90ed9394976a73a68db8103602d.png

168f188706ea34ffb472dc4bc939f385.png

738211dbda398be9634216e8738f0719.png

二、结构化搜索

结构化数据:日期、数值、布尔都是结构化数据,对于一些文本也是可以为结构化的,比如:对于商品的唯一标识符、商品的标签标注、颜色集合等。

结构化搜索:就是指对结构化数据的搜索。

1、对于结构化数据的说明:

1)对于结构化数据可以进行逻辑操作,比如区间范围的查询、数据大小的比对;

2)结构化的文本可以做精确匹配(Term查询)或部分匹配(Prefix前缀查询);

注意:对于Term的模糊查询,建议谨慎使用,有时性能不够好。

3)结构化结果只有“是”或“否”两个值,根据场景需要,可以决定对结构化搜索是否要打分;

2、结构化搜索使用

1)布尔值查询

c6eb06ca575dd346cb44b3a25faa0363.png

2)数值范围查询

2d3171b4d133ab1d773154a29434b033.png

3)日期范围查询

日期符号代表的意思:

y--年;M--月;

w--周;d--天;

H/h--小时;m--分钟;s--秒;

093e2fffc981f9e330264737738fb295.png

4)字段存在查询

2eb0d0cdcfc61c922bc944dad9389225.png

8fb70e09c09e8c1c4567b71d55e8aeb3.png

5)字段多值查询

b8e5d3bc53a6013ac18c1643164f4faf.png

通过上图中可以看到,在基于Term的多值查询中,查询某个字段的值,并不是完全的相等处理,而是一种包含关系。

如果想做精确的匹配,需要在index的文档中增加一个统计字段,结合布尔查询,做出精确匹配,如下图所示:

ccae6a4b89d486121d61d57ee38e2046.png

三、相关性和相关性算分

1、相关性:就是一个文档与查询语句匹配的程度;

相关性算分:针对匹配程度,ES会对每个匹配查询的结果进行打分,打分的本质就是排序,将把最符合用户需求的文档排在前面。

在ES5.0之前,默认的相关性算分算法是TF-IDF,之后采用的是BM25算法。

2、Term Frequency(TF:词频):就是指检索词在一篇文档中出现的频率,也就是检索词出现的次数除以文档的总字数;

度量一条查询与结果文档相关性的方法:将搜索中每一个词的TF进行相加,如“ES的特点”,分完词后进行的词频相加,TF(ES)+TF(的)+TF(特点);

对于一些停用词,如“的”在文档中出现多次,但对于查询相关度的贡献并不是很大,所以不应该考虑这些词的TF;

3、Document Frequency(DF:文档频率):检索词在所有文档中出现的频率;

Inverse Document Frequency(IDF:逆文档频率):通过公式:log(全部文档数/检索词出现过的文档总数)

TF-IDF本质上是将TF的求和变成了加权求和:TF(ES)*IDF(ES)+TF(的)*IDF(的)+TF(特点)*IDF(特点)

4、在Lucene中,TF-IDF的评分公式如下:

bd491a4c343ca506ff4e1657f056041b.png

5、ES5.0之后,算法从TF-IDF变为BM25,如下图所示:

5ce28f424d410f3e9d4fa622a0fd6f27.png

TF-IDF当随着TF无限增长时,那算分也不会不断的增长。而BM25算法进行了优化,随着TF的无限增长,算分会逐渐的趋于一个数值。

6、相关性信息查看

daca08878311436d5e76d1c81a3c4802.png

通过图中可以看到,因为第二条记录比第一条记录的文档内容短,而导致其tf较高,因此最后的算法也相对于第一条算分高一些,因此在搜索结果顺序上,第二条排在上面。

Boosting是控制相关度的一种手段,在索引和字段上都是可以设置的。

Boost的含义:

1)当boost>1时,打分的相关度相对性提升;

2)当0

3)当boost<0时,贡献为负分;

大家可关注我的公众号

知识学习来源:阮一鸣:《Elasticsearch核心技术与实战》

原文出处:https://www.cnblogs.com/supersnowyao/p/11201277.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值