欢迎访问 生活随笔!

凯发ag旗舰厅登录网址下载

当前位置: 凯发ag旗舰厅登录网址下载 > > 编程问答 >内容正文

编程问答

对lucene phrasequery的slop的理解[转载] -凯发ag旗舰厅登录网址下载

发布时间:2025/1/21 编程问答 6 豆豆
凯发ag旗舰厅登录网址下载 收集整理的这篇文章主要介绍了 对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,表示quickfox这两项之间最大可以允许有一个单词的间隔,这样所有“quick [***] fox”就都可以被匹配出来了。

   例2:如果我想用“fox quick”来匹配出上面的句子,这也是可以的,不过比例1要麻烦,我们需要看把“fox quick”怎么移动能形成“quick [***] fox”,如下表所示,把fox向右移动3次即可:

 foxquick  
1 fox|quick  
2 quickfox 
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位

 

 

 lazyjumped   
1 lazy|jumped   
2 jumpedlazy  
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

总结

以上是凯发ag旗舰厅登录网址下载为你收集整理的对lucene phrasequery的slop的理解[转载]的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得凯发ag旗舰厅登录网址下载网站内容还不错,欢迎将凯发ag旗舰厅登录网址下载推荐给好友。

  • 上一篇:
  • 下一篇:
网站地图