Skip to content

Instantly share code, notes, and snippets.

@michaellwest
Last active July 3, 2018 17:13
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save michaellwest/c5e43d1bce725ac63f2034171a2cb394 to your computer and use it in GitHub Desktop.
Save michaellwest/c5e43d1bce725ac63f2034171a2cb394 to your computer and use it in GitHub Desktop.
Using raw methods to query the Sitecore Content Search API using PowerShell.
Add-Type -AssemblyName "Sitecore.ContentSearch"
Add-Type -AssemblyName "Sitecore.ContentSearch.Linq"
class ExtendedSearchResultItem : Sitecore.ContentSearch.SearchTypes.SearchResultItem {
[Sitecore.ContentSearch.IndexField("_latestversion")]
[bool]$IsLatestVersion
}
# String
$methodContains = [string].GetMethod("Contains")
$method = [Sitecore.ContentSearch.Linq.Utilities.PredicateBuilder].GetMethod("True")
$type = [ExtendedSearchResultItem]
$genericMethod = $method.MakeGenericMethod($type)
$predicate = $genericMethod.Invoke([Sitecore.ContentSearch.Linq.Utilities.PredicateBuilder], $null)
$parameterItem = [System.Linq.Expressions.Expression]::Parameter([ExtendedSearchResultItem], "item")
$memberItem = [System.Linq.Expressions.Expression]::Property($parameterItem, "Name")
$constantItem = [System.Linq.Expressions.Expression]::Constant("avoid")
$bodyItem = [System.Linq.Expressions.Expression]::Equal($memberItem, $constantItem)
$predicateAnd = [System.Linq.Expressions.Expression]::Lambda($bodyItem, $parameterItem)
$predicate = [Sitecore.ContentSearch.Linq.Utilities.PredicateBuilder]::And($predicate, $predicateAnd)
$containsItem = [System.Linq.Expressions.Expression]::Call($memberItem, $methodContains, $constantItem)
$predicateAnd = [System.Linq.Expressions.Expression]::Lambda($containsItem, $parameterItem)
$predicate = [Sitecore.ContentSearch.Linq.Utilities.PredicateBuilder]::And($predicate, $predicateAnd)
Add-Type -AssemblyName "Sitecore.ContentSearch"
Add-Type -AssemblyName "Sitecore.ContentSearch.Linq"
class ExtendedSearchResultItem : Sitecore.ContentSearch.SearchTypes.SearchResultItem {
[Sitecore.ContentSearch.IndexField("_latestversion")]
[bool]$IsLatestVersion
}
# String methods
$methodContains = [string].GetMethod("Contains")
# Build predicate
function New-PredicateBuilder {
param(
[string]$SearchType,
[switch]$IsTrue
)
$methodName = @{$true="True";$false="False"}[$IsTrue.IsPresent]
$type = Invoke-Expression -Command "[$($SearchType)]"
$method = [Sitecore.ContentSearch.Linq.Utilities.PredicateBuilder].GetMethod($methodName)
$genericMethod = $method.MakeGenericMethod($type)
$genericMethod.Invoke([Sitecore.ContentSearch.Linq.Utilities.PredicateBuilder], $null)
}
$predicate = New-PredicateBuilder -SearchType "ExtendedSearchResultItem" -IsTrue
$parameterItem = [System.Linq.Expressions.Expression]::Parameter([ExtendedSearchResultItem], "item")
$memberItem = [System.Linq.Expressions.Expression]::Property($parameterItem, "Name")
$constantItem = [System.Linq.Expressions.Expression]::Constant("avoid")
$bodyItem = [System.Linq.Expressions.Expression]::Equal($memberItem, $constantItem)
$predicateAnd = [System.Linq.Expressions.Expression]::Lambda($bodyItem, $parameterItem)
#$predicate = [Sitecore.ContentSearch.Linq.Utilities.PredicateBuilder]::And($predicate, $predicateAnd)
#$containsItem = [System.Linq.Expressions.Expression]::Call($memberItem, $methodContains, $constantItem)
# = [System.Linq.Expressions.Expression]::Lambda($containsItem, $parameterItem)
$predicate = [Sitecore.ContentSearch.Linq.Utilities.PredicateBuilder]::And($predicate, $predicateAnd)
Add-Type -AssemblyName "Sitecore.ContentSearch"
Add-Type -AssemblyName "Sitecore.ContentSearch.Linq"
class ExtendedSearchResultItem : Sitecore.ContentSearch.SearchTypes.SearchResultItem {
[Sitecore.ContentSearch.IndexField("_latestversion")]
[bool]$IsLatestVersion
}
function Get-Queryable {
param(
[Sitecore.ContentSearch.IProviderSearchContext]$Context,
[string]$SearchType
)
$method = $context.GetType().GetMethods() | Where-Object { $_.Name -eq "GetQueryable" } | Select-Object -First 1
$type = Invoke-Expression -Command "[$($SearchType)]"
$genericMethod = $method.MakeGenericMethod($type)
,$genericMethod.Invoke($context, $null)
}
$searchIndex = [Sitecore.ContentSearch.ContentSearchManager]::GetIndex("sitecore_master_index")
$results = New-UsingBlock ($context = $searchIndex.CreateSearchContext()) {
$queryable = Get-Queryable -Context $context -SearchType "ExtendedSearchResultItem"
#$queryable = [Sitecore.ContentSearch.Utilities.DynamicQueryable]::Where($queryable, "TemplateName = @0", @("News Article"))
$templateId = [Sitecore.Data.ID]::Parse("{A3194703-25ED-4722-8744-4C35190DA9DD}")
$name = "avoid-"
$queryable = [Sitecore.ContentSearch.Utilities.DynamicQueryable]::Where($queryable, "TemplateId = @0 And Name.Contains(@1) And IsLatestVersion = @2", @($templateId, $name, $true))
#$queryable = [Sitecore.ContentSearch.Utilities.DynamicQueryable]::Take($queryable, 100)
$queryable
}
$results | Select-Object -Property Name,IsLatestVersion
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment