Запрос упругого поиска по массиву возвращаемого результата не сортируется по массиву прохода в

Я использую эластик и ниже мой запрос:

    $query = new Query();

    $query->setSize(5);

    $qb = new \Elastica\Query\Ids();

    $qb->addId("id_5");
    $qb->addId("id_3");
    $qb->addId("id_4");
    $qb->addId("id_1");
    $qb->addId("id_2");

    return $query->setQuery($qb)

Я хочу, чтобы результат возвращался в том же порядке, что и я, например, в этом случае это будет "id_5, id_3, id_4, id_1, id_2"

Однако то, что я получаю, это сортировка не то, что я хотел

1 ответ

Решение

Я вижу это как два решения 1. Если у вас есть идентификатор как часть документа, то вы можете сделать

POST indexName/_search
{
  "sort": [
    {
      "_script": {
        "type": "number",
        "script": "sortOrder.indexOf(doc['Id'].value)",
        "params": {
          "sortOrder": [
            "AVMX9sHTyNVr4SjF3oRt",
            "AVMTc1fSyNVr4SjF3WpF",
            "AVMYuGLOyNVr4SjF3rKm"
          ]
        },
        "order": "asc"
      }
    }
  ],
  "query": {
    "ids": {
      "values": [
        "AVMX9sHTyNVr4SjF3oRt",
            "AVMTc1fSyNVr4SjF3WpF",
            "AVMYuGLOyNVr4SjF3rKm"
      ]
    }
  }
}

Если нет, то вам нужно обновить отображение для вашего типа, чтобы

{
  "mappings": {
    "YOUR_TYPE": {
      "_id": {
        "index": "not_analyzed"
      }
    }
  }
}

Затем вы можете использовать "script": "sortOrder.indexOf(doc['_id']. Value)"

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