elasticsearch,yii2,Mysql,elasticsearch,Yii2" /> elasticsearch,yii2,Mysql,elasticsearch,Yii2" />

Mysql 如何将SQL查询转换为ElasticSearch样式?

Mysql 如何将SQL查询转换为ElasticSearch样式?,mysql,elasticsearch,yii2,Mysql,elasticsearch,Yii2,我有一个复杂的MySQL查询,它统计每天的独特访问量。我想使用ElasticSearch加快搜索速度 想象一张这样的桌子: id |站点| id |创建|在|统计| cookie |哈希 10 | 12346 | 2019-11-11 15:42:24 | sf2f2eghasdh2nvr 11 | 12346 | 2019-10-2609:41:09 | jk67j97jkhjghklj 12 | 12346 | 2019-10-26 14:25:01 | vnuoi96iyoui60yu 1

我有一个复杂的MySQL查询,它统计每天的独特访问量。我想使用ElasticSearch加快搜索速度

想象一张这样的桌子:

id |站点| id |创建|在|统计| cookie |哈希 10 | 12346 | 2019-11-11 15:42:24 | sf2f2eghasdh2nvr 11 | 12346 | 2019-10-2609:41:09 | jk67j97jkhjghklj 12 | 12346 | 2019-10-26 14:25:01 | vnuoi96iyoui60yu 13 | 12346 | 2019-09-01 18:12:54 | zxcqscv1vcdcv 查询结果如下所示:

2019-11-11 | 1 2019-10-26 | 2 2019-09-01 | 1 SQL查询本身:

选择日期,将*计为cnt 从SELECT DISTINCT stat\u cookie\u hash、DATEDATE\u ADDcreated\u at、INTERVAL:timezone Minutes as day中选择 来自stat_访客 其中site\u id=:site\u id为T 按天分组 按日订购 :时区是一个类似180的整数

:site_id是一个类似于40的整数

相同的,但有替换:

选择日期,将*计为cnt 从SELECT DISTINCT stat\u cookie\u hash,DATEDATE\u ADDcreated\u at,间隔180分钟为一天 来自stat_访客 其中,站点id=40,作为T 按天分组 按日订购 ElasticSearch版本:

{
    "version" : {
        "number" : "7.4.1",
        "build_flavor" : "default",
        "build_type" : "rpm",
        "build_hash" : "fc0eeb6e2c25915d63d871d344e3d0b45ea0ea1e",
        "build_date" : "2019-10-22T17:16:35.176724Z",
        "build_snapshot" : false,
        "lucene_version" : "8.2.0",
        "minimum_wire_compatibility_version" : "6.8.0",
        "minimum_index_compatibility_version" : "6.0.0-beta1"
      }
}
我对ElasticSearch完全陌生,所以我不知道如何管理它。请帮帮我

如果您了解Yii2框架,并能告诉我如何使用Yii2 elasticsearch扩展重写SQL查询,那就太好了

会帮助你的

但在我看来,这无助于你加快速度。您可以使用memcache和cache sql result

我建议您将访问计数存储在缓存中,并定期更新sql

考虑到elasticsearch没有“分组依据”

我找到了一个解决方案

首先,我从查询中删除了时区和日期、日期和添加函数

然后我将其转换为ElasticSearch格式。它是集成的PHP版本:

    public static function elasticSearch($site_id, $page_id=null, $markup_id=null, $started_at=null, $group_by='created_day')
    {
        $index = 'stat_visitor';

        $client = ClientBuilder::create()
            ->setSelector('\Elasticsearch\ConnectionPool\Selectors\RoundRobinSelector')
            ->build();

        $params = [
            'index' => $index,
            'size' => 0,
            'body' => [
                'aggs' => [
                    'cnt' => [
                        'terms' => [
                            'field' => $group_by,
                            'size' => 9999,
                            'order' => ['_term' => 'desc'],
                        ],
                        'aggs' => [
                            'unique_hashes' => [
                                'cardinality' => [
                                    'field' => 'stat_cookie_hash'
                                ]
                            ]
                        ]
                    ]
                ],
                'query' => [
                    'bool' => [
                        'must' => [
                            ['term' => ['site_id' => $site_id]],
                        ],
                    ],
                ],
                'sort' => ['created_day' => 'desc'],
            ]
        ];

        if ($page_id) {
            $params['body']['query']['bool']['must'][] = ['term' => ['page_id' => $page_id]];
        }

        if ($markup_id) {
            $params['body']['query']['bool']['must'][] = ['term' => ['markup_id' => $markup_id]];
        }

        if ($started_at) {
            $params['body']['query']['bool']['filter'][] = ['range' => ['created_at' => [ 'gte' => $started_at]]];
        }

        $response = $client->search($params);

        $result = [];
        foreach ($response['aggregations']['cnt']['buckets'] as $bucket) {
            $result[$bucket['key_as_string']] = $bucket['unique_hashes']['value'];
        }

        return $result;
    }

是的,我读过这个指南,但我仍然不知道如何编写这个查询。是的,我现在使用Redis作为缓存,这还不够。