Я хочу запустить поисковый запрос MultiGet (mget
) для нескольких идентификаторов по двум индексам. Это потому, что у меня есть два индекса, но я не знаю, какой индекс содержит мой идентификатор. Это запрос:
GET _mget
{
"docs" : [
{
"_id": "id1",
"_index": "index1"
},
{
"_id": "id1",
"_index": "index2"
}
/* .... */
]
}
Запрос отлично работает вручную — я получаю результаты и просто игнорирую результат, который возвращает found: false
.
Nest
не поддерживает эту функциональность, только на одном индексе. Поэтому я попытался использовать низкоуровневый клиент для достижения этой цели, например:
var data = PostData.Serializable(new
{
docs = new[]
{
new {
_id = "1",
_index = "index1"
},
new
{
_id = "1",
_index = "index2"
}
}
});
var response = await lowLevelClient.MultiGetAsync<MultiGetResponse>(data);
Однако я получаю следующее исключение: Elasticsearch.Net.UnexpectedElasticsearchClientException: 'Constructor on type 'Nest.MultiGetResponseFormatter' not found.'
.
Это правильный способ добиться того, чего я хочу?
Следующее поможет вам достичь того, что вы ищете с NEST
var request = new MultiGetRequest();
request.Documents = new IMultiGetOperation[]
{
new MultiGetOperation<object>("id1") { Index = "index1" },
new MultiGetOperation<object>("id1") { Index = "index2" },
};
var multiGetResponse = await client.MultiGetAsync(request);
Итак, после множества проб и ошибок кажется, что лучший способ добиться этого — проверить свойство MultiGetResponse.Hits
, чтобы проверить каждое попадание на наличие ошибок типа index_not_found_exception
. Если общее количество проблемных обращений совпадает с количеством обращений, то можно предположить, что индексов все не существует, и это проблема.
@gUnleash, может, вместо mget
использовать _msearch
, который поддерживает ignore_unavailable
? Документы
Привет Роб. Спасибо, я сам пришел к тому же ответу, прежде чем увидел ваш. Теперь у меня есть проблема: если я ищу документы, в которых ОДИН из индексов не существует, я хочу игнорировать отсутствующий индекс (в основном это делает флаг
ignore_unavailable
). Однако я не уверен, как использовать флагignore_unavailable
в запросахmget
. Теперь, если один индекс отсутствует,IResponse.IsValid
равноfalse
.