日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

对Lucene PhraseQuery的slop的理解

發(fā)布時(shí)間:2025/3/17 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 对Lucene PhraseQuery的slop的理解 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

2019獨(dú)角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>

所謂PhraseQuery,就是通過短語來檢索,比如我想查“big car”這個(gè)短語,那么如果待匹配的document的指定項(xiàng)里包含了"big car"這個(gè)短語,這個(gè)document就算匹配成功。可如果待匹配的句子里包含的是“big black car”,那么就無法匹配成功了,如果也想讓這個(gè)匹配,就需要設(shè)定slop,先給出slop的概念:slop是指兩個(gè)項(xiàng)的位置之間允許的最大間隔距離,下面我舉例來解釋:

?? 我的待匹配的句子是:the quick brown fox jumped over the lazy dog.

例1: 如果我想用“quick fox”來匹配出上面的句子,我發(fā)現(xiàn)原句里是quick [brown] fox,就是說和我的“quick fox”中間相差了一個(gè)單詞的距離,所以,我這里把slop設(shè)為1,表示quickfox這兩項(xiàng)之間最大可以允許有一個(gè)單詞的間隔,這樣所有“quick [***] fox”就都可以被匹配出來了。

例2:如果我想用“fox quick”來匹配出上面的句子,這也是可以的,不過比例1要麻煩,我們需要看把“fox quick”怎么移動(dòng)能形成“quick [***] fox”,如下表所示,把fox向右移動(dòng)3次即可:

例3:如果我想用“lazy jumped quick”該如何匹配上面的句子呢?這個(gè)比例2還要麻煩,我們要考慮3個(gè)單詞,不管多少個(gè)單詞,slop表示的是間隔的最大距離,詳細(xì)起見,我們分別來看每種組合:(我的待匹配的句子是:the quick brown fox jumped over the lazy dog.)

  • lazy jumped:原句是jumped [over] [the] lazy,就是說它們兩個(gè)之間間隔了2個(gè)詞,如下所示:需要把lazy向右移動(dòng)4位

  • lazy jumped quick:我們主要看lazyquick,但是由于jumped是在中間,所以移動(dòng)的時(shí)候還是要把jumped考慮在內(nèi),原句里lazyquick的關(guān)系是:quick [brown] [fox] [jumped] [over] [the] lazy ,quick lazy中間間隔了5個(gè)詞,所以如下圖所示,把lazy向右移動(dòng)8次
  • 最后是jumped qucik,這里不詳細(xì)畫表格了,大家可以自己試試,應(yīng)該是把jumped向右移動(dòng)4次。

?? 綜合以上3種情況,所以我們需要把slop設(shè)為8才令“lazy jumped quick”可以匹配到原句。

OK,就到這里吧,希望對(duì)大家有幫助,如果我理解有誤,也請(qǐng)指出,謝謝~

首先,強(qiáng)調(diào)一下PhraseQuery對(duì)象,這個(gè)對(duì)象不屬于跨度查詢類,但能完成跨度查詢功能。

匹配到的文檔所包含的項(xiàng)通常是彼此相鄰的,考慮到原文檔中在查詢項(xiàng)之間可能有一些中間項(xiàng),或?yàn)榱四懿樵兊古诺捻?xiàng),PhraseQuery設(shè)置了slop因子,但是這個(gè)slop因子指2個(gè)項(xiàng)允許最大間隔距離,不是傳統(tǒng)意義上的距離,是按順序組成給定的短語,所需要移動(dòng)位置的次數(shù),這表示PhraseQuery是必須按照項(xiàng)在文檔中出現(xiàn)的順序計(jì)算跨度的,如quick brown fox為文檔,則quick fox2個(gè)項(xiàng)的slop為1,quick向后移動(dòng)一次.而fox quick需要quick向后移動(dòng)3次,所以slop為3

其次,來看一下SpanQuery的子類SpanTermQuery。

它能跨度查詢,并且不一定非要按項(xiàng)在文檔中出現(xiàn)的順序,可以用一個(gè)獨(dú)立的標(biāo)記表示查詢對(duì)象必須按順序,或允許按倒過來的順序完成匹配。匹配的跨度也不是指移動(dòng)位置的次數(shù),是指從第一個(gè)跨度的起始位置到最后一個(gè)跨度的結(jié)束位置。

在SpanNearQuery中將SpanTermQuery對(duì)象作為SpanQuery對(duì)象使用的效果,與使用PharseQuery的效果非常相似。在SpanNearQuery的構(gòu)造函數(shù)中的第三個(gè)參數(shù)為inOrder標(biāo)志,設(shè)置這個(gè)標(biāo)志,表示按項(xiàng)在文檔中出現(xiàn)的順序倒過來的順序。

如:the quick brown fox jumps over the lazy dog這個(gè)文檔

public void testSpanNearQuery() throws Exception{

SpanQuery[] quick_brown_dog=new SpanQuery[]{quick,brown,dog};

SpanNearQuery snq=new SpanNearQuery(quick_brown_dog,0,true);//按正常順序,跨度為0,對(duì)三個(gè)項(xiàng)進(jìn)行查詢

assertNoMatches(snq);//無法匹配

SpanNearQuery snq=new SpanNearQuery(quick_brown_dog,4,true);//按正常順序,跨度為4,對(duì)三個(gè)項(xiàng)進(jìn)行查詢

assertNoMatches(snq);//無法匹配

SpanNearQuery snq=new SpanNearQuery(quick_brown_dog,4,true);//按正常順序,跨度為5,對(duì)三個(gè)項(xiàng)進(jìn)行查詢

assertOnlyBrownFox(snq);//匹配成功

SpanNearQuery snq=new SpanNearQuery(new SpanQuery[]{lazy,fox},3,false);//按相反順序,跨度為3,對(duì)三個(gè)項(xiàng)進(jìn)行查詢

assertOnlyBrownFox(snq);//匹配成功

//下面使用PhraseQuery進(jìn)行查詢,因?yàn)槭前错樞?#xff0c;所以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 主要用來進(jìn)行同義詞查詢的:
??? 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());

轉(zhuǎn)載于:https://my.oschina.net/wangguolongnk/blog/107690

總結(jié)

以上是生活随笔為你收集整理的对Lucene PhraseQuery的slop的理解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。