我正在使用新的Sitecore搜索,我遇到的问题是搜索结果与我的搜索字词无关。
例如,搜索“谎言”会找到“适用”。这不是我想要的。
这是我正在进行的搜索示例(简化)。它是对SearchResultItem的“Content”属性的“Contains”的直接LINQ检查,很可能不是我应该做的。我恰巧在网上找到的样本实际上是这样做的。
我的代码示例(简化)。在这里,我将搜索句分解为单独的关键字。顺便说一句,我正在寻找一种方法来首先显示完整的句子匹配。
using (var context = ContentSearchManager.GetIndex("sitecore_web_index").CreateSearchContext())
{
var results = context.GetQueryable<SearchResultItem>()
.Filter(i => i.Path.StartsWith(Home.Paths.FullPath))
.Filter(GetTermPredicate(Term));
// use results here
}
protected Expression<Func<SearchResultItem, bool>> GetTermPredicate(string term)
{
var predicate = PredicateBuilder.True<SearchResultItem>();
foreach (var tempTerm in term.Split(' '))
{
predicate = predicate.And(p => p.Content.Contains(tempTerm));
}
return predicate;
}
提前谢谢!!
答案 0 :(得分:1)
将代码中的Filter替换为Where,它应该没问题, 这是一个例子:
var currentIndex = ContentSearchManager.GetIndex("sitecore_web_index");
using (var context = currentIndex.CreateSearchContext())
{
var predicate = PredicateBuilder.True();
foreach (var currentWord in term.Split(‘ ‘))
{
predicate = predicate.Or(x => x.Content.Contains(currentWord ));
}
var results = context.GetQueryable().Where(predicate).GetResults();
}
答案 1 :(得分:1)
好的。我得到了Sitecore支持的帮助。
在我的Sitecore版本中,我可以使用以下内容来搜索整个字而不是部分字词:
而不是:
predicate = predicate.And(p =&gt; p.Content。包含(tempTerm));
使用
predicate = predicate.And(p =&gt; p.Content。 Equals (tempTerm));
问题已解决。
答案 2 :(得分:0)
正如Ahmed所说,你应该使用 Where 而不是过滤器,因为过滤器对搜索排名没有影响。过滤器的经典用例是应用用户选择的方面而不会扭曲结果的排序,如果您使用Where子句会发生这种情况。
过滤类似于使用Where限制结果列表。两种方法都会影响结果 结果列表,但是当您使用过滤器时,搜索命中的评分/排名不受过滤器的影响。 Developer's Guide to Item Buckets and Search
对Sitecore 7团队博客上何时使用过滤器有很好的讨论: Making Good Part 4: Filters, Paging and I'm feeling lucky.
答案 3 :(得分:-1)
如果您只想搜索整个单词,可以使用空格为searchterm加前缀和后缀。虽然这并不能解决所有情况。