Есть ли способ понять, почему мое сопоставление Elasticsearch версии 7.6 не работает и по умолчанию используется базовое сопоставление?

Я обновляю свой проект Elasticsearch с версии 6.6 до версии 7.6.2. Я использую Elasticsearch.NET и NEST для создания своего индекса, включая сопоставления, настройки, и для загрузки моих данных в Elasticsearch из моей базы данных SQL.

Все хорошо работает в версии 6.6, но когда я обновился до версии 7.6.2, он больше не принимает мои пользовательские сопоставления и настройки. Я имею в виду такие вещи, как мои вложенные объекты, мои пользовательские анализаторы и т. д. Данные действительно загружаются, но по умолчанию они соответствуют, ну, сопоставлению по умолчанию (где в основном все является ключевым словом или простым типом данных).

Такое поведение обычно происходит, когда в ваших сопоставлениях или в вашем POCO есть что-то синтаксически неправильное. Это не мой случай, я не думаю.

Есть ли какие-то критические изменения в версии 7.x, которые я мог пропустить? Я достаточно подробно изучил документацию.

Чтобы дать пример того, как должно выглядеть мое сопоставление, вот выдержка (из моего кластера v6.6).

...обратите внимание, например, что объект "продукты" имеет тип: вложенный...

[{"searchdata":{"_all":{"enabled":false},"properties":{"groupid":{"type":"text","fields":{"keyword":{"type":"keyword","ignore_above":256}}},"products":{"type":"nested","properties":{"adddate":{"type":"date"},"additionaltitles":{"type":"text"},"additionaltitleslist":{"type":"text","fields":{"keyword":{"type":"keyword","ignore_above":256}}},"adult":{"type":"integer"},"artists":{"properties":{"id":{"type":"text","fields":{"keyword":{"type":"keyword","ignore_above":256}}},"name":{"type":"text","norms":false,"fields":{"ci":{"type":"text","norms":false,"analyzer":"caseInsensitive"},"nc":{"type":"text","norms":false,"analyzer":"titleNoCharAnalyzer"},"raw":

и вот что он показывает как версию по умолчанию в v7.6.2...

... обратите внимание на такие вещи, как не вложенный объект "продукты" и множество типов "ключевых слов", отсутствие пользовательских анализаторов и т. д....

    [{"_doc":{"properties":{"groupid":{"type":"text","fields":{"keyword":{"type":"keyword","ignore_above":256}}},"products":{"properties":{"adult":{"type":"long"},"artists":{"properties":{"id":{"type":"text","fields":{"keyword":{"type":"keyword","ignore_above":256}}},"name":{"type":"text","fields":{"keyword":{"type":"keyword","ignore_above":256}}},"nameidsplit":{"type":"text","fields":{"keyword":{"type":"keyword","ignore_above":256}}},"nameremarticle":{"type":"text","fields":{"keyword":{"type":"keyword","ignore_above":256}}}}},"catalognum":{"type":"text","fields":{"keyword":{"type":"keyword","ignore_above":256}}},"costprice":{"type":"float"},"cover":{"type":"text","fields":{"keyword":{"type":"keyword","ignore_above":256}}},"credits":{"properties":{"id":{"type":"text","fields":{"keyword":{"type":"keyword","ignore_above":256}}},"name":{"type":"text","fields":{"keyword":{"type":"keyword","ignore_above":256}}},"nameidsplit":{"type":"text","fields":{"keyword":{"type":"keyword","ignore_above":256}}},"nameremarticle":{"type":"text","fields":

Как вы могли заметить, версия v6.6 гораздо более детализирована и содержит мои вложенные объекты и т. д. Но моя версия v7.6.2 содержит базовую структуру по умолчанию.

Что-то здесь должно быть не так, но я не знаю что.

Есть ли какой-либо уровень ведения журнала отладки, который я могу включить, чтобы узнать, почему это "сбой"?

ОБНОВЛЕНИЕ Поэтому я помещаю здесь немного сокращенную версию того, как я сопоставляю свои объекты и настройки. Надеюсь, это поможет понять этот вопрос.

var indexCreate = client.Indices.Create(indexName, nc => nc
.Settings(st => st
    .RefreshInterval(60) //slowing the refresh interval so we can get a running count
    .NumberOfReplicas(0) //must be set to refresh after created
    .NumberOfShards(numOfShards)
    .Analysis(a => a
        .Analyzers(an => an
            .UserDefined("fullTermCaseInsensitive", FullTermCaseInsensitive)
            .UserDefined("fullTerm", FullTerm)
            .UserDefined("caseInsensitive", CaseInsensitive)                      
        )
        .TokenFilters(tf => tf
            .UserDefined("syn", Syn)
            .UserDefined("myStopFilter", MyStopFilter)
            .UserDefined("wordDelimiter", WordDelimiter)                           
        )
    )
)
.Map<Store24>(m => m
    .Dynamic(false)

    .AutoMap()
    .Properties(props =>
    {
        SetPutMappingStore24(props); //see function below
        return props;
    })
));
       private static void SetPutMappingStore24(PropertiesDescriptor<Store24> pm)
       {
            pm.Nested<Product>(x => x
                .AutoMap()
                .Name(nm => nm.Products)
                .Properties(pr => pr
                    .Nested<StorePriceSplit>(sp => sp
                        .Name("storeprice").AutoMap()
                    )
                .Properties(props =>
                    {
                        SetPutMappingDescriptorTiWo(props, "tracks");
                        SetPutMappingDescriptorTiWo(props, "title");
                    }
                )
           );

       //...... more fluent mappings here
       }
    [ElasticsearchType(IdProperty = "Groupid")]
    public class Store24
    {
        /// <summary>
        /// Identifiers
        /// </summary>
        [Key]
        [Keyword]
        public string Groupid { get; set; }

        [JsonIgnore]
        public string Upc { get; set; }

        [JsonIgnore]
        public string Titleremarticle { get; set; }

        [Nested]
        [PropertyName("products")]
        public IEnumerable<Product> Products { get; set; }

    //... more properties here
    }
    [ElasticsearchType(RelationName = "product")]
    public class Product
    {
        [Key]
        [Text(Analyzer = "fullTermCaseInsensitive")]
        public string Upc { get; set; }

        [Text(Analyzer = "fullTermCaseInsensitive", Fielddata = true)]
        public string Titleremarticle { get; set; }

    //...more properties here
    }

Я использую два объекта: один с именем Store24, который сопоставляет данные, возвращенные из SQL, и другой с именем Product, который создает сопоставление Elasticsearch.


person bigerock    schedule 03.04.2020    source источник
comment
Как у вас с картографией? Как вы применили это в версии 7.X? Обновите свой вопрос с помощью сопоставления. Произошло большое изменение с версии 6.X на версию 7.X, удаление типов сопоставления   -  person leandrojmp    schedule 04.04.2020
comment
Можете ли вы также предоставить сообщение об ошибке, если вы его получаете?   -  person user156327    schedule 04.04.2020
comment
Ошибки как таковой нет, просто сопоставление не отражает сопоставление, которое я даю в беглых сопоставлениях. Вместо этого по умолчанию используется то, что Elasticsearch выясняет, что это за типы. Это означает, что строка по умолчанию является ключевым словом и т. д. Он игнорирует мои сопоставления, такие как [Text (Analyzer = fullTermCaseInsensitive, Fielddata = true)] в общедоступной строке Titleremarticle { get; установлен; }, Например.   -  person bigerock    schedule 05.04.2020


Ответы (1)


Я разобрался со своей проблемой. Кажется, создание индекса выдавало ошибку, но я ее не видел. Он был «скрыт» ответом на возвращаемый объект Indices.Create(). (объект var indexCreate в моем примере выше). Как только я ткнул в него, возникла следующая ошибка: «Фильтр токенов [wordDelimiter] не может использоваться для анализа синонимов».

Это была проблема с моими настройками - я думаю, что это критическое изменение для 7.x, которого я не видел. На самом деле довольно сложный вопрос.

person bigerock    schedule 06.04.2020