2015-04-29 27 views
1

我試圖使用WildCardQuery:WildcardQuery Lucene的不能正常工作

IndexSearcher indexSearcher = new IndexSearcher(ireader); 
    Term term = new Term("phrase", QueryParser.escape(partOfPhrase) + "*"); 
    WildcardQuery wildcardQuery = new WildcardQuery(term); 
    LOG.debug(partOfPhrase); 
    Sort sort = new Sort(new SortField("freq", SortField.Type.LONG,true)); 
    ScoreDoc[] hits = indexSearcher.search(wildcardQuery, null, 10, sort).scoreDocs; 

但是當我插入 「SAN」(不帶引號),我想是這樣的: 「聖地亞哥」,「三安東尼奧「等。但我不僅得到了這些結果,而且還得到了」涼鞋「(它必須是聖後的空間),或者juelz santana(我想找到以san開頭的句子)。我該如何解決這個問題?

編輯 此外,如果我插入「san d」,我沒有結果。

+0

插入來代替partOfPhrase? – Mysterion

+0

如果我插入「san d」***是*** partOfPhrase =「san d」 – Filosssof

回答

1

解決這個問題的一種可能的方法是使用另一個分析器,它不會將查詢和文本按空間拆分。

一個可能分析器的 - 是一個KeywordAnalzer,將使用整個數據作爲單一關鍵字

測試的基本部分:

Directory dir = new RAMDirectory(); 
Analyzer analyzer = new KeywordAnalyzer(); 
IndexWriterConfig iwc = new IndexWriterConfig(analyzer); 
iwc.setOpenMode(IndexWriterConfig.OpenMode.CREATE); 
IndexWriter writer = new IndexWriter(dir, iwc); 

以後,我可以添加所需的文檔:

Document doc = new Document(); 
doc.add(new TextField("text", "san diego", Field.Store.YES)); 
writer.addDocument(doc); 

最後,搜索你想要的:

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

Term term = new Term("text", QueryParser.escape("san ") + "*"); 
WildcardQuery wildcardQuery = new WildcardQuery(term); 

我的測試工作正常,讓我找回聖地亞哥聖安東尼奧,不採取涼鞋。看看這裏完整的測試 - https://github.com/MysterionRise/information-retrieval-adventure/blob/master/src/main/java/org/mystic/lucene/WildcardQueryWithSpace.java

更多有關分析儀本身 - http://lucene.apache.org/core/4_10_2/analyzers-common/org/apache/lucene/analysis/core/KeywordAnalyzer.html

+1

非常感謝。它現在有效! – Filosssof