Как заставить работать сортировку 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.

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