Перенесите 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")
)
)
)
)
);