ElasticSearch脚本将文本排序为数字

41ik7eoe  于 2022-11-02  发布在  ElasticSearch
关注(0)|答案(1)|浏览(302)

我有一个ElasticSearch字段ID,它是一个数字,但在索引中设置为“文本”。我无法更改索引,因为要重新加载的数据量很大。我正在编写一个脚本来执行此排序,但得到一个“Bad_request”错误。

Script script = new Script(ScriptType.INLINE, "painless", "ctx._source.ID.keyword", Collections.emptyMap());
ScriptSortBuilder.ScriptSortType sortType = ScriptSortBuilder.ScriptSortType.NUMBER;
builder.sort(SortBuilders.scriptSort(script, sortType).order(SortOrder.DESC));

searchRequest.source(builder);
response = restsearchClient.search(searchRequest, RequestOptions.DEFAULT);

我已经尝试了以下idorcode值:一个月一个月一个月一个月,一个月二个月一个月,一个月三个月,一个月四个月。
请指教!

rqmkfv5c

rqmkfv5c1#

如果我的理解是正确的,那么你想排序的数字是作为字符串存储,而不是作为整数在ElasticSearch。
下面是示例Elasticsearch查询:

{
  "query": {
    "match_all": {}
  },
  "sort": {
    "_script": {
      "type": "Number",
      "order": "desc",
      "script": {
        "lang": "painless",
        "source": """
        String s = doc['ID.keyword'].value;
          int idvalue = Integer.parseInt(s);
          return idvalue;
        """
      }
    }
  }
}

下面是Java代码:

Script script = new Script(ScriptType.INLINE, "painless", "String s = doc['ID.keyword'].value;int idvalue = Integer.parseInt(s);return idvalue;", Collections.emptyMap());
ScriptSortBuilder.ScriptSortType sortType = ScriptSortBuilder.ScriptSortType.NUMBER;
builder.sort(SortBuilders.scriptSort(script, sortType).order(SortOrder.DESC));

相关问题