如何在Sitecore 7 ContentSearch API中搜索多个术语?

时间:2013-06-23 03:09:08

标签: sitecore sitecore7

我正在探索Sitecore 7中新的Sitecore.ContentSearch“LINQ to Sitecore”API。我的理解是Sitecore建议在现有Sitecore.Search API上使用新的LINQ API,但是,我正在努力甚至可以执行最简单的查询。

以下面的搜索查询为例:"hello world"

使用Sitecore.Search API,术语“hello world”通常会通过QueryParser传递,这将导致文档与单词“hello”或“world”匹配。包含这两个术语的文档将得分高于仅有一个术语的文档。

如何使用LINQ执行相同的查询?

以下是我的尝试:

var results = SearchContext.GetQueryable<MyResultItem>();

var terms = searchTerm.Split(' ');

// Not supported exception
results = results.Where(r => terms.Any(t => r.Content.Contains(r)));

// Close, but performs an "AND" between terms, and does not appear
// to score documents properly
foreach (var term in terms)
{
    results = results.Where(r => r.Content.Contains(t));
}

更新

我确信我错过了一些非常简单的事情。当然,对于新搜索API的所有工作,这个简单的用例并没有被忽视......对吗?

作为一种解决方法,我尝试使用现有的SearchManager打开默认的sitecore_web_index,但是,这不起作用。

不幸的是,我不得不求助于现有的API,直到我能够解决这个问题。我一定会用我的发现更新这个问题。

更新2

我找到了部分解决问题的Sitecore.ContentSearch.Utilities.LinqHelper类。您可以使用它在Lucene.Net中动态构建类似于BooleanQuery的查询,但是,它的选项有限,并且会增加一些性能开销。

3 个答案:

答案 0 :(得分:21)

我试过的所有谓词构建器都不起作用,但是,Sitecore 7附带了PredicateBuilder它自己的功能。

using Sitecore.ContentSearch;
using Sitecore.ContentSearch.Linq;
using Sitecore.ContentSearch.SearchTypes;
using Sitecore.ContentSearch.Utilities;
// Sitecore 7 (Update 1+): using Sitecore.ContentSearch.Linq.Utilities;

...

var index = ContentSearchManager.GetIndex("sitecore_web_index");
using (var context = index.CreateSearchContext())
{
    var predicate = PredicateBuilder.True<SearchResultItem>();
    foreach (var t in term.Split(' '))
    {
        var tempTerm = t;
        predicate = predicate.Or(p => p.Content.Contains(tempTerm));
    }

    var results = context.GetQueryable<SearchResultItem>().Where(predicate).GetResults();

    ...
}

答案 1 :(得分:1)

我认为这与linq有关,而不是sitecore。

我不对此进行测试,但请查看本文http://www.albahari.com/nutshell/predicatebuilder.aspx

您还可以查看此文档http://sdn.sitecore.net/upload/sitecore7/70/developer's_guide_to_item_buckets_and%20search_sc7-a4.pdf

答案 2 :(得分:0)

我能够将PredicateBuilder与Solr一起使用,并实现包含OR运算符的查询。见http://www.nttdatasitecore.com/en/Blog/2013/November/Building-Facet-Queries-with-PredicateBuilder.aspx