Понимание маршрутизации 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/
Надеюсь это поможет:)