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

本文关键字:空格 搜索 Lucene Sitecore 索引 | 更新日期: 2023-09-27 18:02:44

这看起来很简单,我确信我一定忽略了什么。我无法确定如何在Lucene中执行以下操作:

<标题>
  • 我正在搜索地名。
  • 我有一个字段叫Name
  • 正在使用Lucene.Net.Analysis.Standard.StandardAnalyzer
  • TOKENIZED
  • Name的值中包含1个空格:halong bay
  • 由于不同文化的拼写或真正的拼写错误,搜索词可能包含也可能不包含额外的空格。例如:ha long bay代替halong bay
  • 如果我使用术语halong bay,我得到一个命中。
  • 如果我使用术语ha long bay,我不会得到点击。

尝试的解决方案

这是我用来构建我的谓词使用LINQ从Sitecore到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产生一个热门,但我不认为我有这个问题。

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

TOKENIZED字段意味着字段值被一个令牌(在这种情况下是空格)分割,结果项被添加到索引字典中。如果在这样的字段中索引"下龙湾",它将创建"下龙湾"answers"海湾"术语。

搜索引擎无法检索到"ha long"搜索查询的结果是正常的,因为它不知道任何包含"ha"或"long"的结果。

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

一种自动方法是在名为CompactName的单独计算索引字段中索引不带空格的地名。然后你可以发出这样的查询:Name==query OR CompactName==compactedQueryWithoutSpaces

我希望这对你有帮助

杰夫

可以这样做:

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);

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