主要知识点:

  • slop的含义(内在原理)
  • slop的用法

 
 

一、slop的含义是什么?

 
 

query string(搜索文本)中的几个term,要经过几次移动才能与一个document匹配,这个移动的次数,就是slop

举例如下:一个query string经过几次移动之后可以匹配到一个document,然后设置slop

假如有如下一句话:hello world, java is very good, spark is also very good.

用java spark进行match phrase去搜索是搜不到这句话的。

下面是java spark的移动过程。

 
 

java                is                very                good                spark                is

 
 

java                spark

java                -->                spark

java                                -->                spark

java                                                -->                spark

 
 

这里的slop,就是3,因为java spark这个短语,spark移动了3次,就可以跟一个doc匹配上了(这个正序的话可以简单理解成他们之间有多少个单词)

这种情况下把slop设置的是3就可以搜索到结果,"slop": 3表示这个搜索请求中最多只允许3次移动,但是如果slop设置的是2,spark最多只允许移动2次,此时跟doc是匹配不上的,那个doc是不会作为结果返回的。

 
 

二、slop的用法

GET /forum/article/_search

{

"query": {

"match_phrase": {

"content": {

"query": "spark data",

"slop": 3

}

}

}

}

 
 

那如果是倒序的情况呢,也就是说如果搜索spark,java时的移动次数是多少呢,经过测试最小的移动次数是5,也就是只有把 slop 设置为5才能返回这条结果。

GET /forum/article/_search

{

"query": {

"match_phrase": {

"content": {

"query": "data spark",

"slop": 5

}

}

}

}

 
 

slop=5的原因如下,以下是移动过程,spark,java要交换位置就要移动2次,所以3+2=5次。

spark                is                                best                big                        data

 
 

data                spark

-->                        data/spark

spark                <--data

spark                -->                                data

spark                                                -->                        data

spark                                                                        -->                        data

 
 

 
 

三、relevance score测试

 
 

GET /forum/article/_search

{

"query": {

"match_phrase": {

"content": {

"query": "java best",

"slop": 15

}

}

}

}

执行结果(部分):

 
 

"_id": "2",

"_score": 0.65380025,

"content": "i think java is the best programming language",

"

}

},

