Sitecore 8.2 Lucene搜索未对计算字段中的所有术语编制索引

时间:2017-06-08 13:04:41

标签: search lucene sitecore multilingual computed-field

我有一个计算字段,它从项目的子项中获取信息,并将其连接到项目的新字段中。

如果我单步执行调试器,我可以看到计算字段返回正确的信息。如果我使用Luke检查Sitecore生成的索引,我还可以看到具有正确值的计算字段。但是,如果我使用Luke(或Sitecore)对计算字段中的术语执行搜索,则它并不总是返回包含该术语的所有文档。

我认为这可能与多语言版本的项目有关。例如,其中一个项目有荷兰语版本和塞尔维亚语(拉丁语)版本。它们的内容中都包含“vooderlen”一词。但是,当我搜索该术语时,只返回塞尔维亚文档。如果我搜索“assisteert”,则返回两个文件。我不确定为什么有些术语会被忽略。

以下是相关代码:

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>

1 个答案:

答案 0 :(得分:1)

我注意到如果我在Luke使用DutchAnalyzer,我能够获得更多荷兰语的结果。不幸的是,Sitecore不提供多个分析器,除非您创建自定义分析器,否则没有一个是特定于语言的。

幸运的是,这使我走上了正确的轨道,我研究了不同的方法来获取我需要的特定语言的结果。通过将CultureExecutionContext传递到GetQueryable方法,我就能得到我期望的结果。

var queryable = context.GetQueryable<SearchResultItem>(
    new CultureExecutionContext(
        CultureInfo.GetCultureInfo(Sitecore.Context.Language.ToString())
    )
);
相关问题