Кажется, я не могу найти ответ на мои сомнения, поэтому я решил опубликовать вопрос и посмотреть, может ли кто-нибудь помочь мне.
В моем приложении у меня есть массив идентификаторов, который поступает из бэкэнд и который упорядочен уже, как я хочу, например: [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