2016-05-27 2 views
2

Я полностью новый для sitecore powershell. Я просмотрел некоторые статьи, но ничего не работало для меня.Sitecore powershell поиск по всем предметам, которые содержат ключевое слово

Что мне нужно: в моем Sitecore я хочу найти конкретное ключевое слово, и мне нужны все элементы, перечисленные в выводе. Ключевое слово может содержаться в тексте Single-Line, Multiline Text, General Link, RichText или Image. Я знаю, что это возможно, используя sitecore powershell. Может ли любой гений (конечно, для меня это) решить мою проблему?

Что-то я пытался. Если это не имеет никакого смысла, пожалуйста, игнорируйте :)

cd 'master:/sitecore/content' 
  
function FilterItemsToProcess($item) 
{ 
    Get-Item master:\content 
} 
  
$list = [System.Collections.ArrayList]@() 
$itemsToProcess = Get-ChildItem -Recurse . | foreach {FilterItemsToProcess($_)} 
if($itemsToProcess -ne $null) 
{ 
      
    $itemsToProcess | ForEach-Object { 
        $match = 0; 
        foreach($field in $_.Fields) { 
  
            # Only look within Single-line and Rich Text fields 
            # In this example, we look for english content within Chinese versions 
              
            if($field.Type -eq "Single-Line Text" -or $field.Type -eq "Rich Text") { 
                if($field -match "mykeyword") { 
                    Write-Host "Found: '$field' within a" $field.Type "field on Item:" $_.ID 
                    $match = 1; 
                } 
            } 
  
        } 
        if($match -eq 1){ 
            [void]$list.Add($_) 
        } 
    } 
} 

ответ

3

Вы действительно хотите изменить подход, который у вас здесь есть. То, что у вас есть, будет очень плохо работать. Чтобы выполнить какой-либо поиск в Sitecore, вы хотите использовать SearchAPI - если вы посмотрите на команду Find-Item в SPE

Также вы захотите добавить собственное индексированное поле в индекс, чтобы сделать это проще.

В пользовательском поле добавить все поля, которые Single-line text или Richtext к индексу:

Таким образом, в вычисляемое поле вы могли бы сделать что-то вроде:

public class MyCustomField : IComputedIndexField 
{ 
    public object ComputeFieldValue(IIndexable indexable) 
    { 
     var item = (Item)(indexable as SitecoreIndexableItem); 
     if (item == null) 
     { 
      return string.Empty; 
     } 

     var value = new StringBuilder(); 
     item.Fields.ReadAll(); 
     foreach (Field field in item.Fields) 
     { 
      switch (field.Type.ToLowerInvariant()) 
      { 
       case "single-line text": 
       case "richtext": 
        value.AppendLine(field.Value); 
        break; 
      } 
     } 

     return value; 

    } 
} 

Затем добавить поле к вашей конфигурации с помощью инклюдник:

<configuration xmlns:patch="http://www.sitecore.net/xmlconfig/"> 
    <sitecore> 
     <contentSearch> 
      <indexConfigurations> 
       <defaultLuceneIndexConfiguration> 
        <fields hint="raw:AddComputedIndexField"> 
         <field fieldName="mycustomfield">MyProject.ComputedFields.MyCustomField, MyProject</field> 
        </fields> 
       </defaultLuceneIndexConfiguration> 
      </indexConfigurations> 
     </contentSearch> 
    </sitecore> 
</configuration> 

Таким образом, вы могли бы изменить свой PowerShell для:

Find-Item ` 
    -Index sitecore_master_index ` 
    -Criteria @{Filter = "StartsWith"; Field = "_fullpath"; Value = "/sitecore/content/" } 
       @{Filter = "Contains"; Field = "mycustomfield"; Value = "mykeyword"} 

Это даст вам все предметы, у которых есть ключевое слово в необходимых типах полей.

Альтернатива, если вы не можете добавить настраиваемое поле будет:

Find-Item ` 
    -Index sitecore_master_index ` 
    -Criteria @{Filter = "StartsWith"; Field = "_fullpath"; Value = "/sitecore/content/" } 
       @{Filter = "Contains"; Field = "_content"; Value = "mykeyword"} 

Это даст вам все случаи, когда любого поля в элементе содержит значение mykeyword. Потому что только Single-line Text, Multi-line text и Richtext хранят текстовое содержимое, которое должно быть довольно близко к тому, что вы хотите. Вы можете получить некоторое загрязнение от полей, таких как поля ссылок или поля изображения, если этот текст находится в любом из свойств поля.

+0

Спасибо @ Richard за это. Но есть ли другое, где я могу получить этот список без изменений кода. Как я должен искать на сервере разработки контента. – PaRsH

+1

Существует поле под названием '_content' - это содержит все поля из элемента, объединенного вместе. Таким образом, вы можете обыскать этот. У вас просто нет фильтра по типу поля. Я обновлю свой ответ, чтобы включить это сообщение –

+0

Обновлен ответ, чтобы включить опцию, используя '_content' –

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