Понимание маршрутизации ElasticSearch

Я пытаюсь использовать отображение маршрутизации asticsearch для ускорения некоторых запросов, но я не получаю ожидаемый набор результатов (пока не беспокоюсь о производительности запросов)

Я использую Elastic для настройки моего отображения:

    $index->create(array('number_of_shards' => 4,
            'number_of_replicas' => 1,
            'mappings'=>array("country"=>array("_routing"=>array("path"=>"countrycode"))),
            'analysis' => array(
                    'analyzer' => array(
                            'indexAnalyzer' => array(
                                    'type' => 'keyword',
                                    'tokenizer' => 'nGram',
                                    'filter' => array('shingle')
                            ),
                            'searchAnalyzer' => array(
                                    'type' => 'keyword',
                                    'tokenizer' => 'nGram',
                                    'filter' => array('shingle')
                            )
                    )
            )  ), true);

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

Результаты _mapping выглядят так:

{"postcode":
    {"postcode":
        {"properties":
               {
               "area1":{"type":"string"},
               "area2":{"type":"string"},
               "city":{"type":"string",
               "include_in_all":true},
               "country":{"type":"string"},
               "country_iso":{"type":"string"},
               "country_name":{"type":"string"},
               "id":{"type":"string"},
               "lat":{"type":"string"},
               "lng":{"type":"string"},
               "location":{"type":"geo_point"},
               "region1":{"type":"string"},
               "region2":{"type":"string"},
               "region3":{"type":"string"},
               "region4":{"type":"string"},
               "state_abr":{"type":"string"},
               "zip":{"type":"string","include_in_all":true}}},
               "country":{
                   "_routing":{"path":"countrycode"},
                   "properties":{}
                          }
                 }
           }

Как только все данные будут в индексе, если я выполню эту команду:

http://localhost:9200/postcode/_search?pretty=true&q=country:au

он отвечает с 15740 всего пунктов

то, что я ожидал, это то, что, если я выполню запрос так:

http://localhost:9200/postcode/_search?routing=au&pretty=true

Тогда я ожидал, что он ответит 15740 результатами

вместо этого он возвращает 120617 результатов, которые включают результаты, где страна!= au

Я заметил, что количество осколков в результатах увеличилось с 4 до 1, поэтому что-то работает.

Я ожидал, что в наборе результатов будет элемент под названием "код страны" (из сопоставления маршрутизации), который не существует

Поэтому я подумал, что мое понимание маршрутизации было неверным. Возможно, все, что делает маршрутизация, это говорит ей, какой осколок искать, а не что искать? другими словами, если коды других стран также окажутся в этом конкретном фрагменте, то, как эти запросы будут записаны, просто вернет все записи в этом фрагменте?

Поэтому я попробовал запрос еще раз, на этот раз добавив к нему некоторую информацию.

 http://localhost:9200/postcode/_search?routing=AU&pretty=true&q=country:AU 

Я подумал, что, сделав это, он заставит запрос дать мне только географические названия AU, но на этот раз он дал мне только 3936 результатов.

Так что я не совсем уверен, что я сделал неправильно, примеры, которые я прочитал, показывают, что запросы меняются от необходимости использования фильтра к использованию match_all{}, который, я думаю, будет только возвращением, соответствующим коду страны поиска.

Спасибо за вашу помощь в правильной работе.

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

$index = $client->getIndex($indexname);
    $index->create(array('mappings'=>array("$indexname"=>array("_routing"=>array("required"=>true))),'number_of_shards' => 6,
            'number_of_replicas' => 1,
            'analysis' => array(
                    'analyzer' => array(
                            'indexAnalyzer' => array(
                                    'type' => 'keyword',
                                    'tokenizer' => 'nGram',
                                    'filter' => array('shingle')
                            ),
                            'searchAnalyzer' => array(
                                    'type' => 'keyword',
                                    'tokenizer' => 'nGram',
                                    'filter' => array('shingle')
                            )
                    )
            )  ), true); 

1 ответ

Решение

Я могу по крайней мере помочь вам с дополнительной информацией о том, где искать:

http://localhost:9200/postcode/_search?routing=au&pretty=true

Этот запрос действительно переводится как "дай мне все документы на осколке, куда должны быть отправлены документы для страны: АС".

Маршрутизация - это просто маршрутизация... она не фильтрует ваши результаты для вас.

Также я заметил, что вы смешиваете свои "au" и "AU".. это тоже может смешивать.

Вы должны попытаться установить для элемента маршрутизации значение true, чтобы убедиться, что ваши документы действительно хранятся вместе с информацией о маршрутизации при индексации.

На самом деле, чтобы убедиться, что ваши документы проиндексированы с правильной маршрутизацией, при индексации документов явно укажите маршрут в нижнем регистре (код страны). Посмотрим, поможет ли это кому-нибудь.

Для получения дополнительной информации попробуйте прочитать этот блог:

http://www.elasticsearch.org/blog/customizing-your-document-routing/

Надеюсь это поможет:)

Другие вопросы по тегам