我是 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($_)
}
}
}
答案 0 :(得分:4)
你真的想改变你在这里的方法。你所拥有的将会表现得非常糟糕。要在Sitecore中进行任何类型的搜索,您要使用SearchAPI
- 如果您在SPE中查看Find-Item
命令
此外,您还需要为索引添加自定义计算字段,以使其更简单。
在自定义字段中,将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
存储了文字内容,所以应该非常接近您想要的内容。如果该文本位于该字段的任何属性中,您可能会受到链接字段或图像字段等字段的污染。