Sitecore Lucene索引搜索词与空格匹配相同的单词没有空格

时间:2016-08-17 16:30:01

标签: c# linq lucene sitecore

这似乎很简单,我确信我必须忽视某些事情。我无法确定如何在Lucene中执行以下操作:

问题

  • 我正在寻找地名。
  • 我有一个名为Name
  • 的字段
  • 正在使用Lucene.Net.Analysis.Standard.StandardAnalyzer
  • TOKENIZED
  • Name的值在值中包含1个空格:halong bay
  • 由于文化上不同的拼写或真正的拼写错误,搜索字词可能包含也可能不包含额外空格。例如。 ha long bay代替halong bay
  • 如果我使用术语halong bay,我会受到欢迎。
  • 如果我使用术语ha long bay,我就不会受到打击。

尝试的解决方案

以下是我使用来自Sitecore的LINQ to Lucene构建我的谓词的代码:

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产生命中,但我不认为我有这个问题。

2 个答案:

答案 0 :(得分:4)

TOKENIZED字段表示字段值由标记(在这种情况下为空格)拆分,结果字词将添加到索引字典中。如果你在这样的字段中索引“halong bay”,它将创建“halong”和“bay”术语。

搜索引擎无法为“ha long”搜索查询检索此结果是正常的,因为它不知道“ha”或“long”条款的任何结果。

手动方法是定义在另一个名为AlternateNames的多值计算索引字段中编写地名的所有其他方法。然后,您可以发出此类查询:Name==query OR AlternateNames==query

自动方法是在名为CompactName的单独计算索引字段中索引没有空格的地名。然后,您可以发出此类查询:Name==query OR CompactName==compactedQueryWithoutSpaces

我希望这会有所帮助

杰夫

答案 1 :(得分: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);

它会分割您的输入字符串,但我想这不是'花哨';)

相关问题