【问题标题】:Query partial URLs using Lucene使用 Lucene 查询部分 URL
【发布时间】:2009-12-24 21:47:29
【问题描述】:

我的应用程序使用 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);

您知道为什么我必须使用确切的域名进行搜索吗?

【问题讨论】:

    标签: lucene.net


    【解决方案1】:

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

    【讨论】:

    • 谢谢,我确实写了一个新的分析器/标记器,并添加了一些字符作为单词分隔符。
    【解决方案2】:

    您为 IndexWriter 指定了哪个分析器?如果以错误的方式对字段进行标记,告诉 Lucene 对字段进行标记对您没有任何好处。对于您想要的,听起来您需要确保您的标记器在“。”上拆分。也许它正在生成 n-gram(后者可能不是必需的)。您应该更多地研究可用的各种分析器,看看哪个标记化行为让您最接近您想要的。否则,您总是可以编写自定义分析器。确保您使用与搜索相同的分析器进行索引,因此,如果您将“domain1.co.uk”索引为“domain1 co uk”并搜索“domain1.co”,该“domain1.co”将变为“domain co”,您将在那里找到匹配项,而未标记的查询“domain1.co”将不匹配。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-18
      • 2015-01-19
      • 2015-12-19
      • 2012-09-04
      • 2013-08-07
      • 2012-09-20
      相关资源
      最近更新 更多