2009-01-16 110 views
12

我使用Lucene來允許用戶搜索大量文檔中的單詞。 Lucene似乎默認返回所有包含輸入單詞的文檔。如何讓Lucene匹配查詢中的所有單詞?

是否有可能改變這種行爲?我知道'+'可以用來強制包含一個術語,但是我想將其作爲默認操作。

理想情況下,我想要類似於Google的功能:' - '排除單詞和「abc xyz」來分組單詞。

只是爲了澄清 我也想過在查詢的所有空格中插入'+'。我只是想避免檢測分組術語(括號,引號等),並可能打破查詢。還有另一種方法嗎?

回答

27

這看起來類似於Lucene Sentence Search問題。如果你有興趣,我這是怎麼回答了這個問題:

String defaultField = ...; 
Analyzer analyzer = ...; 
QueryParser queryParser = new QueryParser(defaultField, analyzer); 

queryParser.setDefaultOperator(QueryParser.Operator.AND); 

Query query = queryParser.parse("Searching is fun"); 
+0

+1,我一直在尋找這個,很高興我發現它在SO – mohang 2012-04-11 11:06:04

0

爲什麼不只是preparse用戶搜索輸入,並在將它傳遞到Lucene之前使用Lucene query syntax將其調整爲符合您的標準。或者,您可以創建一些關於如何使用標準語法創建特定查詢的幫助文檔,並讓用戶決定如何執行查詢。

0

Lucene有一個廣泛的查詢語言,描述如下here,描述了除了+作爲默認值之外的所有內容,但這是通過用+替換空格可以簡單處理的東西。因此,您唯一需要做的就是定義您希望用戶輸入搜索查詢的格式(我強烈建議遵循默認的Lucene語法),然後您可以將自己的語法轉換爲Lucene語法。

0

該行爲在method addClause(List, int, int, Query) of class org.apache.lucene.queryParser.QueryParser中進行了硬編碼,所以更改行爲(除了上述解決方法之外)的唯一方法是更改​​該方法。該方法結束看起來像這樣:

if (required && !prohibited) 
    clauses.addElement(new BooleanClause(q, BooleanClause.Occur.MUST)); 
else if (!required && !prohibited) 
    clauses.addElement(new BooleanClause(q, BooleanClause.Occur.SHOULD)); 
else if (!required && prohibited) 
    clauses.addElement(new BooleanClause(q, BooleanClause.Occur.MUST_NOT)); 
else 
    throw new RuntimeException("Clause cannot be both required and prohibited"); 

更改「應該」到「必須」應使默認需要條款(例如字)。

相關問題