Skip to main content
 首页 » 编程设计

当使用 "-"或通配符时,Lucene.Net 不会返回预期的搜索结果

2025年02月15日158mq0036

我正在使用 Lucene.net 2.9,并试图理解为什么我的查询没有返回预期结果。

我使用以下函数将字段添加到索引文档。

//add fields to the document 
public void AddFacet(Lucene.Net.Documents.Document doc, String facetName, String facetValue) 
{ 
    doc.Add(new Lucene.Net.Documents.Field(facetName, facetValue, Lucene.Net.Documents.Field.Store.YES, Lucene.Net.Documents.Field.Index.NOT_ANALYZED)); 
} 
 
//snippet of analyzer being used 
Lucene.Net.Analysis.Analyzer analyzer = new Lucene.Net.Analysis.Standard.StandardAnalyzer(Lucene.Net.Util.Version.LUCENE_29); 
 
//snippet of a simple demo 
Lucene.Net.Documents.Document doc = new Lucene.Net.Documents.Document(); 
AddFacet(doc, "FACET", "INDEX-VALUE-TEST"); 

据我了解,由于我在将字段添加到文档时使用 Lucene.Net.Documents.Field.Index.NOT_ANALYZED,因此 facetValue 不会'不能被标记为术语。

我相信这意味着原始的facetValue存储为“INDEX-VALUE-TEST”。如果要对其进行标记,它将与“INDEX”、“VALUE”和“TEST”等多个术语一起存储,因为分析器将 - 解释为停用词。

如果我搜索“INDEX”,我的查询将类似于 +(xml:index),它返回在任何术语中包含“INDEX”的所有文档。这是预期的结果。

我不明白以下情况:

  1. 如果我搜索“INDEX-VAL”,我的查询将如下所示 +(xml:index-val),不返回任何结果。我明白为什么这没有返回结果,因为没有通配符。

  2. 如果我搜索“INDE*”,我的查询将如下所示 +(xml:inde*),它再次不返回任何结果。我不确定为什么这不返回任何文件。我希望取回在任何字段中包含“INDE”的所有文档。

  3. 如果我搜索“INDEX-VALUE-TEST”,我的查询将如下所示 +(xml:索引值测试)。再次,没有结果。我希望拿回 1 份文档。

如果我将术语存储为“INDEX-VALUE-TEST”,那么为什么 case #2 和 #3 不返回结果?我明白为什么 #1 不会,因为它可能需要通配符来匹配术语的其余部分。如果是这样,为什么我搜索不带通配符的“INDEX”并可以得到所有文档?

我一直在使用this source to understand the indexing files.

我一直在使用this source to understand the fields I'm adding to the document.

如果有人可以帮助我理解我所缺少的内容,我将不胜感激。

请您参考如下方法:

我认为,解决这个问题的正确方法是编写我们自己的解析器/分析器,以便我们更好地控制正在发生的事情。目前还无法证明付出的努力是合理的(也许直到出现其他问题为止)。

我的解决方法是在搜索时将所有 - 替换为空格。它使搜索结果更加符合我的预期。这应该没问题,因为分析器通常会针对非通配符查询以一致的方式标记该字符。