我的应用程序使用Lucene.NET索引各种文本文件。由于每个文本文件的结构不同,因此每个文件的整个内容都存储在一个“内容”字段中。
某些文本文件包含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);
其中“contents”是文件内容。
查询文件时,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 :(得分:0)
您为IndexWriter指定了哪个Analyzer?告诉Lucene标记一个字段如果被错误地标记,对你没有任何好处。对于你想要的,听起来你需要确保你的标记器分裂为“。”。也许它也产生了n-gram(后者可能没有必要)。您应该更多地了解可用的各种分析器,并查看哪一种标记化行为使您最接近您想要的。否则,您总是可以编写自定义分析器。确保您使用相同的分析器进行索引以进行索引,因此如果您将“domain1.co.uk”编入索引,将其变为“domain1 co uk”,并搜索“domain1.co”,它将变为“domain co”,你将在那里匹配,而未加密的查询“domain1.co”将不匹配。
答案 1 :(得分:0)
StandardAnalyzer / Tokenizer是这里的罪魁祸首 - 它最好使URL可搜索,但在这种情况下,它将与部分主机名不匹配。标准方法是创建自定义分析器/标记器 - 为此,我可以指向另一个SO question with a similar problem and solution。