这看起来是如此简单,以至于我确信我必须忽略某些东西。我无法确定如何在Lucene中执行以下操作:
问题
Name
的字段Lucene.Net.Analysis.Standard.StandardAnalyzer
TOKENIZED
Name
的值在值halong bay
中包含1个空格。 ha long bay
而不是halong bay
。 halong bay
这个词,我会很受欢迎。 ha long bay
这个词,我不会受到打击。 尝试的解决方案
这是我用来从Sitecore使用LINQ到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
字段表示该字段值由 token (在这种情况下为空格)分割,并且将所得到的术语添加到索引字典中。如果在这样的字段中为“halong bay”建立索引,它将创建“halong”和“bay”这两个术语。
搜索引擎无法通过“ha long”搜索查询检索到此结果是很正常的,因为它不知道带有“ha”或“long”项的任何结果。
手动方法是定义所有其他方式,将地名写入另一个名为AlternateNames的多值计算索引字段中。然后,您可以发出这种查询:Name==query OR AlternateNames==query
。
一种自动的方法是在一个单独的名为CompactName的计算索引字段中索引地名,但不带空格。然后,您可以发出这种查询:Name==query OR CompactName==compactedQueryWithoutSpaces
我希望这有帮助
杰夫
关于c# - 具有空格的Sitecore Lucene索引搜索词匹配不带空格的相同单词,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39001887/