【问题标题】:ElasticSearch Java API to query and return single column instead of the whole json documentElasticSearch Java API 查询并返回单列而不是整个 json 文档
【发布时间】:2013-09-02 00:08:14
【问题描述】:

在 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 记录。如果您认为我需要遍历 java 中的 result 映射列表,请提出一个在这种情况下如何执行此操作的示例。

【问题讨论】:

    标签: java lucene elasticsearch


    【解决方案1】:

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

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

    【讨论】:

    【解决方案2】:

    最好将两者结合起来:

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

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

    【讨论】:

    • 请问Elasticsearch 5 对应的选项是什么?
    • @MarkusBarthlen 您找到问题的解决方案了吗?
    • 我相信我使用 .addStoredField 并确保在索引期间存储该字段。
    【解决方案3】:

    我想通了。

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

    【讨论】:

      【解决方案4】:

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

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

      hit.getFields().get(fieldName).getValue() 要么 hit.getFields().get(fieldName).getValues()

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-12-09
        • 1970-01-01
        • 2019-11-27
        • 2021-07-01
        相关资源
        最近更新 更多