Как перебрать индексированное поле, чтобы добавить поле из другого индекса - PullRequest
1 голос
/ 19 октября 2019

Я довольно новичок вasticsearch, поэтому я приеду сюда в надежде найти советы. У меня есть два индекса в эластичных из двух разных CSV-файлов.

У index_1 есть это отображение:

{'settings': {
            'number_of_shards' : 3
    },
    'mappings': {
        'properties': {
            'place': {'type': 'keyword' },
            'address': {'type': 'keyword' },
        }
    }
}

Файл имеет длину около 400 000 документов. Индекс_2 с гораздо меньшим файлом (около 50 документов) имеет это отображение:

    {'settings': {
            "number_of_shards" : 1
    },
    'mappings': {
        'properties': {
            'place': {'type': 'text' },
            'address': {'type': 'keyword' },
        }
    }
}

Поле «место» в индексе_2 - это все уникальные значения из поля «место» в индексе_1. В обоих индексах поля «address» являются почтовыми индексами ключевого слова типа данных со структурой: 0000AZ.

На основе ключевого слова field «place» в index_1 я хочу назначить термин поля «address» из index_2.

Я пытался использовать библиотеку панд, но файл index_1 слишком велик. Я также попытался создать модули на основе панд и эластичного поиска, но безуспешно. Хотя я считаю, что это перспективное направление. Хорошим решением было бы как можно больше оставаться в библиотекеasticsearch, так как эти индексы будут позже использованы для дальнейшего анализа.

1 Ответ

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

Если я правильно понимаю, это звучит так, как будто вы хотите использовать updateByQuery .

тело запроса должно выглядеть примерно так:

{
   'query': {'term': {'place': "placeToMatch"}},
   'script': 'ctx._source.address = "updatedZipCode"'
}

Это обновитполе адреса всех документов с соответствующим местом.

РЕДАКТИРОВАТЬ:

Итак, мы хотим использовать updateByQuery при переборе всех документов в index2.

Первый шаг: получить все документы из index2, просто сделайте это, используя базовую функцию поиска

{
   "index": 'index2',
   "size": 100 // get all documents, once size is over 10,000 you'll have to padginate.
   "body": {"query": {"match_all": {}}}
}

Теперь мы перебираем все результаты и используем updateByQuery для каждого из результатов:

// sudo
doc = response[i] 

// update by query request.
{
  index: 'index1',
  body: {
   'query': {'term': {'address': doc._source.address}},
   'script': 'ctx._source.place = "`${doc._source.place}`"'
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...