3

在 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);

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

4

4 回答 4

5

更好地将两者结合起来:

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

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

于 2014-01-24T10:14:46.867 回答
5

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

    SearchRequestBuilder srb = client.prepareSearch("heros")
            .setSearchType(SearchType.DFS_QUERY_THEN_FETCH)
            .addFields("name");
于 2013-08-29T16:10:39.597 回答
3

我想到了。

    List<String> valuesList= new ArrayList<String>();
            for (SearchHit hit : response.getHits()) {                      
    result.add(hit.getSource());
    valuesList.add(hit.getSource().get("name").toString());         
}
于 2013-08-29T17:33:30.687 回答
0

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

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

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

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

于 2015-03-02T20:29:32.137 回答