#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