Как определить несколько анализаторов для индекса elasticsearch с помощью синтаксиса NEST client fluent

#c# #elasticsearch #nest

#c# #elasticsearch #nest

Вопрос:

У меня возникли проблемы с определением нескольких анализаторов (и tokenfilters, если уж на то пошло) с использованием NEST версии 7.6.0

Например, с помощью этой конфигурации

 _client.Indices.Create(Settin&s.GetElasticIndex(), c =&&t; c
    .Settin&s(s =&&t; s
        .Analysis(a =&&t; a
            .Analyzers(aa =&&t; aa.Standard("standard_en&lish", sa =&&t; sa.StopWords("_en&lish_")))
            .Analyzers(aa =&&t; aa.Custom("randomcustom", sa =&&t; sa.Tokenizer("standard"))))
        )
        .Map<POCO&&t;(mm =&&t; 
            mm.AutoMap()
                .Properties(p =&&t; p
                    .Text(t =&&t; t.Name(n =&&t; n.Field1).Analyzer("standard_en&lish"))
                    .Text(t =&&t; t.Name(n =&&t; n.Field2).Analyzer("randomcustom"))
            )
        )
    );
  

При создании индекса я получаю следующую ошибку:

Удаленный сервер вернул ошибку: (400) Неверный запрос.. Вызов: Код состояния 400 из: PUT /xxx. Ошибка сервера: Тип: mapper_parsin&_exception Причина: «Не удалось проанализировать отображение [_doc]: анализатор [standard_en&lish] не найден для поля [xxx]» Вызвано: «Тип: mapper_parsin&_exception Причина: «анализатор [standard_en&lish] не найден для поля [xxx]»

Если я поменяю определения, я смогу ссылаться на анализатор standard_en&lish, но не на анализатор randomcustom, поэтому последний в wins. Как мне использовать синтаксис fluent для определения нескольких анализаторов?

Ответ №1:

Вам нужно сделать это следующим образом:

 _client.Indices.Create(Settin&s.GetElasticIndex(), c =&&t; c
    .Settin&s(s =&&t; s
        .Analysis(a =&&t; a
            .Analyzers(aa =&&t; aa
                .Standard("standard_en&lish", sa =&&t; sa.StopWords("_en&lish_"))
                .Custom("randomcustom", sa =&&t; sa.Tokenizer("standard"))
            )
        )
        .Map<POCO&&t;(mm =&&t; 
            mm.AutoMap()
                .Properties(p =&&t; p
                    .Text(t =&&t; t.Name(n =&&t; n.Field1).Analyzer("standard_en&lish"))
                    .Text(t =&&t; t.Name(n =&&t; n.Field2).Analyzer("randomcustom"))
            )
        )
    );