2013-06-23 2 views
6

Я изучаю новый API Sitecore.ContentSearch «LINQ to Sitecore» в Sitecore 7. Насколько я понимаю, Sitecore рекомендует использовать новый API LINQ поверх существующего API Sitecore.Search, однако я изо всех сил стараюсь выполнить даже самые простые запросы.Как выполнить поиск нескольких терминов в Sitecore 7 ContentSearch API?

Возьмем, например, следующий поисковый запрос: "hello world".

Используя API Sitecore.Search, термины «мир привет» обычно передаются через QueryParser, что приведет к документам, соответствующим слову «привет» или «миру». Документы, содержащие оба условия, будут оцениваться выше, чем те, у которых только один.

Как выполнить этот же запрос с помощью 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)); 
} 

UPDATE

Я убежден, что я что-то на самом деле просто не хватает. Разумеется, со всей работой, которая вошла в новый API поиска, этот простой пример использования не был пропущен ... правильно?

Как обходной путь, я попытался открыть по умолчанию sitecore_web_index с помощью существующего SearchManager, однако это не сработает.

К сожалению, мне пришлось прибегнуть к существующему API, пока не смогу это понять. Я обязательно буду обновлять этот вопрос своими выводами.

ОБНОВЛЕНИЕ 2

Я нашел Sitecore.ContentSearch.Utilities.LinqHelper класс, который частично решает проблему. Вы можете использовать его для динамического построения запроса, подобного BooleanQuery в Lucene.Net, однако его параметры ограничены, и это добавляет немного накладных расходов.

+0

Эта статья в блоге может помочь http://www.sitecore.net/Community/Technical-Blogs/Getting-to-Know-Sitecore/Posts/2013/06/Using-Luke-to-Understand-Sitecore- 7-Search.aspx? KeepThis = true & TB_iframe = true & height = 650 & width = 850 – geedubb

+0

@geedubb Спасибо за ссылку! Инструмент LinqScratchPad определенно пригодится. Тем не менее, я все еще не могу найти пример запроса стиля OR или тот, который использует любой вид разбора запросов. Они показывают только, как соответствовать на основе простых критериев, таких как '_templatename ==" X ". Хотя это полезно, я просто пытаюсь внедрить поисковый поиск на этом этапе. –

ответ

21

Все предиката строителей я пытался не работал, однако, 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(); 

    ... 
} 
+0

Полезно знать! :) –

+0

Дерек, вы сделали это с Solr или просто с Lucene? Я получаю ошибки, когда пытаюсь использовать предикат. Или с Solr. –

+0

Я использовал это только с Lucene. –

1

Я думаю, что это связано с linq, а не с сайтом.

Я не проверить это, но посмотрите на эту статью 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

+1

Большое спасибо. Страница 50 второй ссылки отвечала на все мои вопросы! –

+0

К сожалению, PredicateBuilder из первой ссылки генерирует исключение: ** Неподдерживаемый тип узла выражения: Lambda ** –

0

Я смог использовать PredicateBuilder с Solr и реализовать запросы, включая оператор OR. См. http://www.nttdatasitecore.com/en/Blog/2013/November/Building-Facet-Queries-with-PredicateBuilder.aspx

+0

Хотя эта ссылка может ответить на вопрос, вы должны избегать ссылок только для ответов, но суммируйте или цитируйте статью, потому что ссылки, как правило, распадаются со временем. – pinckerman