通常の(非SXAの)サイトでレンダリングのデータ ソースのフィールドにクエリを使用した際、データ ソースの解決が失敗し、Content Deliveryのインスタンスのログに以下のエラーが出力される場合があります:
ERROR Solr Error : ["undefined field query"] - Query attempted: <Sitecore Query syntax>
この問題の原因は、非SXAサイトのデータ ソースのレンダリングにSitecoreクエリ構文が使用することができないことです。
この問題を解決するには、以下のいずれかのオプションをご検討ください:
註:上記は、Sitecoreクエリ構文に対するサポートが追加提供されることを示すものではありません。Sitecoreクエリ構文が適用されている場合に、検索インデックスを使用してデータ ソースの解決をしないようにするものです。
別の解決策として、以下のオプションが挙げられます:
SELECT [ItemId]
,[Language]
,[FieldId]
,[Value]
FROM [dbo].[Fields]
WHERE (FieldId = '{F1A1FE9E-A60C-4DDB-A3A0-BB5B29FE732E}' OR FieldId = '{04BF00DB-F5FB-41F7-8AB7-22408372A981}') AND ([Value] like '%ds="query%')
using Sitecore.Pipelines.ParseDataSource;
using System;
using System.Linq;
namespace Sitecore.ContentSearch.Client.Pipelines.ParseDataSource
{
public class AbortIfDatasourceIsPrefixed
{
private readonly string[] _prefixes =
{
DatasourcePrefixes.QueryPrefix,
DatasourcePrefixes.LocalPrefix,
DatasourcePrefixes.PageRelativePrefix,
DatasourcePrefixes.FieldPrefix,
DatasourcePrefixes.CodePrefix,
};
public void Process([NotNull] ParseDataSourceArgs args)
{
if (IsDataSourcePrefixed(args.DataSource))
{
args.AbortPipeline();
}
}
protected virtual bool IsDataSourcePrefixed(string dataSource)
{
return dataSource.Length > 1 &&
dataSource.Contains(":") &&
_prefixes.Any(s => dataSource.StartsWith(s, StringComparison.OrdinalIgnoreCase));
}
internal static class DatasourcePrefixes
{
public const string PageRelativePrefix = "page:";
public const string LocalPrefix = "local:";
public const string FieldPrefix = "field:";
public const string CodePrefix = "code:";
public const string QueryPrefix = "query:";
}
}
}
<?xml version="1.0" encoding="utf-8"?>
<configuration xmlns:patch="http://www.sitecore.net/xmlconfig/"
xmlns:role="http://www.sitecore.net/xmlconfig/role/">
<sitecore role:require="Standalone or ContentManagement or ContentDelivery">
<pipelines>
<parseDataSource>
<processor type="Sitecore.ContentSearch.Client.Pipelines.ParseDataSource.CustomProcessor, Custom.Assembly" patch:before="processor[@type='Sitecore.ContentSearch.Client.Pipelines.ParseDataSource.GetDataSourceItemByQuery, Sitecore.ContentSearch.Client']" />
</parseDataSource>
</pipelines>
</sitecore>
</configuration>