Я обновляю свой проект 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.