API中搜索多个术语

API中搜索多个术语

本文介绍了如何在Sitecore 7 ContentSearch API中搜索多个术语?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在探索Sitecore 7中新的Sitecore.ContentSearch"LINQ to Sitecore"API。据我所知,Sitecore建议使用新的LINQ API而不是现有的Sitecore.SearchAPI,但是,我甚至很难执行最简单的查询。

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

使用Sitecore.SearchAPI,术语"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的查询,但是,它的选择是有限的,并且会增加一些性能开销。

推荐答案

我尝试的所有谓词生成器都不起作用,但是,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 7 ContentSearch API中搜索多个术语?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

08-18 17:47