2015-03-07 2 views
2

У меня есть ведро предметов с более чем 30 000 предметов внутри. Мне нужно быстро найти элементы, которые имеют определенное поле, определенное для определенного значения, или даже лучше сделать что-то вроде инструкции SELECT WHERE fieldValue IN (1,2,3,4). Есть ли готовые решения? Я искал в Интернете, и единственное, что я нашел, это «Руководство разработчика по позиции Ковши и поиск», но примеров кода нет.Sitecore HOWTO: Элемент поиска для предметов с определенными значениями

+0

Как вы можете видеть, вы можете с помощью ответа ниже вы можете использовать Sitecore 7 API. Ссылки быстрого запуска руководства были написаны мной, поэтому я был бы признателен, если бы учесть это при маркировке ответа. Надеюсь, это решит вашу проблему. –

ответ

5

Использования Sitecore редактора содержимого:

Перейти к пункту ковша затем в закладке поиска начните вводить следующее (замените имя_поль и значение с фактическим именем поля и значением):

обычая: fieldname | значение

Затем нажмите enter, вы увидите результат запроса, вы можете сразу несколько запросов, если хотите.

Использование Sitecore Content Search API:

using Sitecore.ContentSearch; 
using Sitecore.ContentSearch.Linq; 
using Sitecore.ContentSearch.SearchTypes; 
using Sitecore.ContentSearch.Linq.Utilities 

ID bucketItemID = "GUID of your bucket item"; 
ID templateID = "Guid of your item's template under bucket"; 
string values = "1,2,3,4,5"; 

using (var context = ContentSearchManager.GetIndex("sitecore_web_index").CreateSearchContext()) 
{ 
    var predicate = PredicateBuilder.True<SearchResultItem>(); 
    predicate = PredicateBuilder.And(item => item.TemplateId == new ID(templateID) 
            && item.Paths.Contains(bucketItemID)); 
    var innerPredicate = PredicateBuilder.False<SearchResultItem>(); 
    foreach(string val in values.Split(',')) 
    { 
     innerPredicate = PredicateBuilder.False<SearchResultItem>(); 
     innerPredicate = innerPredicate.Or(item => item["FIELDNAME"] == val); 
    } 
    predicate = predicate.And(innerPredicate); 

    var result = predicate.GetResults(); 
    List<Item> ResultsItems = new List<Item>(); 
    foreach (var hit in result.Hits) 
    { 
     Item item = hit.Document.GetItem(); 
     if(item !=null) 
     { 
      ResultsItems .Add(item); 
     } 
    } 
} 

Следующие ссылки могут дать хороший старт с API поиска:

  1. http://www.fusionworkshop.co.uk/news-and-insight/tech-lab/sitecore-7-search-a-quickstart-guide#.VPw8AC4kWnI
  2. https://www.sitecore.net/learn/blogs/technical-blogs/sitecore-7-development-team/posts/2013/06/sitecore-7-poco-explained.aspx
  3. https://www.sitecore.net/learn/blogs/technical-blogs/sitecore-7-development-team/posts/2013/05/sitecore-7-predicate-builder.aspx

Надеюсь, это поможет!

6

Вам нужно что-то вроде этого. Элемент Bucket является IIndexable, поэтому его можно искать с помощью API поиска Sitecore 7.

Этот фрагмент кода ниже может быть легко адаптирован для удовлетворения ваших потребностей, и это всего лишь вопрос модификации предложения where. Если вам нужна дополнительная помощь с синтаксисом sitecore 7, просто напишите комментарий к сообщению блога QuickStart ниже, и я «Вернемся к вам.

var bucketItem = Sitecore.Context.Database.GetItem(bucketPath); 
    if (bucketItem != null && BucketManager.IsBucket(bucketItem)) 
    {  
    using (var searchContext = ContentSearchManager.GetIndex(bucketItem as IIndexable).CreateSearchContext()) 
    { 
     var result = searchContext.GetQueryable<SearchResultItem().Where(x => x.Name == itemName).FirstOrDefault(); 
     if(result != null) 
      Context.Item = result.GetItem(); 
    } 
    } 

Дальнейшее чтение на моем блоге здесь:

http://coreblimey.azurewebsites.net/sitecore-7-search-quick-start-guide/

+0

Знаете ли вы, почему bucketItem как IIndexable будет null? – Ernesto

+0

@Ernesto Я действительно опаздываю на вечеринку здесь, но исправление должно передать ваш элемент конструктору значения SitecoreIndexableItem. 'var indexableItem = новый файл SitecoreIndexableItem (bucketItem);' – Teeknow

Смежные вопросы