【问题标题】:Elastic Search: sort by a numberic fieldElasticsearch:按数字字段排序
【发布时间】:2020-01-14 03:42:40
【问题描述】:

我正在编写一个控制台应用程序,以将 json 文件中的数据插入 Elastic search 7.5.1。 _id 字段应该是一个 int 并且表现得像自动增量。为了做到这一点,在插入之前,我会插入最后一个 ID 并增加 1。

我的问题是我无法获取最后一个 ID,因为排序是在字符串上进行的。这就是我的意思:如果你有10 items并且最后一个ID是10,那么在查询和排序时它将返回9

这是我在使用 PostMan 时的查询:

GET my_index/_search
{
  "size": 1, 
  "query": {
    "match_all": {}
  },
 "sort": [{
      "_id": {
        "order": "desc"
      }
    }
  ]
}

我的 Java 函数使用 their client:

private static String getLastElasticSearchId(String index)
{
    RestHighLevelClient client = getElasticSearchClient();

    SearchRequest searchRequest = new SearchRequest(index);
    SearchSourceBuilder b = new SearchSourceBuilder();
    b.query(QueryBuilders.matchAllQuery());
    b.sort(new FieldSortBuilder("_id").order(SortOrder.DESC));
    b.from(0);
    b.size(1);
    searchRequest.source(b);

    try {

        SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
        SearchHits hits = searchResponse.getHits();

        if(hits.getTotalHits().value > 0){
            SearchHit[] searchHits = hits.getHits();
            for (SearchHit hit : searchHits) {
                return hit.getId();
            }
        }
        else {
            return "0";
        }

    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        try {
            client.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    return null;
}

两者都返回 9 作为最后一个 ID,即使索引中有另一个项目的 ID 为 10。

我无法在回答 here 的 ID 中应用字符串填充。

关于如何实现我需要的任何帮助?

感谢您的帮助。

【问题讨论】:

  • 如果所有事情都发生在同一个进程中,我会使用 AtomicInteger 来跟上分配的最后一个 ID。如果您尝试从已创建的记录中获取最后一个 ID,这也将解决可能出现的竞争条件。

标签: java elasticsearch


【解决方案1】:

试试这个:

GET my_index/_search
{
  "size": 1, 
  "query": {
    "match_all": {}
  },
  "sort" : {
        "_script" : {
            "type" : "number",
            "script" : {
                "lang": "painless",
                "source": "Integer.parseInt(doc['_id'].value)"

            },
            "order" : "desc"
        }
    }
}

希望对你有帮助

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-08-01
    • 1970-01-01
    • 2021-01-30
    • 2017-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多