我正在使用elasticsearch构建自动完成搜索,因此我需要查询3个索引posts
,comments
,authors
。我有以下查询:
{
"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
。
可以做那样的事吗?我不想将索引合并为一个,因为它们索引完全不同的文档。
答案 0 :(得分:2)
好吧,我的问题是,如果我按照所有索引中不存在的字段排序,则不会返回文档。
管理解决:
{
"_script":{
"script":"type=doc['_type'].value;if(type=='posts'){return doc['comments_count'].value} else {return 0};",
"type":"number",
"order":"desc"
}
}
至少现在显示文件,即使在底部。
答案 1 :(得分:1)
https://www.elastic.co/guide/en/elasticsearch/reference/current/search-request-sort.html
使用ignore unmapped_type在查询多个索引时忽略该字段,并且该字段在其他索引中不存在。
答案 2 :(得分:1)
您可以使用相同的名称(例如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" } }
]
}