Mysql 如何将SQL查询转换为ElasticSearch样式?
我有一个复杂的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版本: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
{
"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作为缓存,这还不够。