ElasticSearch Java API用于查询和返回单列而不是整个json文档

Hor*_*ice 3 java lucene elasticsearch

在elaticsearch中使用java api进行搜索时,我只想检索一列.目前,当我使用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);
Run Code Online (Sandbox Code Playgroud)

我只想要返回一列.如果我搜索名称,我只需要在列表中返回全名:"Wonder Woman", "Cat Woman"只有每个名称都不是整个json记录.如果您认为我需要迭代resultjava中的地图列表,请提供一个在这种情况下如何执行此操作的示例.

fem*_*gon 5

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

    SearchRequestBuilder srb = client.prepareSearch("heros")
            .setSearchType(SearchType.DFS_QUERY_THEN_FETCH)
            .addFields("name");
Run Code Online (Sandbox Code Playgroud)


Sho*_*ote 5

更好地结合两者:

  • 用于.addFields("name")告诉ES它只需要返回此列
  • hit.field("name").getValue().toString()得到的结果

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