主要知识点:

  • 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. tiny4412学习(四)之移植linux-设备树(1)设备树基础知识及GPIO中断【转】

    本文转载自:http://blog.csdn.net/fengyuwuzu0519/article/details/74177978 版权声明:本文为博主原创文章,转载请注明http://blog.c ...

  2. 项目中如何使用NuGet添加类库

    在项目上右键-->Manage NuGet Packages Browse  可以去搜索想要添加到项目的类库 Installed  已经添加到项目的类库 Updates   需要更新的类库

  3. luogu 3796 【模板】AC自动机(加强版)

    我太菜了 棒神%%% #include<iostream> #include<cstdio> #include<cmath> #include<cstdlib ...

  4. FSDataInputStream对象 读取数据

  5. JAVA基础(多线程Thread和Runnable的使用区别(转载)

    转自:http://jinguo.iteye.com/blog/286772 Runnable是Thread的接口,在大多数情况下“推荐用接口的方式”生成线程,因为接口可以实现多继承,况且Runnab ...

  6. PCB 挺有意思的基数排序----C#代码实现

    今天在头条看一个很有意思的排序算法[基数排序],以前所学习的排序算法都是基于数值对比的方式排序的,而这个算法挺有意思的非常独特.但从网上看到的例子通常是对个位,十位处理,并转为对应的桶索引的方式实现, ...

  7. 利用hexo来配合nginx来打造属于自己的纯静态博客系统

    什么是静态网站生成器?顾名思义,就是以最快的速度生成一个高可用的web页面,我们知道Django作为一款非常流行的框架被广泛应用,但是部署起来实在是太麻烦了,各种命令各种配置,动态页面必然要涉及数据库 ...

  8. 简单认识http协议

    1.什么是TCP/IP  如果要了解一个人,可以从他归属的集体聊起来.我们的HTTP协议就属于TCP/IP协议家族中的一员,了解HTTP协议再整个网络流程中的地位,也能更加充分的理解HTTP协议. 要 ...

  9. 【洛谷1117_BZOJ4650】[NOI2016] 优秀的拆分(哈希_后缀数组_RMQ)

    题目: 洛谷1117 分析: 定义把我校某兔姓神犇Tzz和他的妹子拆分,为"优秀的拆分" 随便写个哈希就能有\(95\)分的好成绩-- 我的\(95\)分做法比fei较chang奇 ...

  10. 题解报告:hdu 1285 确定比赛名次

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1285 Problem Description 有N个比赛队(1<=N<=500),编号依次 ...