Sitecore 8.2 Lucene 搜索未对计算字段中的所有术语编制索引
Sitecore 8.2 Lucene search isn't indexing all terms in a computed field
我有一个计算字段,它从项目的子项目中获取信息并将其连接到项目的新字段中。
如果我单步执行调试器,我可以看到计算字段return输入了正确的信息。如果我使用 Luke 检查 Sitecore 生成的索引,我还可以看到具有正确值的计算字段。但是,如果我使用 Luke(或 Sitecore)在计算字段中搜索术语,它并不总是 return 包含该术语的所有文档。
我认为这可能与具有多个语言版本的项目有关。例如,其中一项有荷兰语版本和塞尔维亚语(拉丁语)版本。它们的内容中都包含 "vooderlen" 一词。但是,当我搜索该词时,只有塞尔维亚语文档是 returned。如果我搜索 "assisteert",两个文档都是 returned。我不确定为什么有些条款被忽略了。
相关代码如下:
public class ChildContent : AbstractComputedIndexField
{
public override object ComputeFieldValue(IIndexable indexable)
{
Assert.ArgumentNotNull(indexable, "indexable");
Item item = indexable as SitecoreIndexableItem;
if (item == null)
{
return null;
}
// Only compute child content for Detail Layout templates
string detailLayoutTemplateId = Settings.GetSetting("DetailLayoutTemplateId");
if (item.TemplateID.ToString() != detailLayoutTemplateId)
{
return null;
}
// Get Content Detail item
string contentDetailId = item["Content Detail"];
var valueString = new StringBuilder();
Item contentDetailItem;
string introContent, mainContent;
if (string.IsNullOrEmpty(contentDetailId))
{
return null;
}
contentDetailItem = item.Database.GetItem(ID.Parse(contentDetailId), item.Language);
if (contentDetailItem == null)
{
return null;
}
// Concatenate intro and main content
introContent = contentDetailItem["Intro Content"];
mainContent = contentDetailItem["Main Content"];
if (!string.IsNullOrWhiteSpace(introContent))
{
valueString.Append(Regex.Replace(introContent, "<.*?>", " ") + " ");
}
if (!string.IsNullOrWhiteSpace(mainContent))
{
valueString.Append(Regex.Replace(mainContent, "<.*?>", " ") + " ");
}
return valueString.ToString();
}
}
我也在使用以下搜索配置。
<fieldMap type="Sitecore.ContentSearch.FieldMap, Sitecore.ContentSearch">
<fieldNames hint="raw:AddFieldByFieldName">
<field fieldName="_uniqueid"
storageType="YES"
indexType="TOKENIZED"
vectorType="NO"
boost="1f"
type="System.String"
settingType="Sitecore.ContentSearch.LuceneProvider.LuceneSearchFieldConfiguration, Sitecore.ContentSearch.LuceneProvider">
<analyzer type="Sitecore.ContentSearch.LuceneProvider.Analyzers.LowerCaseKeywordAnalyzer, Sitecore.ContentSearch.LuceneProvider" />
</field>
<field fieldName="childcontent"
storageType="YES"
indexType="TOKENIZED"
vectorType="NO"
boost="1f"
type="System.String"
settingType="Sitecore.ContentSearch.LuceneProvider.LuceneSearchFieldConfiguration, Sitecore.ContentSearch.LuceneProvider">
</field>
</fieldNames>
</fieldMap>
<fields hint="raw:AddComputedIndexField">
<field fieldName="childcontent">My.Namespace.ComputedFields.ChildContent, MyWebApp</field>
</fields>
我注意到如果我在 Luke 中使用 DutchAnalyzer,我能够得到更多荷兰语的结果。遗憾的是,Sitecore 提供的分析器不多,而且 none 是特定于语言的,除非您创建自定义分析器。
幸运的是,这让我走上了正确的轨道,我研究了不同的方法来获取我需要的特定语言的结果。通过将 CultureExecutionContext
传递给 GetQueryable
方法,我能够获得预期的结果。
var queryable = context.GetQueryable<SearchResultItem>(
new CultureExecutionContext(
CultureInfo.GetCultureInfo(Sitecore.Context.Language.ToString())
)
);
我有一个计算字段,它从项目的子项目中获取信息并将其连接到项目的新字段中。
如果我单步执行调试器,我可以看到计算字段return输入了正确的信息。如果我使用 Luke 检查 Sitecore 生成的索引,我还可以看到具有正确值的计算字段。但是,如果我使用 Luke(或 Sitecore)在计算字段中搜索术语,它并不总是 return 包含该术语的所有文档。
我认为这可能与具有多个语言版本的项目有关。例如,其中一项有荷兰语版本和塞尔维亚语(拉丁语)版本。它们的内容中都包含 "vooderlen" 一词。但是,当我搜索该词时,只有塞尔维亚语文档是 returned。如果我搜索 "assisteert",两个文档都是 returned。我不确定为什么有些条款被忽略了。
相关代码如下:
public class ChildContent : AbstractComputedIndexField
{
public override object ComputeFieldValue(IIndexable indexable)
{
Assert.ArgumentNotNull(indexable, "indexable");
Item item = indexable as SitecoreIndexableItem;
if (item == null)
{
return null;
}
// Only compute child content for Detail Layout templates
string detailLayoutTemplateId = Settings.GetSetting("DetailLayoutTemplateId");
if (item.TemplateID.ToString() != detailLayoutTemplateId)
{
return null;
}
// Get Content Detail item
string contentDetailId = item["Content Detail"];
var valueString = new StringBuilder();
Item contentDetailItem;
string introContent, mainContent;
if (string.IsNullOrEmpty(contentDetailId))
{
return null;
}
contentDetailItem = item.Database.GetItem(ID.Parse(contentDetailId), item.Language);
if (contentDetailItem == null)
{
return null;
}
// Concatenate intro and main content
introContent = contentDetailItem["Intro Content"];
mainContent = contentDetailItem["Main Content"];
if (!string.IsNullOrWhiteSpace(introContent))
{
valueString.Append(Regex.Replace(introContent, "<.*?>", " ") + " ");
}
if (!string.IsNullOrWhiteSpace(mainContent))
{
valueString.Append(Regex.Replace(mainContent, "<.*?>", " ") + " ");
}
return valueString.ToString();
}
}
我也在使用以下搜索配置。
<fieldMap type="Sitecore.ContentSearch.FieldMap, Sitecore.ContentSearch">
<fieldNames hint="raw:AddFieldByFieldName">
<field fieldName="_uniqueid"
storageType="YES"
indexType="TOKENIZED"
vectorType="NO"
boost="1f"
type="System.String"
settingType="Sitecore.ContentSearch.LuceneProvider.LuceneSearchFieldConfiguration, Sitecore.ContentSearch.LuceneProvider">
<analyzer type="Sitecore.ContentSearch.LuceneProvider.Analyzers.LowerCaseKeywordAnalyzer, Sitecore.ContentSearch.LuceneProvider" />
</field>
<field fieldName="childcontent"
storageType="YES"
indexType="TOKENIZED"
vectorType="NO"
boost="1f"
type="System.String"
settingType="Sitecore.ContentSearch.LuceneProvider.LuceneSearchFieldConfiguration, Sitecore.ContentSearch.LuceneProvider">
</field>
</fieldNames>
</fieldMap>
<fields hint="raw:AddComputedIndexField">
<field fieldName="childcontent">My.Namespace.ComputedFields.ChildContent, MyWebApp</field>
</fields>
我注意到如果我在 Luke 中使用 DutchAnalyzer,我能够得到更多荷兰语的结果。遗憾的是,Sitecore 提供的分析器不多,而且 none 是特定于语言的,除非您创建自定义分析器。
幸运的是,这让我走上了正确的轨道,我研究了不同的方法来获取我需要的特定语言的结果。通过将 CultureExecutionContext
传递给 GetQueryable
方法,我能够获得预期的结果。
var queryable = context.GetQueryable<SearchResultItem>(
new CultureExecutionContext(
CultureInfo.GetCultureInfo(Sitecore.Context.Language.ToString())
)
);