2012-02-13 32 views
2

我想爲一個存儲的url字段搜索一個Lucene.net索引。我的代碼如下:搜索一個url字段的Lucene.Net索引

Field urlField = new Field("Url", url.ToLower(), Field.Store.YES,Field.Index.TOKENIZED); 
document.Add(urlField);` 
indexWriter.AddDocument(document); 

我正在使用上面的代碼寫入索引。

而下面的代碼在索引中搜索Url。

Lucene.Net.Store.Directory _directory = FSDirectory.GetDirectory(Host, false); 
IndexReader reader = IndexReader.Open(_directory); 
KeywordAnalyzer _analyzer = new KeywordAnalyzer(); 
IndexSearcher indexSearcher = new IndexSearcher(reader); 
QueryParser parser = new QueryParser("Url", _analyzer); 
Query query = parser.Parse("\"" + downloadDoc.Uri.ToString() + "\""); 
TopDocs hits = indexSearcher.Search(query, null, 10); 
if (hits.totalHits > 0) 
{ 
    //statements.... 
} 

但每當我搜索的URL例如:http://www.xyz.com/,我沒有得到任何命中。

不知何故,找出了替代方案。但是這隻適用於索引中只有一個文檔的情況。如果有更多的文件,下面的代碼將不會產生正確的結果。有任何想法嗎?請幫助

在寫索引,使用KeywordAnalyzer()

KeywordAnalyzer _analyzer = new KeywordAnalyzer();  
indexWriter = new IndexWriter(_directory, _analyzer, true, IndexWriter.MaxFieldLength.UNLIMITED); 

然後同時搜索,使用KeywordAnalyzer()

IndexReader reader = IndexReader.Open(_directory); 
KeywordAnalyzer _analyzer = new KeywordAnalyzer(); 
IndexSearcher indexSearcher = new IndexSearcher(reader); 
QueryParser parser = new QueryParser("Url", _analyzer); 
Query query = parser.Parse("\"" + url.ToString() + "\"");      
TopDocs hits = indexSearcher.Search(query, null, 1); 

這是因爲KeywordAnalyzer 「標記化」 的全流作爲 單個令牌。

請大家幫忙。這很緊急。

乾杯 蘇尼爾...

+0

的Lucene索引值,而不是存儲的值相匹配。你如何索引該領域? – sisve 2012-02-13 14:20:03

+0

你的_analyzer做什麼? – SharpBarb 2012-02-13 14:41:52

+0

我想搜索一個url是否已經編入索引。如果是,我將替換存儲的「內容」。 url可以是任何格式:'http:// www.xyz.com /'或'http:// www.xyz.com/page1 /'等。 _analyzer是StandardAnalyzer – 2012-02-14 03:50:20

回答

1

這爲我工作:

IndexReader reader = IndexReader.Open(_directory);     
IndexSearcher indexSearcher = new IndexSearcher(reader); 
TermQuery tq= new TermQuery(new Term("Url", downloadDoc.Uri.ToString().ToLower()));     
BooleanQuery bq = new BooleanQuery(); 
bq.Add(tq, BooleanClause.Occur.SHOULD); 
TopScoreDocCollector collector = TopScoreDocCollector.create(10, true); 

使用StandardAnalyzer同時寫入到索引。

這個答案讓我:Lucene search by URL

0

嘗試把周圍查詢報價,如。像這樣:

「http://www.google.com/」

+0

編輯我的問題。請立即檢查。 – 2012-02-14 04:18:27

0

使用空格或關鍵字分析器應該工作。

會有人真的搜索「http://www.Google.com」嗎?似乎更可能是用戶會搜索「Google」。

如果他們是部分匹配,您可以隨時返回整個URL。我認爲標準分析器應該更適合於搜索和檢索URL。

+0

我想搜索一個網址是否已經編入索引。如果是,我將取代它的「內容」。該網址可以是任何格式:http://www.xyz.com/或http://www.xyz.com/page1/等.. – 2012-02-14 03:48:24

+0

'Field urlField = new Field(「Url」,url.ToLower( ),Field.Store.YES,Field.Index.TOKENIZED);' 'document.Add(urlField);' 'indexWriter.AddDocument(document);' – 2012-02-14 04:10:27

+0

編輯我的問題。請立即檢查。 – 2012-02-14 04:18:21

相關問題