2013-01-21 93 views
0

我有一種特殊問題(至少我認爲它是一個^^)。我希望我能描述我想要做的事情:Lucene - 在索引中搜索一組單詞

我有一套條款(字符串),每項也有一個分數(雙)。 我現在想要將這些條款與我的lucene索引中的文檔相匹配。

但我想考慮這些術語的所有可能的組合。 起初我的想法是簡單地建立一個巨大的

`BooleanQuery: field1:term1 OR field1:term2 .... OR field2:term1 OR field2:term2 ...` 

但這個查詢當然會不一樣的結果返回爲生成一個單獨的查詢每個術語:

`Query1: field1:term1 OR field2:term1 ...` 
`Query2: field1:term2 OR field2:term2 ...` 

的問題是,我的應用程序是一個紅外應用程序,這些條款是自動生成/提取的,我不知道,應該一起搜索哪些條款或單獨更好。所以我想擁有「兩全其美」。

有沒有一種方法可以查詢我的術語列表的所有可能的組合?

我當然可以做一些循環,併爲每一個可能的組合查詢,但將永遠可能運行...

希望你明白我想要什麼,能不能幫我:)謝謝!

回答

1

不太清楚你想要的最終結果集是什麼,但這裏有幾個可能的原因:

如果你只是想在任何每場比賽搜索方面對這些詞的話:

field1:term1 OR field1:term2 .... OR field2:term1 OR field2:term2 ... 

field1:term1 field1:term2 .... field2:term1 field2:term2 ... 

是完全足夠的。

如果你只是想要有上所有可用的條件至少有一個匹配的結果,但在任何搜索領域,那麼你可以構建這樣的查詢:

+(field1:term1 field2:term1) +(field1:term2 field2:term2) ... 

或者,可以合併域你想在這裏搜索到一個可搜索的字段,使他們更容易一起搜索。不過,這是否是更好的方法取決於您的應用程序。


至於調整你的查詢,以防止一個長期主宰你的搜索結果:

我認爲有關調整的查詢是找出爲什麼某些方面有支配你的結果的第一步。關鍵是要學會使用:IndexSearcher.explain(query,doc)。這將解釋如何評分文件。 Luke提供了一個很好的界面來對索引進行查詢,並瞭解爲什麼文檔能夠得到他們所做的分數。

此外,TFIDFSimilarity還記錄了默認情況下計算分數的DefaultSimilarity類的主要部分。那裏的文檔將有助於理解Luke/explain(query,doc)中顯示的評分參數的某些方面。

我在這個問題上最好的猜測是,你可能在多個領域中使用相同的通用術語。這將在每個字段中找到該字段的分數,並且可以消除只出現在一個字段中的字詞的結果(但在您的情況下可能同樣相關)。在這種情況下,您可以通過將多個字段用DisjunctionMaxQuery搜索相同的術語來修復它。

例如:

BooleanQuery root = new BooleanQuery() 
DisjunctionMaxQuery dismax1 = new DisjunctionMaxQuery(1.1); 
dismax.add(new TermQuery(new Term("field1", "term1"))); 
dismax.add(new TermQuery(new Term("field2", "term1"))); 
//etc 
root.add(dismax1, BooleanClause.occur.SHOULD); 
DisjunctionMaxQuery dismax2 = new DisjunctionMaxQuery(1.1); 
dismax.add(new TermQuery(new Term("field1", "term2"))); 
dismax.add(new TermQuery(new Term("field2", "term2"))); 
//etc 
root.add(dismax2, BooleanClause.occur.SHOULD); 
+0

運行查詢,我可能不知道我想要什麼太大^^。我的問題是,當我在一個查詢中搜索所有條款(與OR相關)時,有些詞主宰了結果。意味着前n個結果完全基於其中一個關鍵字。但是,如果我對每個術語進行單獨查詢,我將放棄可能由於合併一些術語而導致的(也許是現有的)利益。我知道這是預期的行爲,但我希望有一些我錯過的魔術。 – dburgmann

+0

更新了我的回答,提供了一些關於理解和調整評分的提示。 – femtoRgon

0

不知道這會有所幫助,但你可以從所有領域採取的信息,並在另一單場複製它們。

我知道它是多餘的,但如果磁盤空間不是問題,它可能是更方便的讓你的查詢變得

aggr_field:(term1 OR term2 OR term3)