對Lucene PhraseQuery的slop的理解(轉載)
Posted on 2011-02-25 13:51 瘋狂 閱讀(1918) 評論(0) 編輯 收藏 所屬分類: java 、apache項目 、lucene這幾天看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,表示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”可以匹配到原句。