【发布时间】:2016-08-17 16:30:00
【问题描述】:
这看起来很简单,以至于我确信我一定忽略了一些东西。我无法确定如何在 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 从 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 bay 和 ha long bay 搜索词的匹配,理想情况下无需对输入词做任何花哨的操作(例如,剥离空间、添加通配符等)?
注意:我知道这也可以让 h a l o n g b a y 一词产生成功,但我认为我对此没有问题。
【问题讨论】:
-
对于拼写错误的短语,通常使用同义词而不是让您的搜索逻辑涵盖所有基础。查看这篇关于使用 Sitecore 进行设置的帖子。如果您有更多此类场景,可能值得考虑 - firebreaksice.com/sitecore-synonym-search-with-lucene
-
感谢您对同义词的提醒。我实际上可能会为其他类型的搜索实现它。但是,在我看来,这不是同义词。这是同一个词,但添加了空格。也许我很迂腐,但使用同义词的原因是要指定完全不同的单词,即使它们具有相同的含义,它们在数学上也没有任何共同点,例如“快速”和“快速”的常用字母为零。