2011-03-16 88 views
3

Lucene搜索我存儲其中有一個URL字段文檔:通過URL

Document doc = new Document(); 
doc.add(new Field("url", url, Field.Store.YES, Field.Index.NOT_ANALYZED)); 
doc.add(new Field("text", text, Field.Store.YES, Field.Index.ANALYZED)); 
doc.add(new Field("html", CompressionTools.compressString(html), Field.Store.YES)); 

我希望能夠通過它的URL找到一個文件,但我得到0的結果:

Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_30) 
Query query = new QueryParser(LUCENE_VERSION, "url", analyzer).parse(url); 
IndexSearcher searcher = new IndexSearcher(index, true); 
TopScoreDocCollector collector = TopScoreDocCollector.create(10, true); 
searcher.search(query, collector); 
ScoreDoc[] hits = collector.topDocs().scoreDocs; 
// Display results 
for (ScoreDoc hit : hits) { 
    System.out.println("FOUND A MATCH"); 
} 
searcher.close(); 

我可以做些什麼不同,以便我可以存儲HTML文檔並通過它的URL找到它?

回答

4

你可以重寫查詢以這樣的

Query query = new QueryParser(LUCENE_VERSION, "url", analyzer).newTermQuery(new Term("url", url)).parse(url); 

建議:

我建議你使用BooleanQuery,因爲它提供了良好的性能和內部它進行了優化。

TermQuery tq= new TermQuery(new Term("url", url)); 
// BooleanClauses Enum SHOULD says Use this operator for clauses that should appear in the matching documents. 
BooleanQuery bq = new BooleanQuery().add(tq,BooleanClause.Occur.SHOULD); 
IndexSearcher searcher = new IndexSearcher(index, true); 
TopScoreDocCollector collector = TopScoreDocCollector.create(10, true); 
searcher.search(query, collector); 

我看你使用URL frield作爲Not_Analysed,這是用於搜索IMO好索引,因爲沒有分析儀用於將被存儲爲一個單一的長期價值。

現在,如果你的商業案例說,我會給你一個網址找到了Lucene索引EXACT一個,那麼你應該在你的索引查找與不同的分析儀(KeywordAnalyzer等)

2

Lucene QueryParser正在將一些url字符解釋爲Query Parser Syntax的一部分。您可以使用TermQuery代替,就像這樣:

TermQuery query = new TermQuery(new Term("url", url));