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

the*_*man 6 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);
Run Code Online (Sandbox Code Playgroud)

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

var predicate = PredicateBuilder.Create<MySearchResultItemClass>(sri => sri.Like(term));
Run Code Online (Sandbox Code Playgroud)

这也没有结果ha long bay.

如何在Sitecore中配置Lucene以返回两者halong bayha long bay搜索项的命中,理想情况下无需对输入项进行任何花哨的操作(例如,剥离空间,添加通配符等)?

注意:我认识到这也会让这个术语h a l o n g b a y产生命中,但我不认为我有这个问题.

Gat*_*rdo 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);
Run Code Online (Sandbox Code Playgroud)

它确实分割了您的输入字符串,但我想这并不“花哨”;)