Получение информации из поиска elastics по порядку входного массива

Кажется, я не могу найти ответ на мои сомнения, поэтому я решил опубликовать вопрос и посмотреть, может ли кто-нибудь помочь мне.

В моем приложении у меня есть массив идентификаторов, который поступает из бэкэнд и который упорядочен уже, как я хочу, например: [0] => 23, [1] => 12, [2] => 45, [3 ] => 21

Затем я «спрашиваю» elasticsearch информацию, соответствующую каждому идентификатору, присутствующему в этом массиве, используя фильтр терминов. Проблема заключается в том, что результаты не входят в порядок идентификаторов, которые я отправил, поэтому результаты смешиваются, например: [0] => 21, [1] => 45, [2] => 23, [3 ] => 12

Обратите внимание, что я не могу сортировать в elasticsearch путем сортировки, которая упорядочивает массив в бэкэнд.

Я также не могу упорядочить их в php, так как я извлекаю разбитые на страницы результаты из elasticsearch, поэтому, если у каждого oage есть 2 результата, elasticsearch может дать мне информацию только для [0] => 21, [1] => 45, поэтому Я даже не могу заказать их с php.

Как я могу получить результаты, упорядоченные по входному массиву? Есть идеи?

заранее спасибо

Вот один из способов, которым вы можете это сделать, с пользовательским сценарием.

Сначала я создал некоторые фиктивные данные:

curl -XPUT "http://localhost:9200/test_index" curl -XPOST "http://localhost:9200/test_index/_bulk " -d' { "index" : { "_index" : "test_index", "_type" : "docs", "_id" : 1 } } { "name" : "Document 1", "id" : 1 } { "index" : { "_index" : "test_index", "_type" : "docs", "_id" : 2 } } { "name" : "Document 2", "id" : 2 } { "index" : { "_index" : "test_index", "_type" : "docs", "_id" : 3 } } { "name" : "Document 3", "id" : 3 } { "index" : { "_index" : "test_index", "_type" : "docs", "_id" : 4 } } { "name" : "Document 4", "id" : 4 } { "index" : { "_index" : "test_index", "_type" : "docs", "_id" : 5 } } { "name" : "Document 5", "id" : 5 } { "index" : { "_index" : "test_index", "_type" : "docs", "_id" : 6 } } { "name" : "Document 6", "id" : 6 } { "index" : { "_index" : "test_index", "_type" : "docs", "_id" : 7 } } { "name" : "Document 7", "id" : 7 } { "index" : { "_index" : "test_index", "_type" : "docs", "_id" : 8 } } { "name" : "Document 8", "id" : 8 } { "index" : { "_index" : "test_index", "_type" : "docs", "_id" : 9 } } { "name" : "Document 9", "id" : 9 } { "index" : { "_index" : "test_index", "_type" : "docs", "_id" : 10 } } { "name" : "Document 10", "id" : 10 } ' 

Я использовал поле "id" даже если оно избыточно, поскольку поле "_id" преобразуется в строку, а скрипты проще с целыми числами.

Вы можете вернуть определенный набор документов по id с помощью фильтра ids :

 curl -XPOST "http://localhost:9200/test_index/_search" -d' { "filter": { "ids": { "type": "docs", "values": [ 1, 8, 2, 5 ] } } }' 

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

Здесь я передаю параметр, который представляет собой список объектов, которые связывают идентификаторы для оценки. Сценарий подсчета очков просто прокручивает их до тех пор, пока не найдет текущий идентификатор документа и не вернет заданный балл для этого документа (или 0, если он не указан).

 curl -XPOST "http://localhost:9200/test_index/_search" -d' { "filter": { "ids": { "type": "docs", "values": [ 1, 8, 2, 5 ] } }, "sort" : { "_script" : { "script" : "for(i:scoring) { if(doc[\"id\"].value == i.id) return i.score; } return 0;", "type" : "number", "params" : { "scoring" : [ { "id": 1, "score": 1 }, { "id": 8, "score": 2 }, { "id": 2, "score": 3 }, { "id": 5, "score": 4 } ] }, "order" : "asc" } } }' 

и документы возвращаются в правильном порядке:

 { "took": 11, "timed_out": false, "_shards": { "total": 2, "successful": 2, "failed": 0 }, "hits": { "total": 4, "max_score": null, "hits": [ { "_index": "test_index", "_type": "docs", "_id": "1", "_score": null, "_source": { "name": "Document 1", "id": 1 }, "sort": [ 1 ] }, { "_index": "test_index", "_type": "docs", "_id": "8", "_score": null, "_source": { "name": "Document 8", "id": 8 }, "sort": [ 2 ] }, { "_index": "test_index", "_type": "docs", "_id": "2", "_score": null, "_source": { "name": "Document 2", "id": 2 }, "sort": [ 3 ] }, { "_index": "test_index", "_type": "docs", "_id": "5", "_score": null, "_source": { "name": "Document 5", "id": 5 }, "sort": [ 4 ] } ] } } 

Ниже приведен пример запуска: http://sense.qbox.io/gist/01b28e5c038c785f0844abb7c01a71d69a32a2f4