2016-05-27 4 views
2

私は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($_) 
        } 
    } 
} 

答えて

3

無視してください。あなたが持っているものは、非常に悪い結果を出すでしょう。 Sitecoreで何らかの検索を行う場合は、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; 

    } 
} 

を次に経由して、あなたの設定にフィールドを追加します

:だから、あなたがあなたのPowerShellを変更することができます

<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> 

:ファイルを含めます

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のみがテキストコンテンツを保存するので、それはあなたが望むものにかなり近いはずです。テキストがフィールドのいずれかのプロパティにある場合、リンクフィールドやイメージフィールドなどのフィールドから汚染が発生することがあります。

+0

ありがとう@リチャード。しかし、私はコード変更なしでそのリストを得ることができる他の方法があります。私はコンテンツオーサリングサーバで検索しなければならないので。 – PaRsH

+1

'_content'というフィールドがあります。これは、連結されたアイテムのすべてのフィールドを含んでいます。だからあなたはそれを検索することができます。フィールドタイプのフィルターはありません。私はそれを含めるように私の答えを更新します –

+0

'_content'を使ってオプションを含める答えを更新しました –

関連する問題