Перенесите NEST 6.6 на клиент Elasticsearch 8. Неясно, как определить анализаторы

Я пытаюсь перенести свой Elasticsearch на 8, и мне трудно понять, как правильно перенести определения моего анализатора.

Это код, который у меня был ранее (насколько это возможно) с использованием NEST 6.6:

      Client.CreateIndex(
  index => index.Settings(
    settings => settings.Analysis(
       analysis => analysis.TokenFilters(
       tokenFilter => tokenFilter.Synonym("synonym", syn => syn.SynonymsPath("analysis/synonym.txt"))
    ).Analyzers(analyzers => analyzers
       .Custom("mycustom", cust => cust
         .Filters("stop", "synonym").Tokenizer("standard")
        )
    )
  )
)

Это создает индекс со следующим:

      {
  "settings": {
    "index": {
      "analysis": {
        "filter": {
          "synonym": {
            "type": "synonym",
            "synonyms_path": "analysis/synonym.txt"
          }
        },
        "analyzer": {
          "mycustom": {
            "filter": [
              "stop",
              "synonym"
            ],
            "type": "custom",
            "tokenizer": "standard"
          }
        }
      }
    }
  }
}

Вот моя попытка перехода на Elastic.Clients.Elasticsearch 8:

      Client.Indices.Create(index => index.Settings(
 settings => setting.Analysis(
   analysis => analysis
     .Filter(tokenFilter => tokenFilter.Add(
        "synonym", new TokenFilter(new TokenFilterDefinitions(
            // This is where I start getting lost
            new Dictionary<string, ITokenFilterDefinition> {
            { "synonym", new SynonymTokenFilter() { // What are the keys meant to be?
                  SynonymsPath = "analysis/synonym.txt"
             } } }))))
     .Analyzer(analyzers =>
        analyzers.Custom("mycustom", cust => cust.Filter(new[] {"stop", "synonym"})
                 .Tokenizer("standard"))
        )) 
)

Это явно неправильный синтаксис, потому что сгенерированный запрос JSON выглядит так:

      "filter": {
    "synonym": {
        "synonym": {
            "synonyms_path": "analysis/synonym.txt",
            "type": "synonym"
         }
    }
...

Я также пробовал:

      tokenFilter.Add("synonym", new SynonymTokenFilter() { 
   SynonymsPath = "analysis/synonym.txt"
})

в попытке переместить его в иерархии JSON, но затем он не компилируется, потому чтоSynonymTokenFilterне совместим сTokenFilterкоторыйtokenFilter.Addтребует.

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

2 ответа

Я также задавал тот же вопрос на дискуссионных форумах Elastic , и там был ответ, что это ошибка с автоматическим созданием кода нового клиента, и возникла проблема.

Тем временем я работал над этой проблемой, используя код, подобный приведенному ниже:

      var response = Client.Transport.Request<CreateIndexResponse>(
    HttpMethod.PUT,
    $"/{indexName}",
    PostData.String("<actual index definition as a JSON string>")
);

Это работает, но далеко не идеально, потому что мы должны поддерживать JSON определения индекса, а не определять его в коде.

Я предполагаю, что в новую библиотеку было добавлено много дополнений.

Вот пример того, как реализовать это с помощью Elastic.Clients.Elasticsearch 8.1.2:

       var response = await _client.Indices
        .CreateAsync("myindex", config => config
                .Settings(settings => settings
                    .Analysis(a => a
                        .Analyzers(analyzers => analyzers
                            .Custom("mycustom", cust => cust
                                .Filter(new string[] { "stop", "synonym" })
                                )
                        )
                        .TokenFilters(tokenFilters => tokenFilters
                            .Synonym("synonym", syn => syn
                                .SynonymsPath("analysis/synonym.text")
                            )
                        )
                    )
                )
            );
Другие вопросы по тегам