6

我正在探索Sitecore.ContentSearchSitecore 7 中新的“LINQ to Sitecore”API。据我了解,Sitecore 建议在现有Sitecore.SearchAPI 上使用新的 LINQ API,但是,即使是最简单的查询,我也很难执行。

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

使用Sitecore.SearchAPI,术语“hello world”通常会通过 a 传递,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 的所有工作中,这个简单的用例并没有被忽视……对吧?

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

不幸的是,在我弄清楚这一点之前,我不得不求助于现有的 API。我一定会用我的发现更新这个问题。

更新 2

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

4

3 回答 3

22

All of the predicate builders I tried didn't work, however, Sitecore 7 ships with a PredicateBuilder of it's own that did the trick.

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();

    ...
}
于 2013-07-10T21:06:09.087 回答
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

于 2013-07-09T07:48:22.730 回答
0

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

于 2013-11-06T23:18:18.717 回答