ElasticSearch Java API查询并返回单个列,而不是整个json文档



在elaticsearch中使用javaapi进行搜索时,我只想检索一列。目前,当我使用Java API进行查询时,它返回的整个记录如下:[{_id=123-456-7890, name=Wonder Woman, gender=FEMALE}, {_id=777-990-7890, name=Cat Woman, gender=FEMALE}]

上面的记录与th中显示的搜索条件正确匹配。如以下代码所示:

        List<Map<String, Object>> result = new ArrayList<Map<String, Object>>();

        SearchRequestBuilder srb = client.prepareSearch("heros")
                .setSearchType(SearchType.DFS_QUERY_THEN_FETCH);
        MatchQueryBuilder mqb;
        mqb = QueryBuilders.matchQuery("name", "Woman");
        srb.setQuery(mqb);
        SearchResponse response = srb.execute().actionGet();
        long totalHitCount = response.getHits().getTotalHits();
        System.out.println(response.getHits().getTotalHits());
        for (SearchHit hit : response.getHits()) {          
            result.add(hit.getSource());
        }
        System.out.println(result);

我只想返回一列。如果我搜索名称,我只希望完整的名称回到列表中:"Wonder Woman", "Cat Woman",而不是每个名称的整个json记录。如果您认为我需要在java中迭代result映射列表,请提出一个在这种情况下如何做到这一点的示例。

您可以根据文档指定要从搜索中返回的字段。这可以通过SearchRequestBuilder.addFields(String... fields)设置,即:

    SearchRequestBuilder srb = client.prepareSearch("heros")
            .setSearchType(SearchType.DFS_QUERY_THEN_FETCH)
            .addFields("name");

更好地结合两者:

  • 使用.addFields("name")告诉ES它只需要返回这个柱
  • 使用hit.field("name").getValue().toString()获得结果

当您不需要整个文档,但需要特定字段时,使用.addFields是很重要的,因为它可以降低开销和网络流量

我想明白了。

    List<String> valuesList= new ArrayList<String>();
            for (SearchHit hit : response.getHits()) {                      
    result.add(hit.getSource());
    valuesList.add(hit.getSource().get("name").toString());         
}

其他解决方案对我不起作用,hit.getSource()返回null。也许它们被弃用了?不确定。但这是我的解决方案,仅供参考,如果你只得到一个领域,并且你得到了很多结果,我可以大大加快速度。

如上所述,在SearchRequestBuilder上使用addFields(Strings),但当您获得需要使用的值时:

hit.getFields().get(fieldName).getValue()或hit.getFields().get(fieldName).getValues()

根据字段获取单个值或值列表。

最新更新