Elasticsearch возвращаемый тип - PullRequest
3 голосов
/ 10 октября 2019

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

Код еще не завершен и используется только для POC, не используйте его в работе, если вы собираетесь его скопировать:).

Моя функция создания, которая работает нормально:

async create(index: string, obj: any, id: string): Promise<TModel> {
    let req: RequestParams.Create<TModel> = {
        body: obj,
        index: index,
        id: id,
    };
    try {
        var result = await this.client.create(req, {
            ignore:[409]
        });
        if (result.statusCode === 201) {
            return result.body;
        } else {
            console.log("Non succesfull call, result:", result);
            return null;
        }
    } catch (error) {
        console.log("create error", error);
        return null;
    }
}

Моя функция обновления, которая работает примерно так же

async update(index: string, obj: any, id: string): Promise<TModel> {
    try {
        let req: RequestParams.Update<TModel> = {
            body: obj,
            index: index,
            id: id
        };
        var result = await this.client.update(req);
        if (result.statusCode === 200 || result.statusCode === 201 || result.statusCode == 202 || result.statusCode == 204) {
            return result.body;
        } else {
            console.log("Non succesfull call, result:", result);
            return null;
        }
    } catch (error) {
        console.error("Error updating", error);
    }
}

Функция поиска, с которой я начал:

async search(index: string, searchBody: any): Promise<any> {

    try {
        var result = await this.client.search({
            index: index,
            body: searchBody
        });
        if (result.statusCode === 200) {
            return result.body.hits.hits;
        } else {
            console.log("Non succesfull call, result:", result);
            return null;
        }
    } catch (error) {
        console.log("Error getting result", error);
        return null;
    }
}

При вставке и последующем поиске объекта вы, конечно, получаете тип возврата any. Зная, как структурированы данные, где-то я делаю следующее только для быстрого тестирования:

return result.body.hits.hits[0]._source

Что дает мне в результате:

enter image description here

Хотя JSON-формат объекта кажется правильным, так же, как я его создал, он выдает ошибку при обновлении данных:

error

Поэтому я гуглил и пытаюсь применить это решение, предоставленное самим эластиком:

https://www.elastic.co/guide/en/elasticsearch/client/javascript-api/current/typescript.html

Поиск кода:

async searchTyped(index: string, searchBody: any): Promise<TModel> {
    try {
        let req : RequestParams.Search<TModel> ={
            index : index,
             body : searchBody,
        };
        var result : ApiResponse<SearchResponse<TModel>> = await this.client.search(req);
        if (result.statusCode === 200) {
            if(result.body.hits.hits.length > 0){
                return result.body.hits.hits[0]._source;
            }
            return null;
        } else {
            console.log("Non succesfull call, result:", result);
            return null;
        }
    } catch (error) {
        console.log("Error getting result", error);
        return null;
    }
}

Согласно intellisense, это должно работать, _source должно быть типа TModel.

enter image description here

К сожалению, не повезло:

enter image description here

Нахожусь ли я на правильном пути, чтобы убедиться, что объекты данных верны перед обновлением?

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

1 Ответ

0 голосов
/ 11 октября 2019

В конце концов, не имело значения, что это был за объект, мне просто нужно было выполнить обновление по-другому:

async update(index: string, obj: any, id: string): Promise<any> {
    try {
        let req: RequestParams.Update<any> = {
            body: {
                "doc": obj
            },
            index: index,
            id: id
        };
        var result = await this.client.update(req);
        if (result.statusCode === 200 || result.statusCode === 201 || result.statusCode == 202 || result.statusCode == 204) {
            return result.body;
        } else {
            console.log("Non succesfull call, result:", result);
            return null;
        }
    } catch (error) {
        console.error("Error updating", error);
    }
}

Так что все обновления должны быть в пределах doc, и тогда все в порядке.

Найдено в этом руководстве: https://hub.packtpub.com/crud-create-read-update-delete-operations-elasticsearch/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...