Как заставить работать сортировку Elastica Query?
Я пытаюсь отсортировать результаты поиска, но я просто получаю несортированные результаты с помощью следующего кода (в этом примере я запрашиваю все результаты):
$query = new \Elastica\Query();
$query->setSort(array('id' => array('order' => 'desc')));
$resultSet = $type->search($query); // where $type is an elastica type object
$results = $resultSet->getResults();
Для справки, я использую FOSElasticaBundle с проектом Symfony2 (используя $type = $this->container->get('fos_elastica.index.website.myType');
), но это не должно иметь значения.
Если я сделаю запрос прямо в браузере с http://localhost:9200/website/myType/_search?sort=id:desc&pretty=true
Я получаю результаты правильно отсортированы.
1 ответ
На самом деле, приведенный в вопросе код верен, и он возвращает правильно отсортированные результаты.
Проблема, с которой я столкнулся, не была связана с Elastica и кодом, приведенным в вопросе.
Оказывается, что результаты, которые я перенастроил в моем HTML, были не отсортированы, потому что я не возвращал результаты своего Elastica Query, а соответствующие объекты из моей базы данных SQL, которые были получены из запроса, подобного этому:
SELECT * FROM ...
WHERE id IN([ids from Elastica results in order])
Приведенный выше SQL-запрос не возвращает результаты в порядке идентификаторов, указанных в предложении "IN", поэтому необходимо было переупорядочить результаты SQL в соответствии с порядком моих результатов ElasticSearch (что я и сделал с помощью операторов foreach). Если бы я использовал MySQL, я мог бы использовать ORDER BY FIELD(id, \[ids in order\])
чтобы получить результаты SQL в том же порядке, что и идентификаторы, указанные в предложении IN.