我使用Lucene來允許用戶搜索大量文檔中的單詞。 Lucene似乎默認返回所有包含輸入單詞的文檔。如何讓Lucene匹配查詢中的所有單詞?
是否有可能改變這種行爲?我知道'+'可以用來強制包含一個術語,但是我想將其作爲默認操作。
理想情況下,我想要類似於Google的功能:' - '排除單詞和「abc xyz」來分組單詞。
只是爲了澄清 我也想過在查詢的所有空格中插入'+'。我只是想避免檢測分組術語(括號,引號等),並可能打破查詢。還有另一種方法嗎?
我使用Lucene來允許用戶搜索大量文檔中的單詞。 Lucene似乎默認返回所有包含輸入單詞的文檔。如何讓Lucene匹配查詢中的所有單詞?
是否有可能改變這種行爲?我知道'+'可以用來強制包含一個術語,但是我想將其作爲默認操作。
理想情況下,我想要類似於Google的功能:' - '排除單詞和「abc xyz」來分組單詞。
只是爲了澄清 我也想過在查詢的所有空格中插入'+'。我只是想避免檢測分組術語(括號,引號等),並可能打破查詢。還有另一種方法嗎?
這看起來類似於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");
爲什麼不只是preparse用戶搜索輸入,並在將它傳遞到Lucene之前使用Lucene query syntax將其調整爲符合您的標準。或者,您可以創建一些關於如何使用標準語法創建特定查詢的幫助文檔,並讓用戶決定如何執行查詢。
Lucene有一個廣泛的查詢語言,描述如下here,描述了除了+作爲默認值之外的所有內容,但這是通過用+替換空格可以簡單處理的東西。因此,您唯一需要做的就是定義您希望用戶輸入搜索查詢的格式(我強烈建議遵循默認的Lucene語法),然後您可以將自己的語法轉換爲Lucene語法。
該行爲在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");
更改「應該」到「必須」應使默認需要條款(例如字)。
像Adam說,沒有必要做任何事情來查詢字符串。 QueryParser的setDefaultOperator完全符合你的要求。
+1,我一直在尋找這個,很高興我發現它在SO – mohang 2012-04-11 11:06:04