Sitecore powershell ищет все элементы, которые содержат ключевое слово

Я новичок в sitecore powershell. Я просмотрел несколько статей, но ничего не помогло мне.

Что мне нужно: в моем Sitecore я хочу найти определенное ключевое слово, и я хочу, чтобы все элементы, перечисленные в выводе. Ключевое слово может содержаться в однострочном тексте, многострочном тексте, общей ссылке, расширенном тексте или изображении. Я знаю, что это достижимо с помощью 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($_)
        }
    }
}

person PaRsH    schedule 27.05.2016    source источник


Ответы (1)


Вы действительно хотите изменить свой подход. То, что у вас есть, будет работать очень плохо. Для любого вида поиска в 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 хранят текстовое содержимое, это должно быть довольно близко к тому, что вы хотите. Вы можете получить некоторое загрязнение из таких полей, как поля ссылок или поля изображений, если этот текст находится в любом из свойств поля.

person Richard Seal    schedule 27.05.2016
comment
Спасибо @Richard за это. Но есть ли другой способ, где я могу получить этот список без изменений кода. Поскольку мне нужно искать на сервере создания контента. - person PaRsH; 27.05.2016
comment
Существует поле с именем _content — оно содержит все поля из элемента, объединенные вместе. Так что вы можете поискать тот. У вас просто нет фильтра по типу поля. Я обновлю свой ответ, чтобы включить это - person Richard Seal; 27.05.2016
comment
Обновлен ответ, чтобы включить опцию с использованием _content - person Richard Seal; 27.05.2016