Sitecore Lucene索引搜索术语中的空格匹配与不带空格的相同单词匹配问题

6

看起来很简单,但我确信自己可能忽略了什么。我不知道如何在Lucene中实现以下内容:

问题

  • 我正在搜索地名。
  • 我有一个名为Name的字段。
  • 它使用Lucene.Net.Analysis.Standard.StandardAnalyzer
  • 它是TOKENIZED的。
  • Name的值在值中包含1个空格:halong bay
  • 搜索词可能会因文化上的不同拼写或真正的拼写错误而包含额外的空格。例如,ha long bay而不是halong bay
  • 如果我使用术语halong bay,我可以找到匹配项。
  • 如果我使用术语ha long bay,我无法找到匹配项。

尝试的解决方案

这是我使用LINQ to Lucene from Sitecore构建谓词的代码:

var searchContext = ContentSearchManager.GetIndex("my_index").CreateSearchContext();
var term = "ha long bay";
var predicate = PredicateBuilder.Create<MySearchResultItemClass>(sri => sri.Name == term);
var results = searchContext.GetQueryable<MySearchResultItemClass>().Where(predicate);

我还尝试了使用.Like()扩展进行模糊匹配:

var predicate = PredicateBuilder.Create<MySearchResultItemClass>(sri => sri.Like(term));

对于ha long bay搜索词,这也没有产生任何结果。

如何在Sitecore中配置Lucene以返回halong bayha long bay搜索词的结果,最好不需要对输入词进行任何复杂处理(例如去除空格、添加通配符等)?

注意:我知道这也将允许h a l o n g b a y这个词产生匹配结果,但我认为这并不是问题。


1
在短语拼写错误的情况下,通常使用同义词而非让搜索逻辑覆盖所有可能性。看一看这篇有关在Sitecore中设置同义词搜索的文章吧。如果你有更多这样的情况,考虑一下这个功能或许会相当有用——http://firebreaksice.com/sitecore-synonym-search-with-lucene/ - Ian Graham
谢谢提醒同义词的事情。我可能会在其他类型的搜索中实现它。然而,在我看来,这不是一个同义词。它是相同的单词,只是加了空格。也许我有点迂腐,但引入同义词的原因是为了指定完全不同的单词,即使它们具有相同的含义,也没有数学上的共同点,例如“fast”和“quick”没有任何共同字母。 - theyetiman
2个回答

4
一个TOKENIZED字段意味着该字段的值被一个标记(在这种情况下是空格)分割,并将生成的术语添加到索引字典中。如果您在这样的字段中索引“halong bay”,它将创建“halong”和“bay”术语。
对于“ha long”搜索查询,搜索引擎无法检索此结果是正常的,因为它不知道任何具有“ha”或“long”术语的结果。
一种手动的方法是在另一个名为AlternateNames的多值计算索引字段中定义书写地名的所有其他方式。然后您可以发出这种查询:Name ==查询 或 AlternateNames ==查询
自动方法是在另一个名为CompactName的单独计算索引字段中也索引没有空格的地名。然后您可以发出这种查询:Name ==查询 或 CompactName ==删除空格的查询压缩 希望这可以帮助你。
Jeff

谢谢你的回答。我在想将其更改为未分词是否可以在不操作输入术语的情况下进行匹配?我试图不必编写单独的替代名称列表来考虑空格。 - theyetiman

0

类似这样的代码可能会解决问题:

var predicate = PredicateBuilder.False<MySearchResultItemClass>();
foreach (var t in term.Split(' '))
{
    var tempTerm = t;
    predicate = predicate.Or(p => p.Name.Contains(tempTerm));
}
var results = searchContext.GetQueryable<MySearchResultItemClass>().Where(predicate);

它确实会分割您的输入字符串,但我猜那并不是“花哨”的;)


我担心这会匹配任何带有“bay”或“ha”或“long”单词的内容,而这不是我想要的。 - theyetiman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接