2011-08-08 106 views
-1

我已經在我的項目寫了下面的代碼搜索兩個術語:故障使用Lucene

final IndexSearcher indexSearcher = new IndexSearcher(INDEXING_DIRECTORY, true); 
final Query query = new QueryParser(Version.LUCENE_33, "keywords", new StandardAnalyzer(Version.LUCENE_33)).parse("cats movies"); 
final TopScoreDocCollector collector = TopScoreDocCollector.create(10, true); 
indexSearcher.search(query, collector); 
final ScoreDoc[] hits = collector.topDocs(0, 10).scoreDocs; 

的任務是非常微不足道的。

例如,我有一個帶有索引「關鍵字」字段的存儲記錄。例如關鍵字可能類似於「有趣的貓電影噸」。

問題是如果搜索查詢將是「有趣的貓」(索引字段中的字順序),但上面的代碼將會返回記錄,但會在「貓電影」上失敗。我應該如何編寫我的查詢,以便它匹配任何單詞順序,並且如果可以搜索類似的單詞也是可能的?

+4

請在標題中註明您的問題。 – Zeemee

+1

爲什麼所有的downvotes?似乎有效的問題? – snowflakekiller

+0

在問題中用「兩個術語」替換「短語」一詞。短語不是運動員想要搜索的東西。 – fyr

回答

1

最有可能「貓電影」將被解析爲PhraseQuery。 PhraseQueries尊重排序。你想要的是有一個BooleanQuery與兩個TermQueries結合AND

final Query query = new QueryParser(Version.LUCENE_33, "keywords", new StandardAnalyzer(Version.LUCENE_33)).parse("+cats AND +movies"); 

列出了更多的例子here。有些可能已經過時了。

類似單詞是一個相當艱鉅的任務,因爲你需要至少有某種詞彙表或數據庫,它們對齊同義詞。

+0

謝謝。我會在家裏嘗試:) –