Elasticsearch создает поле соединения (Nodejs)
У меня есть следующие документы:
export class CustomerServiceResultType{
id: string;
body:{customerRelation: string};
}
export class CustomerType{
id: string;
body:{name: string};
}
Я хочу , CustomerServiceResultTypeчтобы иметь отношение к CustomerTypeс полем: customerRelation.
это мое отображение:
await this.elasticsearchService.indices.putMapping({
"index": "db",
"type": "CustomerServiceResultType",
"body" : {
"properties": {
"customerRelation": {
"type": "join",
"relations": {
"CustomerServiceResultType": "CustomerType"
}
}
}
}
});
Это ошибка, которую я получаю:
[Nest] 421512 - 11/21/2020, 6:40:42 PM [ExceptionsHandler] illegal_argument_exception +96414ms
ResponseError: illegal_argument_exception
Подробностей об этой ошибке нет ...
благодаря
Ответы
Там ничего плохого с вашим запросом на-се - Я думаю , он просто необходим один дополнительный параметр: include_type_name: true.
Это undefinedпо умолчанию в nodejs, но требуется в ES 7.x на стороне сервера. Больше причин для этого здесь .
Итак, это должно помочь:
await client.indices.putMapping({
include_type_name: true,
index: "db",
type: "CustomerServiceResultType",
body : {
properties: {
customerRelation: {
type: "join",
relations: {
CustomerServiceResultType: "CustomerType"
}
}
}
}
});
Типизированные индексы будут удалены в 8.x, поэтому лучшим подходом будет:
await client.indices.putMapping({
index: "db",
body : {
properties: {
customerRelation: {
type: "join",
relations: {
CustomerServiceResultType: "CustomerType"
}
}
}
}
});
Кстати: ваши типы машинописных текстов на самом деле не играют здесь роли, потому что ES - это интерфейс только для JSON, и, хотя у typeES есть устаревший аспект, эти две концепции очень далеки.