2013-06-01 6 views
4

Я занимаюсь поиском автозаполнения с помощью elasticsearch, поэтому мне нужно запросить 3 указателя posts, comments, authors. У меня есть следующий запрос:Elasticsearch - сортировать запрос с несколькими индексами

{ 
    "query":{ 
     "query_string":{ 
     "query":"something" 
     } 
    } 
} 

вызов:

curl -X GET 'http://localhost:9200/posts,comments,authors/_search?pretty' -d '{ 
    "query": { 
    "query_string": { 
     "query": "something" 
    } 
    } 
}' 

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

сообщений индекс имеет поле под названием comments_count, комментарии votes_count и авторами posts_count. При сравнении сообщений, он должен сортироваться по comments_count, когда комментарии затем votes_count, когда авторы затем posts_count.

Можно сделать что-то подобное? Я не хотел бы объединять индексы в один, поскольку они индексируют совершенно разные документы.

ответ

2

Ну, моя проблема заключалась в том, что если я сортирую поле, которое отсутствует во всех индексах, документы не будут возвращены.

удалось решить с:

{ 
    "_script":{ 
     "script":"type=doc['_type'].value;if(type=='posts'){return doc['comments_count'].value} else {return 0};", 
     "type":"number", 
     "order":"desc" 
    } 
} 

по крайней мере, теперь документы будут показаны, даже если в нижней части.

+0

«Если я сортирую по полю, которое отсутствует во всех индексах, документы не будут возвращены». Это контролируемо. См. Http://www.elasticsearch.org/guide/reference/api/search/sort/. В вашем случае вы, вероятно, должны использовать '{" missing ":" _last "}' –

0

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

Используйте игнорировать unmapped_type игнорировать поле при запросе от нескольких индексов и поле не существует в других индексах.

+0

Вам следует добавить пример кода. –

+0

Хотя это может теоретически ответить на вопрос, [было бы предпочтительнее] (// meta.stackoverflow.com/q/8259) включить сюда основные части ответа и предоставить ссылку для справки. – OhBeWise

0

Вместо использования comments_count, votes_count и posts_count вы могли бы поставить в индекс то же имя (например items_count) и выполнять обычный вид:

{ 
    "sort": [ 
    { "items_count": "desc" } 
    ] 
} 

Если есть другие лица, которые не имеют items_count есть возможность ignore unmapped fields :

{ 
    "sort": [ 
    { "items_count": { "order": "desc", "unmapped_type": "long" } } 
    ] 
} 
Смежные вопросы