{

"_index": "forum",

"_type": "article",

"_id": "5",

"_score": 0.07111243,

"content": "spark is best big data solution based on scala ,an programming language similar to java spark",

 
 

从上可以看出:slop搜索下,关键词离的越近,relevance score就会越高。和match_query比较也可以看出这两种搜索方法对应的两个文档的分数差距也不一样,match_phrase搜索时两文档分数差距较大,这是由于match_phrase加入了位置计分的原因。

 
 

最后说明:加了slop的phrase match,就是proximity match,近似匹配

19.理解slop的更多相关文章

  1. Liferay7 BPM门户开发之19: 理解Service Builder体系

    Service Builder是Liferay为业务开发而设计的模型驱动(model-driven)平台工具,提供一系列的实体类.数据持久化.服务相关的代码自动生成服务.支持Hibernate and ...

  2. [置顶] Effective STL 学习笔记

    看Effective STL 作的一些笔记,希望对各位有帮助. 以下是50条条款及相关解释. 容器 1. 慎重选择容器类型,根据需要选择高效的容器类型. 2. 不要试图编写独立于容器类型的代码. 3. ...

  3. 拼多多、饿了么、蚂蚁金服Java面试题大集合

    自己当初找工作时参加过众多一线互联网公司的Java研发面试,这段时间处于寒冬,然而前几天跳槽找工作,两天面了3家,已经拿了两个offer,觉得可以和大家分享下: 下面为拼多多.饿了么.蚂蚁金服.哈啰出 ...

  4. Linux常用性能工具功能、用法及原理(一)

    Linux性能观测工具按类别可分为系统级别和进程级别,系统级别对整个系统的性能做统计,而进程级别则具体到进程,为每个进程维护统计信息. 按实现原理分,可分为基于计数器和跟踪以及剖析.含义如下: 计数器 ...

  5. JAVA常用基础知识点[继承,抽象,接口,静态,枚举,反射,泛型,多线程...]

    类的继承 Java只支持单继承,不允许多重继承- 一个子类只能有一个父类- 一个父类可以派生出多个子类这里写图片描述子类继承了父类,就继承了父类的方法和属性.在子类中,可以使用父类中定义的方法和属性, ...

  6. 【转】Flash:同志们,这些知识点你们知道多少?(一些必备的Flash开发知识点)

    1.理解flash的显示列表                2.理解事件冒泡,理解鼠标事件等        3.理解flash的性能瓶颈和大多数影响性能的地方4.理解帧跑道模型,知道timer和ent ...

  7. JavaScript变量不同类型之间的自动、手动类型转换

    转换成字符型:toString() var str = 123; str.toString();转换成字符串 将str从数值型变成字符型       浮点数:         电脑在运算过程中以正确的 ...

  8. STL学习笔记(三) 关联容器

    条款19:理解相等(equality)和等价(equivalence)的区别 相等的概念是基于 operator== 的,如果 operator== 的实现不正确,会导致并不实际相等等价关系是以&qu ...

  9. SICP 习题解 第二章

    计算机程序的构造和解释习题解答 Structure and Interpretation os Computer Programs Exercises Answer 第二章 构造数据抽象 练习2.17 ...

随机推荐

  1. xcode,git tips

    change organization name 选中project or target,最右侧Utilities面板->Project Document 修改source folder名字 - ...

  2. WPF学习笔记:获取ListBox的选中项

    有代码有J8: UI <UserControl x:Class="UnitViews.UserListUV" xmlns="http://schemas.micro ...

  3. to prof. Choi

    Dear Prof. Choi It is my great pleasure to receive your reply ,but terribly sorry for my late reply ...

  4. ALSA声卡驱动中的DAPM详解之四:在驱动程序中初始化并注册widget和route

    前几篇文章我们从dapm的数据结构入手,了解了代表音频控件的widget,代表连接路径的route以及用于连接两个widget的path.之前都是一些概念的讲解以及对数据结构中各个字段的说明,从本章开 ...

  5. padding valid same区别——就是是否补齐0的问题

    参考:https://stackoverflow.com/questions/37674306/what-is-the-difference-between-same-and-valid-paddin ...

  6. Python3基础复习

    目录 基本语法 运算符 输出格式 数据类型 数据结构 函数 面向对象 补充 异常 模块和包 文件 时间 线程和进程 基本语法 基本语法只列举与Java不一样的. 运算符 and, or而非 & ...

  7. PCB genesis自制孔点 Font字体实现方法

    一.先看genesis原有Font字体 在PCB工程CAM加孔点字体要求时,通常我们直接用Geneis软件给我们提供了2种孔点字体canned_57与canned_67,但此字体可能不能满足各个工厂个 ...

  8. JavaScript正则表达式(一)-常用方法

    公司之前有个胖女孩说你竟然会正则? 其实正则没那么难:今天我们说说他常用的几个API. 在讲方法之前, 我们先对正则表达式做一个基本的了解: 1.正则表达式定义使用单个字符串来描述.匹配一系列符合某个 ...

  9. 【洛谷4933】大师(DP)

    题目: 洛谷4933 分析: (自己瞎yy的DP方程竟然1A了,写篇博客庆祝一下) (以及特斯拉电塔是向Red Alert致敬吗233) 这里只讨论公差不小于\(0\)的情况,小于\(0\)的情况进行 ...

  10. [转]linux之pr命令

    转自:http://www.bitscn.com/plus/view.php?aid=6638 本文介绍如何使用Linux的pr命令将大文件分割成多个页面进行打印,并在每个页面上加上标题. Linux ...