2011-06-23 80 views
3

我試圖搜索幾個字段,它工作正常,除非我使用術語「是」。在這種情況下,lucene只會忽略該字段。如果我做了如下所示的操作,我會得到正確的結果,「查詢」對象顯示爲「+ flag:bf + type:cgo」。如果我將標誌或類型術語中的任何一個設置爲「是」,那麼搜索的一部分將被忽略。 例如,如果我將queryString設置爲「flag:\」BE \「並鍵入:\」CGO \「」查詢對象將顯示爲:「+ type:cgo」,我會得到更多的點擊。 「類型」也是如此 - 如果我在最後一個例子中將「CGO」更改爲「BE」,它將被忽略。我沒有嘗試過所有可能的2個字符組合(但我已經嘗試了很多),但除了這一個以外,其他所有功能都按預期工作我沒有使用任何停止條款。Lucene QueryParser忽略搜索項「BE」

感謝, 基因

String queryString = "flag:\"BF\" AND type:\"CGO\""; 
QueryParser qp = new QueryParser(Version.LUCENE_30, 
        "type", new StandardAnalyzer(Version.LUCENE_30)); 

Query query = qp.parse(queryString); 
IndexSearcher searcher = new IndexSearcher(reader.reopen()); 
TopDocs td = searcher.search(q, 5000); 
logger.info("Found " + td.totalHits + " hits using " + query.toString()); 

回答

4

默認情況下,StandardAnalyzer使用一組停用詞從文本中的索引術語中排除「噪音」。在StandardAnalyzer中,我認爲「BE」通常被認爲是一個停用詞。

幸運的是,你必須提供給您

最明顯的一個是空集的停止詞傳遞給StandardAnalyzer使用的構造幾個選擇。

但是,查看字段名稱(「標誌」和「類型」),它們看起來並不像看起來像是包含簡單的文本,而更可能包含編碼的單詞。考慮到這一點,您可能會發現關鍵字分析器更合適。

祝你好運,

+0

謝謝。使用關鍵字分析器而不是標準分析器解決了這個問題。 –

1

你確實使用停用詞,雖然你可能不會想:

QueryParser qp = new QueryParser(Version.LUCENE_30, 
       "type", new StandardAnalyzer(Version.LUCENE_30)); 

StandardAnalyzer使用標準英語禁用詞在默認情況下,它包括「是」 。

+0

是的你是對的。我沒有意識到標準分析儀在創建時使用的是停用詞。通過使用關鍵字分析器來修復它。謝謝。 –