2009-12-24 41 views
1

我的应用程序使用Lucene.NET来索引各种文本文件。由于每个文本文件的结构都不相同,因此每个文件的全部内容都存储在一个“内容”字段中。使用Lucene查询部分URL

一些文本文件中包含的网址,例如:

http://domain1.co.uk/blah 
http://domain2.co.ru/blahblah 

我使用的指数代码中的每个文件是:

Lucene.Net.Documents.Field fldContent = new Lucene.Net.Documents.Field("content", contents, Lucene.Net.Documents.Field.Store.YES, Lucene.Net.Documents.Field.Index.TOKENIZED, Lucene.Net.Documents.Field.TermVector.YES); 

其中, “内容” 是文件内容。

当查询文件时,Lucene仅在搜索确切的域名(例如domain1.co.uk)时返回结果,并且不返回部分域名(例如domain1.co)的结果。 用来构建查询的代码是:

Lucene.Net.Index.Term searchTerm = new Lucene.Net.Index.Term("content", "domain1.co"); 
Lucene.Net.Search.Query query = new Lucene.Net.Search.TermQuery(searchTerm); 

你有任何想法,为什么我必须寻找使用完全相同的域名?

回答

0

StandardAnalyzer/Tokenizer是这里的罪魁祸首 - 它最好能够使URL可搜索,但在这种情况下,它不会匹配部分主机名。标准方法是创建一个自定义分析器/标记器 - 为此,我可以指向另一个SO question with a similar problem and solution

+0

谢谢,我写了一个新的分析器/标记器,并添加一些字作为词分隔符。 – Moshe 2009-12-24 14:37:22

0

您为IndexWriter指定了哪个分析器?如果标记错误,告诉Lucene标记一个字段对你没有好处。对于你想要的,听起来像你需要确保你的标记器分裂为“。”。也可能它正在生成n-gram(后者可能不是必需的)。您应该更多地了解可用的各种分析仪,并查看哪个分析仪行为可以让您最接近您想要的。否则,您可以随时编写自定义分析器。确保你使用相同的分析器进行索引搜索,所以如果你索引变成“domain1 co uk”的“domain1.co.uk”并搜索变成“domain co”的“domain1.co”,你会在那里找到一个匹配,而非原文查询“domain1.co”不匹配。