【问题标题】:How to perform search for multiple terms in Sitecore 7 ContentSearch API?如何在 Sitecore 7 ContentSearch API 中搜索多个术语?
【发布时间】:2013-06-23 03:09:07
【问题描述】:

我正在探索 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 的查询,但是,它的选项有限,并且会增加一些性能开销。

【问题讨论】:

  • @geedubb 感谢您的链接! LinqScratchPad 工具肯定会派上用场。也就是说,我仍然找不到“或”样式查询的示例或使用任何类型的查询解析的示例。它们仅显示如何根据简单标准进行匹配,例如_templatename == "X"。虽然这很有用,但我现在只是尝试实现一个普通的站点搜索。

标签: sitecore sitecore7


【解决方案1】:

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

    ...
}

【讨论】:

  • Derek,你是用 Solr 还是只用 Lucene 做的?当我尝试使用谓词时出现错误。或与 Solr 一起使用。
  • 我只在 Lucene 中使用过这个。
  • 干得真好,德里克。您向我展示了强大的 PredicateBuilder,其用途远远超出了 Sitecore.ContentSearch。谢谢:)
  • 在 .GetResults() 方法上出现错误,System.Linq.IQueryable' 不包含 'GetResults' 的定义,并且没有扩展方法 'GetResults' 接受类型的第一个参数
【解决方案2】:

我认为这与 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

【讨论】:

  • 非常感谢。第二个链接的第 50 页回答了我所有的问题!
  • 不幸的是,第一个链接中的 PredicateBuilder 抛出异常:Unsupported expression node type: Lambda
【解决方案3】:

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

【讨论】:

  • 虽然此链接可能会回答问题,但您应该避免仅提供链接的答案,而是总结或引用文章,因为链接往往会随着时间的推移而衰减。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-03
  • 2011-03-12
  • 2018-10-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多