代码之家  ›  专栏  ›  技术社区  ›  Moshe

使用Lucene查询部分URL

  •  1
  • Moshe  · 技术社区  · 16 年前

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

    你知道我为什么要用准确的域名搜索吗?

    2 回复  |  直到 16 年前
        1
  •  0
  •   Community Mohan Dere    9 年前

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

        2
  •  0
  •   danben    16 年前

    您要为索引编写器指定哪个分析器?如果用错误的方法标记一个字段,告诉Lucene标记它对您没有任何好处。对于你想要的,听起来你需要确保你的记号赋予器在“.”上分裂,也许它也在生成n-gram(后者可能不是必需的)。您应该更深入地研究各种可用的分析程序,看看哪种标记化技术行为最接近您想要的。否则,您可以始终编写自定义分析器。确保使用与搜索相同的分析器进行索引,因此如果索引“domain1.co.uk”(变为“domain1 co uk”)并搜索“domain1.co”(变为“domain co”),则会在其中找到匹配项,而未命名的查询“domain1.co”将不匹配。