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

  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。

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

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

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

      同理,也就是为什么查询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可以有效利用缓存,以提升性能。

  

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

  3、全文本查询

  全文本查询的说明:

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

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

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

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

  

  4、全文本查询使用

  

  

  

  

、结构化搜索

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

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

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

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

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

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

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

  2、结构化搜索使用

    1)布尔值查询

    

    2)数值范围查询

    

    3)日期范围查询

      日期符号代表的意思:

      y--年;M--月;

      w--周;d--天;

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

    

    4)字段存在查询

    

    

    5)字段多值查询

    

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

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

    

、相关性和相关性算分

  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的评分公式如下:

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

  

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

  6、相关性信息查看

  

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

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

  Boost的含义:

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

    2)当0<boost<1时,打分的权重相对性降低;

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

  大家可关注我的公众号

   

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

ElasticStack学习(九):深入ElasticSearch搜索之词项、全文本、结构化搜索及相关性算分的更多相关文章

  1. Elasticsearch结构化搜索与查询

    Elasticsearch 的功能之一就是搜索,搜索主要分为两种类型,结构化搜索和全文搜索.结构化搜索是指有关查询那些具有内在结构数据的过程.比如日期.时间和数字都是结构化的:它们有精确的格式,我们可 ...

  2. ElasticSearch 2 (13) - 深入搜索系列之结构化搜索

    ElasticSearch 2 (13) - 深入搜索系列之结构化搜索 摘要 结构化查询指的是查询那些具有内在结构的数据,比如日期.时间.数字都是结构化的.它们都有精确的格式,我们可以对这些数据进行逻 ...

  3. ElasticSearch 结构化搜索全文

    1.介绍 上篇介绍了搜索结构化数据的简单应用示例,现在来探寻 全文搜索(full-text search) :怎样在全文字段中搜索到最相关的文档. 全文搜索两个最重要的方面是: 相关性(Relevan ...

  4. ElasticSearch 结构化搜索

    1.介绍 结构化搜索(Structured search) 是指有关探询那些具有内在结构数据的过程.比如日期.时间和数字都是结构化的:它们有精确的格式,我们可以对这些格式进行逻辑操作. 比较常见的操作 ...

  5. ElasticSearch常用结构化搜索

    最近,需要用到ES的一些常用的结构化搜索命令,因此,看了一些官方的文档,学习了一下.结构化查询指的是查询那些具有内在结构的数据,比如日期.时间.数字都是结构化的. 它们都有精确的格式,我们可以对这些数 ...

  6. elasticsearch 深入 —— 结构化搜索

    结构化搜索 结构化搜索(Structured search) 是指有关探询那些具有内在结构数据的过程.比如日期.时间和数字都是结构化的:它们有精确的格式,我们可以对这些格式进行逻辑操作.比较常见的操作 ...

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

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

  8. Elasticsearch 结构化搜索、keyword、Term查询

    前言 Elasticsearch 中的结构化搜索,即面向数值.日期.时间.布尔等类型数据的搜索,这些数据类型格式精确,通常使用基于词项的term精确匹配或者prefix前缀匹配.本文还将新版本的&qu ...

  9. elasticsearch算法之词项相似度算法(一)

    一.词项相似度 elasticsearch支持拼写纠错,其建议词的获取就需要进行词项相似度的计算:今天我们来通过不同的距离算法来学习一下词项相似度算法: 二.数据准备 计算词项相似度,就需要首先将词项 ...

随机推荐

  1. Rails 最佳实践

    在你业务简单的时候,让你简简单单用 ActiveRecord 模型. 复杂的时候,你可以用官方推荐的 Concerns. 更复杂的时候,可以通过 gem 和 API 来拆分. 极端复杂的时候,由于 R ...

  2. WPF ListView 数据懒加载

    实现方式:当滑动条触底时,加载数据 xaml代码: <ListView ScrollViewer.ScrollChanged="ListView_ScrollChanged" ...

  3. vs编译在win xp电脑上运行的win32程序遇到的问题记录(无法定位程序输入点GetTickCount64于动态链接库KERNEL32.dll)

    直接编译后运行,弹出提示框:不是有效的win32应用程序 像之前那样把msvcr110.dll复制过去依然报错: 这是因为vs2012编译的win32程序用到的系统函数在xp环境上对应不上.之前转载的 ...

  4. 【SQL Server】SQL Server占用CPU使用率100%的解决方法

    原文:[SQL Server]SQL Server占用CPU使用率100%的解决方法 近日,帮一个客户解决了服务器CPU占用率高达100%的问题. 以前做的一个某污水处理厂自控系统项目,客户反映其自控 ...

  5. PowerDesigner 在通过jdbc连接数据库时 Could not Initialize JavaVM!

    最近用到PowerDesigner的逆向工程,从数据库中逆向生成模型,本想使用odbc连接的,但是需要安装驱动,mysql的还好弄,oracle对我来讲实在是有些麻烦,看到能用jdbc连接,就想试试, ...

  6. NBU客户端安装失败

    该服务器是阿里云上的centos6.8,是用来做oracle服务器,买来之后进行测试,发现没有安装图形化界面,还有部分包也没有安装.在oracle安装完成之后,尝试安装NBU的客户端,结果发生报错:T ...

  7. Windows 10 UWP开发:如何去掉ListView默认的选中效果

    原文:Windows 10 UWP开发:如何去掉ListView默认的选中效果 开发UWP的时候,很多人会碰到一个问题,就是ListView在被数据绑定之后经常有个默认选中的效果,就像这样: 而且它不 ...

  8. GNU自动化工具使用全过程详解,以及在线手册

    [root@localhost test3]# cat add.h#ifndef _ADD_H_#define _ADD_H_ extern int add(int, int); #endif [ro ...

  9. Delphi下IOC 模式的实现(反转模式,即Callback模式)

    IOC英文为 Inversion of Control,即反转模式,这里有著名的好莱坞理论:你呆着别动,到时我会找你.Ioc模式是解决调用者和被调用者之间关系的模式,可以有效降低软件的耦合度,并适合团 ...

  10. Postman支持的几种数据类型请求方式

    一.postman作为web应用开发工具,可以用于模拟多种请求方式,但是支持的传参类型又不尽相同.根据面板上的几种数据打包方式来选择合适的请求数据类型. form-data 就是http请求中的mul ...