Sitecore powershell搜索包含关键字的所有项目

时间:2016-05-27 13:00:18

标签: powershell sitecore sitecore6 sitecore-mvc

我是 sitecore powershell 的新手。我已经阅读了一些文章,但没有任何对我有用。

我需要的是:在我的Sitecore中,我想搜索特定的关键字,我想要输出中列出的所有项目。关键字可以包含在单行文本,多行文本,常规链接,RichText或图像中。我知道使用 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($_)
        }
    }
}

1 个答案:

答案 0 :(得分:4)

你真的想改变你在这里的方法。你所拥有的将会表现得非常糟糕。要在Sitecore中进行任何类型的搜索,您要使用SearchAPI - 如果您在SPE中查看Find-Item命令

此外,您还需要为索引添加自定义计算字段,以使其更简单。

在自定义字段中,将Single-line textRichtext的所有字段添加到索引中:

因此,在计算字段中,您可以执行以下操作:

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 TextMulti-line textRichtext存储了文字内容,所以应该非常接近您想要的内容。如果该文本位于该字段的任何属性中,您可能会受到链接字段或图像字段等字段的污染。