Сортировка по имени elasticsearch

#php #elasticsearch

#php #elasticsearch

Вопрос:

Я пытаюсь отсортировать свои документы по имени, используя эластичный поиск и официальный php-клиент, как я могу продолжить?

     $params = [
        'index' => $this->index ,
        'type' => 'videos',
        'from' => $this->uri->segment(2),
        'size' => 12,
        'body' => [
        'query' => [
        'filtered' => [
            'filter' => [
                'term' => [ 'name' => $query ] ,
                'term' => [ 'tags' => $query ]
              ]
           ]
        ]
      ]
    ];




    $data['results'] = $this->client->search($params);
  

Ответ №1:

Я знаю, что этому вопросу больше года, но ответ нелегко найти в Интернете, поэтому я все равно отвечу на него.
Чтобы указать поле для сортировки и порядок сортировки, используйте следующий синтаксис:

 $params['sort'] = array('updated_at:desc');
  

Для сортировки по нескольким полям:

 $params['sort'] = array('updated_at:desc', 'user_id:asc', ...);
  

Ответ №2:

Я только что увидел этот пост, когда искал ответ на тот же вопрос, в моем случае решение было намного проще и отличалось от тех, которые я видел здесь.

 $params['body']['sort'] = [ 'id' => 'desc']
  

это отлично сработало для меня, используя "elasticsearch/elasticsearch": "^6.1"

Ответ №3:

Попробуйте это

 $params = [
        'index' => $this->index ,
        'type' => 'videos',
        'from' => $this->uri->segment(2),
        'size' => 12,
        'body' => [
        'query' => [
        'filtered' => [
            'filter' => [
                'term' => [ 'name' => $query ] ,
                'term' => [ 'tags' => $query ]
              ]
           ]
        ],
        'sort' => [
            'name' => [
                'order' => 'asc'
            ]
        ]
      ]
    ];
  

https://www.elastic.co/guide/en/elasticsearch/reference/current/search-request-sort.html

Комментарии:

1. Нет, сортировка должна быть подэлементом запроса. Кстати, нет необходимости в order => array(…). Просто напишите напрямую field_name => asc

Ответ №4:

Если у вас есть неанализируемое ключевое слово, вы должны использовать его, не включая fielddata:

 $params = [
        'index' => $this->index ,
        'type' => 'videos',
        'from' => $this->uri->segment(2),
        'size' => 12,
        'body' => [
        'query' => [
        'filtered' => [
            'filter' => [
                'term' => [ 'name' => $query ] ,
                'term' => [ 'tags' => $query ]
              ]
           ]
        ],
        'sort' => [
            'name' => [
                'order.keyword' => 'asc'
            ]
        ]
      ]
    ];
  

Но если у вас нет ключевого слова unanalyzed, вам следует сбросить сопоставление индексов, чтобы включить fielddata в поле name:

     curl -X PUT "localhost:9200/my_index/_mapping" -H 'Content-Type: application/json' -d'
    {
      "properties": {
        "name": { 
          "type":     "text",
          "fielddata": true
        }
      }
    }

'
  

смотрите : https://www.elastic.co/guide/en/elasticsearch/reference/current/fielddata.html