關於Lucene搜索中查詢器 PhraseQuery 的解釋

    這幾天看Lucene,看到檢索那塊,被PhraseQuery折騰了一陣,那本《Lucene In Action》裏的代碼版本太舊了,也不知是翻譯的問題還是我的理解問題,總之在看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次即可:

   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,就到這裏吧,希望對大家有幫助,如果我理解有誤,也請指出,謝謝~

 

轉自 : http://myzhangjl.blog.sohu.com/95911870.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章