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 bay
和ha long bay
搜索项的命中,理想情况下无需对输入项做任何花哨的操作(例如剥离空间,添加通配符等)?
注意:我认识到这也会让术语h a l o n g b a y
产生一个热门,但我不认为我有这个问题。
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);
它分割你的输入字符串,但我想这不是'花式';)