0

我正在使用 ES 版本 6.0.1,并在我的应用程序中集成了版本为 6.0.1 的 Java High level rest 客户端。

我目前正在尝试使用弹性搜索的 Java High Level Rest 客户端 API 构建这个基于脚本的排序查询:

{
  "sort": {
    "_script": {
      "type": "number",
      "script": {
        "lang": "painless",
        "params": {
          "ids": [3, 2, 1570]
        },
        "source": """
          int idsCount = params.ids.size();
          int id = (int)doc['id'].value;
          int foundIdx = params.ids.indexOf(id);
          return foundIdx > -1 ? foundIdx: idsCount + 1;
        """
      }
    }
  }
}

但是我找不到任何关于 java 客户端基于脚本的排序查询的文档。如果有人能帮助我使用 java API 实现上述查询,我​​将不胜感激。

4

1 回答 1

0

我不确定 ES 版本 6.0.1。我正在使用 ES 版本 7.9.0

这对我有用。

Map<String, List<int>> params = new HashMap<String, List<int>>();
List<int> list = Arrays.asList(3, 2, 1570);
params.put("ids", list);

SearchRequest searchRequest = new SearchRequest(index);
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder()
            .size(size)
            .from(from);

Script inlineScript = new Script(ScriptType.INLINE, "painless", "int idsCount = params.ids.size();
                                                                 int id = (int)doc['id'].value;
                                                                 int foundIdx = params.ids.indexOf(id);
                                                                 return foundIdx > -1 ? foundIdx: idsCount + 1;", params);
                
ScriptSortBuilder ssb = new ScriptSortBuilder(inlineScript, ScriptSortType.NUMBER).order(SortOrder.ASC);
searchSourceBuilder.sort(ssb);
searchRequest.source(searchSourceBuilder);
searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
SearchHits hits = searchResponse.getHits();
于 2021-08-20T05:56:03.747 回答