【发布时间】: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"。虽然这很有用,但我现在只是尝试实现一个普通的站点搜索。