Пример индексации в elasticsearch?

Я прочитал руководство по индексированию. документы в Elasticsearch. Есть пример с массовой индексацией. У меня вопрос, правильно ли создается массив с двумя ключами для одного элемента в цикле:

for($i = 0; $i < 100; $i++) {
    $params['body'][] = array(
        'index' => array(
            '_id' => $i
        )
    );

    $params['body'][] = array(
        'my_field' => 'my_value',
        'second_field' => 'some more values'
    );
}

Почему в цикле две инициализации массива $params['body'][]? Должна быть установка индекса по тому же ключу, что и my_field?

Я имею в виду один случай, когда вся информация об индексе добавляется в массив по одному ключу (индексу):

$params['body'][] = array(
            'index' => array(
                '_id' => $i
            ),

            'my_field' => 'my_value',
            'second_field' => 'some more values'
        );

Также после поискового запроса я получаю ошибку:

Сообщение: Недопустимое смещение строки "совпадение" в строке, где находится:

$query['match']['name'] = $query;

где $query — строка.

Я предполагаю, что эта ошибка связана с проблемой создания индекса, поэтому я начал с этого.

Мой код, который добавляет документ в индекс:

private function addDocument($data = array(), $type)
    {
        if (!empty($data)) {
            foreach ($data as $key => $val) {
                $params['body'][] = array(
                    'index' => array(
                        '_id' => $key,
                        '_type' => 'profiles',
                        '_index' => $this->_typeIndex($type)
                    )
                );

                $params['body'][] = (array)$val;
            }

            $this->client->bulk($params);
        }

    }

Это правильно? Потому что при поиске выдает ошибку, описанную здесь


person Babaev    schedule 29.07.2015    source источник


Ответы (1)


Чтобы массовое индексирование работало, полезная нагрузка должна содержать одну строку команды (индекс, тип, идентификатор документа) и одну строку содержимого (фактические поля документа) для каждого документа, например:

{"index": {"_id": "1234"}}               <--- command for doc1
{"field1": "value1", "field2": "value2"}  <--- source for doc1
{"index": {"_id": "1234"}}               <--- command for doc2
{"field1": "value1", "field2": "value2"}  <--- source for doc2
...

Приведенный вами пример PHP делает именно это:

$params['body'][] = array(
    'index' => array(
        '_id' => $i
    )
);

создаст первую командную строку, читающую {"index": {"_id": "0"}} и

$params['body'][] = array(
    'my_field' => 'my_value',
    'second_field' => 'some more values'
);

создаст вторую строку содержимого, читающую {"my_field": "my_value", "second_field": "some more values"}

Цикл for делает это в 100 раз и создает полезную нагрузку, содержащую 200 строк для 100 документов.

Если вы объедините тело, как вы сделали с

$params['body'][] = array(
        'index' => array(
            '_id' => $i
        ),

        'my_field' => 'my_value',
        'second_field' => 'some more values'
    );

Это не сработает, потому что это создаст одну строку для каждого документа, читающуюся следующим образом:

{"index":{"_id": "0"}, "my_field": "my_value", "second_field": "some more values"}

И массовая операция потерпит неудачу...

Попробуйте еще раз.

ОБНОВЛЕНИЕ

Это не работает, потому что вы добавляете слишком много строк. Вы должны удалить foreach и просто сделать это так. Я просто не уверен, как называется ваше поле id. Также я полагаю, что массив $data содержит поля документа для добавления.

private function addDocument($data = array(), $type)
    {
        if (!empty($data)) {
            $params['body'][] = array(
                'index' => array(
                    '_id' => $data['id'],    <--- make sure to use the right id field
                    '_type' => 'profiles',
                    '_index' => $this->_typeIndex($type)
                )
            );
            $params['body'][] = $data;

            $this->client->bulk($params);
        }
    }
person Val    schedule 30.07.2015
comment
У меня все еще не работает, я поделился своим кодом, о котором идет речь - person Babaev; 30.07.2015