如何通过单个字段将弹性搜索中的文档分组?

时间:2015-03-21 12:37:10

标签: elasticsearch elasticsearch-plugin elastica

如果我在elaticsearch中有一堆文件,我希望按照文档的一个字段返回,我该怎么做?此外,我需要它始终返回固定数量的结果(使用set maxresults)

例如,如果我有一堆文档,每个文档代表一个人和包含该人的属性的文档的字段。 让我们说每个人在文档中都有一个城市字段。 我想以一种返回50个按城市分组的结果的方式查询Elasticsearch。通过50个结果,我想知道如何将50个映射到这些城市中所有人的城市归还。

我在:

中找到了一个实现

http://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-metrics-top-hits-aggregation.html

但我也想对这些结果应用分页。我在ES中看不到setOffset和setLimit的可能性。想法?

1 个答案:

答案 0 :(得分:1)

  

如何返回映射到这些城市中所有人的50个城市。

查询您正在寻找这样的内容:

String line = "foo,12-12-12,11111,2222,bar,3333,baz";
List<String> ports = Arrays.stream(line.split(",")).filter(s -> s.matches("\\d+")).collect(Collectors.toList());

在Elastica中,可以通过以下方式创建等效查询:

curl -XGET 'http://localhost:9200/users/user/_search?pretty' -d '{
    "aggs": {
        "users-by-city": {
            "terms": {
                "field": "city",
                "size": 50
            },
            "aggs": {
                "top_tag_hits": {
                    "top_hits": {
                        "from": 0,
                        "size": 9000
                    }
                }
            }
        }
    }
}'

如果您想对结果进行分页,只需更改传递到$query = new Elastica\Query(); $qb = new Elastica\QueryBuilder(); $query->addAggregation( $qb->aggregation()->terms('users-by-city') ->setField('city') ->setSize(50) ->addAggregation( $qb->aggregation()->top_hits('top-hits-in-city') ->setFrom(0) ->setSize(9000) ) ); setFrom的参数。