2016-08-18 42 views
0

我希望结果与查询的顺序相同。要详细说明这一点,请考虑以下示例。 :根据查询中的标准顺序返回结果Elasticsearch

我有一个ID字段的文件,这看起来有点像这样:

{ 
    { 
    "ID": 102, 
    "Name": "Mark" 
    }, 
    { 
    "ID": 104, 
    "Name": "Pete" 
    }, 
    { 
    "ID": 101, 
    "Name": "Su" 
    }, 
    { 
    "ID": 107, 
    "Name": "Kate" 
    }, 
    { 
    "ID": 106, 
    "Name": "Roger" 
    } 
} 

我的查询是:

{ 
    "query": { 
    "bool": { 
     "should": [ 
     { 
      "match": 
      { 
      "ID": "101" 
      } 
     }, 
     { 
      "match": 
      { 
      "ID": "104" 
      } 
     }, 
     { 
      "match": 
      { 
      "ID": "107" 
      } 
     }, 
     { 
      "match": 
      { 
      "ID": "102" 
      } 
     }, 
     { 
      "match": 
      { 
      "ID": "106" 
      } 
     } 
     ] 
    } 
    } 
} 

现在我期待的结果是在相同的顺序作为搜索条件。即:

{ 
    "ID": 101, 
    "Name": "Su" 
}, 
{ 
    "ID": 104, 
    "Name": "Pete" 
}, 
{ 
    "ID": 107, 
    "Name": "Kate" 
}, 
{ 
    "ID": 102, 
    "Name": "Mark" 
}, 
{ 
    "ID": 106, 
    "Name": "Roger" 
} 

一直在想办法做到这一点。它甚至有可能吗? 任何帮助表示赞赏。

回答

0

我不认为你可以通过使用查询或过滤器来实现这种评分机制。

当查询构建器构建查询时,这些id的源代码如何进入代码。它们的顺序与您要对文档进行排序的顺序相同。

如果是,那么我会建议滋养您的查询功能分数或基于脚本的评分逻辑。你可以使用groovy沙箱或mvel。

{ 
    "query": {"filtered": { 
    "query": {"function_score": { 
     "query": {"match_all": {}}, 
     "functions": [ 
     {"script_score": { 
      "params": { 
      "id_list":[103,105,109,101] 
      }, 
      "script": " id_list.length -id_list.indexOf(doc['id'].value)" 
     }} 
     ] 
    }} 
    }} 
} 

Scripting in elasticsearch.

Function score in elastic

想想它像喂包含在要返回的结果为PARAMS的功能评分中得分脚本的顺序相同ID的阵列结构。 比较doc域中文档的id后,为每个文档分配一个Array.size - index分数。 我认为这几乎可以解决您的问题。它不是一个具体的解决方案,而是一个解决方案

注意 - 我的群集小心配置为允许内联脚本执行,并且默认脚本语言配置为javascript。如果你遵循这种方法,你可能不得不看看你的集群配置

+0

嘿,感谢您的帮助! 虽然我现在不能尝试这个,因为我们决定避免脚本... 但是,有人建议使用multisearch来完成它......如果multisearch不起作用,我一定会试试这个.. 。 再次感谢! –

+0

当然,如果multisearch为少数人工作,请更新与我和其他人一起工作的答案。谢谢 – user3775217

相关问题