Sitecore 8.2 Lucene search не индексирует все термины в вычисляемом поле

У меня есть вычисляемое поле, которое берет информацию из подпунктов элемента и объединяет ее в новое поле элемента.

Если я перейду к отладчику, то увижу, что вычисляемое поле возвращает правильную информацию. Если я проверяю индексы, сгенерированные Sitecore с использованием Luke, я также вижу вычисленное поле с правильными значениями. Однако, если я выполняю поиск с помощью Люка (или в Sitecore) для термина в вычисляемом поле, он не всегда возвращает все документы, содержащие этот термин.

Я считаю, что это может быть связано с элементами с несколькими языковыми версиями. Например, один из предметов имеет голландскую версию и сербскую (латинскую) версию. Они оба содержат слово "воодерлен" в своем содержании. Но когда я ищу этот термин, возвращается только сербский документ. Если я ищу "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 ответ

Решение

Я заметил, что если бы я использовал DutchAnalyzer в Luke, я смог получить больше результатов для голландского языка. К сожалению, Sitecore предлагает не более нескольких анализаторов, и ни один из них не зависит от языка, если вы не создадите собственный анализатор.

К счастью, это поставило меня на правильный путь, и я искал разные способы получения результатов для нужного мне языка. Проходя в CultureExecutionContext в GetQueryable Метод, я смог получить ожидаемые результаты.

var queryable = context.GetQueryable<SearchResultItem>(
    new CultureExecutionContext(
        CultureInfo.GetCultureInfo(Sitecore.Context.Language.ToString())
    )
);
Другие вопросы по тегам