【问题标题】:How do I group documents in elasticsearch by a single field?如何按单个字段对弹性搜索中的文档进行分组?
【发布时间】:2015-03-21 12:37:09
【问题描述】:

如果我在 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 的可能性。想法?

【问题讨论】:

标签: elasticsearch elasticsearch-plugin elastica


【解决方案1】:

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

您要查找的查询如下所示:

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
                    }
                }
            }
        }
    }
}'

在 Elastica 中,可以这样创建等效查询:

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

如果要对结果进行分页,只需更改传递给 setFromsetSize 的参数即可。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-15
    相关资源
    最近更新 更多