2017-08-30 18 views
1

我正在嘗試使用Lucene添加搜索功能,但似乎無法獲得與重要空白一起使用的索引。我有以下測試案例設置:使用Lucene搜索帶空白的條件

RAMDirectory directory = new RAMDirectory(); 
KeywordAnalyzer analyzer = new KeywordAnalyzer(); 
IndexWriterConfig config = new IndexWriterConfig(analyzer); 
IndexWriter writer = new IndexWriter(directory, config); 
Document doc = new Document(); 
doc.add(new TextField("content", "Bill Evans", Field.Store.NO)); 
writer.addDocument(doc); 
writer.close(); 

IndexReader reader = DirectoryReader.open(directory); 
IndexSearcher searcher = new IndexSearcher(reader); 

QueryParser parser = new QueryParser("content", analyzer); 
parser.setSplitOnWhitespace(false); 
Query query = parser.parse("Bill E"); 

TopDocs docs = searcher.search(query, 1); 
assertTrue(docs.totalHits > 0); 

我使用Lucene 6.6.0和從我瞭解的KeywordAnalyzer就是我在尋找:

「標記化」的整個流作爲單個令牌。這對於郵政編碼,ID和某些產品名稱等數據非常有用。

但我似乎無法得到任何包含空白的匹配文件。

有關如何解決此問題的任何想法?

回答

1

當你的索引,你有一個單一的領域,並與值的單個項單個文檔 - Bill Evans

當你要搜索,TermQuery通過QueryParser嘗試製作與長期價值搜索 - Bill E和這個詞顯然不存在於索引中,所以你得到零點擊。

如果用 - Bill Evans替換搜索字符串,則會得到結果。

請參閱this question

首先,你需要單獨的索引和搜索的關注。您只能搜索索引的內容。如果您正在索引全文而沒有打入令牌,那麼在搜索時間 - 如果您在搜索時的輸入字符串與索引中的輸入字符串不同,則需要生成WildCardQueryFuzzyQueryPhraseQuery等。 TermQuery搜索確切的期限值。

我的建議是存儲全文(不帶令牌 - StringField會這樣做),並使用類似SimpleAnalyzer的東西生成額外的令牌。

所以像,

doc.add(new TextField("content", "Bill Evans", Field.Store.NO)); 
doc.add(new StringField("storedcontent", "Bill Evans", Field.Store.YES)); 

以上代碼與SimpleAnalyzer,你現在有條款 - bill & evans (以及完整的文本作爲存儲領域),如果你現在使用相同的分析儀進行搜索,您的查詢會像 - content:bill content:e &你會得到一個結果。

所有的一切 - 系統工作已編碼的方式:)

所以瞭解您的要求,首先,你要對指數進行你想要什麼指標,什麼類型的查詢。