对Lucene PhraseQuery的slop的理解[转载]
所谓PhraseQuery,就是通过短语来检索,比如我想查“big car”这个短语,那么如果待匹配的document的指定项里包含了"big car"这个短语,这个document就算匹配成功。可如果待匹配的句子里包含的是“big black car”,那么就无法匹配成功了,如果也想让这个匹配,就需要设定slop,先给出slop的概念:slop是指两个项的位置之间允许的最大间隔距离,下面我举例来解释:
我的待匹配的句子是:the quick brown fox jumped over the lazy dog.
例1: 如果我想用“quick fox”来匹配出上面的句子,我发现原句里是quick [brown] fox,就是说和我的“quick fox”中间相差了一个单词的距离,所以,我这里把slop设为1,表示quick和fox这两项之间最大可以允许有一个单词的间隔,这样所有“quick [***] fox”就都可以被匹配出来了。
例2:如果我想用“fox quick”来匹配出上面的句子,这也是可以的,不过比例1要麻烦,我们需要看把“fox quick”怎么移动能形成“quick [***] fox”,如下表所示,把fox向右移动3次即可:
fox | quick | |||
1 | fox|quick | |||
2 | quick | fox | ||
3 | quick | fox |
例3:如果我想用“lazy jumped quick”该如何匹配上面的句子呢?这个比例2还要麻烦,我们要考虑3个单词,不管多少个单词,slop表示的是间隔的最大距离,详细起见,我们分别来看每种组合:(我的待匹配的句子是:the quick brown fox jumped over the lazy dog.)
- lazy jumped:原句是jumped [over] [the] lazy,就是说它们两个之间间隔了2个词,如下所示:需要把lazy向右移动4位
lazy | jumped | ||||
1 | lazy|jumped | ||||
2 | jumped | lazy | |||
3 | jumped | lazy | |||
4 | jumped | lazy |
- lazy jumped quick:我们主要看lazy和quick,但是由于jumped是在中间,所以移动的时候还是要把jumped考虑在内,原句里lazy和quick的关系是:quick [brown] [fox] [jumped] [over] [the] lazy ,quick lazy中间间隔了5个词,所以如下图所示,把lazy向右移动8次
lazy |
jumped |
quick | |||||||
1 |
lazy|jumped |
quick |
|||||||
2 |
jumped |
lazy|quick |
|||||||
3 |
jumped |
quick |
lazy |
||||||
4 |
jumped |
quick |
lazy |
||||||
5 |
jumped |
quick |
lazy |
||||||
6 |
jumped |
quick |
lazy |
||||||
7 |
jumped |
quick |
lazy |
||||||
8 |
jumped |
quick |
lazy |
- 最后是jumped qucik,这里不详细画表格了,大家可以自己试试,应该是把jumped向右移动4次。
综合以上3种情况,所以我们需要把slop设为8才令“lazy jumped quick”可以匹配到原句。
OK,就到这里吧,希望对大家有帮助,如果我理解有误,也请指出,谢谢~
首先,强调一下PhraseQuery对象,这个对象不属于跨度查询类,但能完成跨度查询功能。
匹配到的文档所包含的项通常是彼此相邻的,考虑到原文档中在查询项之间可能有一些中间项,或为了能查询倒排的项,PhraseQuery设置了slop因子,但是这个slop因子指2个项允许最大间隔距离,不是传统意义上的距离,是按顺序组成给定的短语,所需要移动位置的次数,这表示PhraseQuery是必须按照项在文档中出现的顺序计算跨度的,如quick brown fox为文档,则quick fox2个项的slop为1,quick向后移动一次.而fox quick需要quick向后移动3次,所以slop为3
其次,来看一下SpanQuery的子类SpanTermQuery。
它能跨度查询,并且不一定非要按项在文档中出现的顺序,可以用一个独立的标记表示查询对象必须按顺序,或允许按倒过来的顺序完成匹配。匹配的跨度也不是指移动位置的次数,是指从第一个跨度的起始位置到最后一个跨度的结束位置。
在SpanNearQuery中将SpanTermQuery对象作为SpanQuery对象使用的效果,与使用PharseQuery的效果非常相似。在SpanNearQuery的构造函数中的第三个参数为inOrder标志,设置这个标志,表示按项在文档中出现的顺序倒过来的顺序。
如:the quick brown fox jumps over the lazy dog这个文档
public void testSpanNearQuery() throws Exception{
SpanQuery[] quick_brown_dog=new SpanQuery[]{quick,brown,dog};
SpanNearQuery snq=new SpanNearQuery(quick_brown_dog,0,true);//按正常顺序,跨度为0,对三个项进行查询
assertNoMatches(snq);//无法匹配
SpanNearQuery snq=new SpanNearQuery(quick_brown_dog,4,true);//按正常顺序,跨度为4,对三个项进行查询
assertNoMatches(snq);//无法匹配
SpanNearQuery snq=new SpanNearQuery(quick_brown_dog,4,true);//按正常顺序,跨度为5,对三个项进行查询
assertOnlyBrownFox(snq);//匹配成功
SpanNearQuery snq=new SpanNearQuery(new SpanQuery[]{lazy,fox},3,false);//按相反顺序,跨度为3,对三个项进行查询
assertOnlyBrownFox(snq);//匹配成功
//下面使用PhraseQuery进行查询,因为是按顺序,所以lazy和fox必须要跨度为5
PhraseQuery pq=new PhraseQuery();
pq.add(new Term("f","lazy"));
pq.add(new Term("f","lazy"));
pq.setslop(4);
assertNoMatches(pq);//跨度4无法匹配
//PharseQuery,slop因子为5
pq.setSlop(5);
assertOnlyBrownFox(pq);
}
3.PhrasePrefixQuery 主要用来进行同义词查询的: IndexWriter writer = new IndexWriter(directory, new WhitespaceAnalyzer(), true); Document doc1 = new Document(); doc1.add(Field.Text("field", "the quick brown fox jumped over the lazy dog")); writer.addDocument(doc1); Document doc2 = new Document(); doc2.add(Field.Text("field","the fast fox hopped over the hound")); writer.addDocument(doc2);
PhrasePrefixQuery query = new PhrasePrefixQuery(); query.add(new Term[] {new Term("field", "quick"), new Term("field", "fast")}); query.add(new Term("field", "fox"));
Hits hits = searcher.search(query); assertEquals("fast fox match", 1, hits.length()); query.setSlop(1); hits = searcher.search(query); assertEquals("both match", 2, hits.length());
对Lucene PhraseQuery的slop的理解[转载]的更多相关文章
- (转)对Lucene PhraseQuery的slop的理解
所谓PhraseQuery,就是通过短语来检索,比如我想查"big car"这个短语,那么如果待匹配的document的指定项里包含了"big car"这个短语 ...
- Oracle中B-TREE索引的深入理解(转载)
索引概述 索引与表一样,也属于段(segment)的一种.里面存放了用户的数据,跟表一样需要占用磁盘空间.只不过,在索引里的数据存放形式与表里的数据存放形式非常的不一样.在理解索引时,可以想象一本书, ...
- 谈谈对Spring IOC的理解(转载)
学习过Spring框架的人一定都会听过Spring的IoC(控制反转) .DI(依赖注入)这两个概念,对于初学Spring的人来说,总觉得IoC .DI这两个概念是模糊不清的,是很难理解的,今天和大家 ...
- upper_bound()和low_bound函数的基本使用和理解(转载,已获博主授权)
版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/sdz20172133/article/details/80101838 前提:一个非降序列!!!!! ...
- mysql索引最左匹配的理解(转载于知乎回答)
作者:沈杰链接:https://www.zhihu.com/question/36996520/answer/93256153来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出 ...
- SVD分解的理解[转载]
http://www.bfcat.com/index.php/2012/03/svd-tutorial/ SVD分解(奇异值分解),本应是本科生就掌握的方法,然而却经常被忽视.实际上,SVD分解不但很 ...
- Android View.onMeasure方法的理解(转载)
一下内容转载自http://blog.sina.com.cn/s/blog_61fbf8d10100zzoy.html View在屏幕上显示出来要先经过measure(计算)和layout(布局).1 ...
- Android中Matrix的pre post set方法理解(转载来源:Linux社区 作者:zjmdp)
虽说以前学习过线性代数和图形学原理,但是在实际中碰到matrix还是疑惑了好一阵子,今天通过向同事请教终于找到一点门路,特总结如下: Matrix主要用于对平面进行缩放,平移,旋转以及倾斜操作,为简化 ...
- WS_CLIPCHILDREN和WS_CLIPSIBLINGS的理解(转载)
1.1 WS_CLIPCHILDREN WS_CLIPCHILDREN样式从字面上可以理解成ClipChildren,裁减子窗口. MSDN里的E文解释:Excludes the area occup ...
随机推荐
- C#总结(一)
学C#也有两年多了,发现如果不总结一下,很多C#的知识都会忘掉,所以希望写这系列的文章来总结一下C#的基础知识.如果有写错或者不足的地方,希望可以提出纠正. C#可以说是依附在.NET Framewo ...
- keydown和keypress
常见的键盘事件是keyup和keydown.淡蓝就经常用 document.onkeyup = function (e) { if ((e.keyCode || e.which) === 13) // ...
- mysql对GIS空间数据的支持,包括创建空间索引
CREATE TABLE tb_geo( id INT PRIMARY KEY AUTO_INCREMENT, NAME ) NOT NULL, pnt POINT NOT NULL, SPATIAL ...
- C++中的虚函数
代码: #include <iostream> #include <cstring> using namespace std; class Base{ public: virt ...
- Stata和Matlab联合处理金融数据
Stata是统计学专业软件,可以很方便的对数据处理,但几乎只能按照整行整列进行,而且每次只能加载一个矩阵(dta文件),如果要用到多个矩阵数据进行操作或进行复杂的循环控制,就力不从心了. 而Matla ...
- [Mugeda HTML5技术教程之14]案例分析:制作网页游戏
本文档要分析的案例是一个爱消除的网页小游戏,从中可以体会一些Mugeda API的用法和使用Mugeda动画制作网页游戏的方法. (一)游戏规则: 1.开始游戏时,手机出现在最上面一行的任意一格: 2 ...
- Mysql 插入记录时检查记录是否已经存在,存在则更新,不存在则插入记录SQL
我们在开发数据库相关的逻辑过程中, 经常检查表中是否已经存在这样的一条记录, 如果存在则更新或者不做操作, 如果没有存在记录,则需要插入一条新的记录. 这样的逻辑固然可以通过两条sql语句完成. SE ...
- shell操作mysql
参考: http://blog.csdn.net/hbcui1984/article/details/5125387
- Linux网络编程--多播
一.多播介绍 什么是多播? 单播用于两个主机之间的端对端通信,广播用于一个主机对整个局域网上所有主机上的数据通信.单播和广播是两个极端,要么对一个主机进行通信,要么对整个局域网上的主机进行通信.实际情 ...
- 平时的笔记02:处理mp3
#! /usr/bin/env python # # mutagen aims to be an all purpose media tagging library # Copyright (C) 2 ...