这似乎很简单,我确信我必须忽视某些事情。我无法确定如何在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);
我还尝试使用.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
产生命中,但我不认为我有这个问题。
答案 0 :(得分:4)
TOKENIZED
字段表示字段值由标记(在这种情况下为空格)拆分,结果字词将添加到索引字典中。如果你在这样的字段中索引“halong bay”,它将创建“halong”和“bay”术语。
搜索引擎无法为“ha long”搜索查询检索此结果是正常的,因为它不知道“ha”或“long”条款的任何结果。
手动方法是定义在另一个名为AlternateNames的多值计算索引字段中编写地名的所有其他方法。然后,您可以发出此类查询:Name==query OR AlternateNames==query
。
自动方法是在名为CompactName的单独计算索引字段中索引没有空格的地名。然后,您可以发出此类查询:Name==query OR CompactName==compactedQueryWithoutSpaces
我希望这会有所帮助
杰夫
答案 1 :(得分: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);
它会分割您的输入字符串,但我想这不是'花哨';)