所谓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,表示quickfox这两项之间最大可以允许有一个单词的间隔,这样所有“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:我们主要看lazyquick,但是由于jumped是在中间,所以移动的时候还是要把jumped考虑在内,原句里lazyquick的关系是: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());

转载于:https://www.cnblogs.com/fabaoyi/p/3894244.html

对Lucene PhraseQuery的slop的理解[转载]相关推荐

  1. 对Lucene PhraseQuery的slop的理解

    2019独角兽企业重金招聘Python工程师标准>>> 所谓PhraseQuery,就是通过短语来检索,比如我想查"big car"这个短语,那么如果待匹配的do ...

  2. 卷积神经网络VGG16权重数量的计算和理解(转载)

    VGG16网络结构是: _________________________________________________________________ Layer (type)           ...

  3. 对于超平面的理解[转载]

    转自:https://blog.csdn.net/dengheCSDN/article/details/77313758 1.引言 n 维空间中的超平面由下面的方程确定: 其中,w 和 x 都是 n ...

  4. WS_CLIPCHILDREN和WS_CLIPSIBLINGS的理解(转载)

    1.1 WS_CLIPCHILDREN WS_CLIPCHILDREN样式从字面上可以理解成ClipChildren,裁减子窗口. MSDN里的E文解释:Excludes the area occup ...

  5. 关于v$process与v$session中process的理解(转载)

    http://www.itpub.net/thread-1077321-1-1.html(出处) 关于v$process与v$session中process的理解 说明 v$session有个proc ...

  6. 简书上的大牛总结的 ServerSocket Accept() 的确是阻塞方法 与猜想一致 一些理解 转载如下

    当我们调用如下代码的时候,实际java封装了很多层调用 图1 new ServerSocket(9876) 这个构造函数的内部,会调用 bind() 以及 listen() 等系统调用,之后才是 ac ...

  7. 依赖注入和控制反转的理解(转载)

    学习过Spring框架的人一定都会听过Spring的IoC(控制反转) .DI(依赖注入)这两个概念,对于初学Spring的人来说,总觉得IoC .DI这两个概念是模糊不清的,是很难理解的,今天和大家 ...

  8. 软件框架的理解(转载)

    如何去掌握Architecture的构建.但是这些发言纯粹是一种学术性的见解,和实际中的情况基本完全不符合,到不是我不联系实际,而是实际上国内的公司基本上还都处于一种很无知而盲目的境地. Archit ...

  9. 数据流和数据报的理解(转载)

    文章目录 1. TCP 2. UDP 3. 为什么 4. 参考文献 "TCP是一种流模式的协议,UDP是一种数据报模式的协议",这句话相信大家对这句话已经耳熟能详~但是," ...

最新文章

  1. 二分查找的递归与非递归!
  2. 算法竞赛进阶指南--快速幂,求a^b mod p
  3. 95-130-346-源码-source-kafka相关-KafkaConsumerThread
  4. Docker升级Wekan
  5. 保险H5页面、新增模板设计记录
  6. 物理机是什么?跟云服务器有什么区别
  7. 地表反射率影响因素_【专题突破】影响气候形成的因素及主要气候判别(高中地理),务必掌握!...
  8. mx播放器有没有投屏功能_手机太小看电视不方便?教你一招迅速投屏到电视
  9. php货币2019年12月31日汇率,2019年12月31日中国外汇交易中心受权公布人民币汇率中间价公告...
  10. Jbuilder2005破解补丁使用方法和下载地址
  11. 如何搭建一个在线教育平台
  12. Python使用pyinstaller打包成exe文件,并支持传入外部参(已解决打包后文件大的情况)
  13. Ubuntu 10.10 安装谷歌拼音输入法~
  14. 大数据千亿级离线数仓项目第一天 环境部署和etl
  15. 3D dungeon(BFS)
  16. 短视频文案怎么写?优质短视频文案写作技巧
  17. Android MIFARE读写器详解2
  18. scrapy组件、中间件、spider中类方法from_crawler的作用
  19. 紫色背景简洁登录页面模板
  20. 力扣算法学习(十四)

热门文章

  1. python项目实战_2个Python入门级的实战项目
  2. 多线程java_Java多线程基础
  3. 参考用-惯性导航系统简介(转载)
  4. C语言 | C51实现NRF905收发设计(完整源代码)
  5. 服务器会自动创建cookie,网站的cookie机制是什么
  6. Windows SDK编程 API入门系列(转)
  7. 用python定位手机_使用Python定位android和iphone
  8. 统计学习方法 pdf_机器学习的入门宝典!《统计学习方法》的代码实现
  9. iphone保修期多久_卖疯了!开发区9.9元起换iphone原厂电池!
  10. php mysql获取新添加记录的id值_PHP获取MySql新增记录ID值的方法