sitecore - 如何在 Sitecore 7 ContentSearch API 中执行多个术语的搜索?

标签 sitecore sitecore7

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

以以下搜索查询为例:“hello world”

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

如何使用 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 的查询,但是它的选项有限,并且会增加一些性能开销。

最佳答案

我尝试过的所有谓词构建器都不起作用,但是,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();

    ...
}

关于sitecore - 如何在 Sitecore 7 ContentSearch API 中执行多个术语的搜索?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17257392/

相关文章:

验证 - 渲染项目是否有效 xhtml - 异常

Sitecore EventQueue Table 增长失控

sitecore - 删除与 sitecore 数据源相关的损坏链接

sitecore - 为使用 Sitecore 中的小下拉框模板创建的卡盘项目设置数据源

.net - 将参数传递给 Sitecore 中的 Razor View 渲染

sitecore - 如何在重建过程中保持Lucene索引的可用性?

asp.net - 全新安装中的配置文件无效 - 缺少配置部分 'contactRepository'

sitecore - 在 Sitecore 7 中创建平面 Bucket 结构

sitecore - 我如何将 Sitecore 项目按其创建日期以外的其他时间存储?

sitecore - Sitecore 7 中的内容重用