2012-02-13 31 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

相关问题