所有由zhufenghua发布的文章

elasticSearch自动生成数组

存储多个数据时,会自动生成数组。

如果数据为空,则为null。

此时返回的数据格式不统一。

则在存储时做转换:

$tag = array("标签1","标签2");  // 假设数据

if($tag){
    $v['tag'] = $tag;
}
else{
    $v['tag'] = array();  // 没有数据时,存储空数组
}

sql同步到es之logstash

此工具是定时同步,sql查询同步。

每次同步后,记录lastModefineTime,也就是最后一次修改时间,下次同步时从该段时间开始更新。

logstash的原理是查询sql,并把数据送到es中,如果sql中的数据被删除,则不能把es中对应的数据进行删除。解决办法是,增加一个字段,比如 del =1 ? 表示删除,也就是软删除。在使用时把该字段作为查询条件即可筛选该数据。

很明显,会导致无用数据越积越多。

当然也不是没有办法,那就是定时清除 es 中 del = 1的数据,从而真正把它从es中删除掉。

logstash用作数据同步,理论上是完全可行的。

优点:简单灵活。

缺点:Logstash耗资源较大,它是定时运行,也就是每隔一段时间就执行一次同步(定时频率可以自己设定),运行占用CPU和内存高。另外没有消息队列缓存,存在数据丢失隐患

elasticsearch多次查询时间

es的多次查询和一次查询相差不大,是因为第一次查询后数据被缓存了。所以一次进行十几次es查询,比一次查询慢不了多少。

es耗时主要是建立连接对象,以及第一次查询。

(第一次查询时要建立连接,和创建连接对象耗时相当,而多次查询会复用连接)(和sql连接同理)

总的来说,多次查询时连接被复用,数据被缓存,所以多次查询和一次查询相差不大,对于复杂的查询完全可以多次请求而不用担心时间会增加很多。

php array_chunk的用途

用于切分数组为多个小数组

array_chunk(array,size,preserve_key);

array表示原数组,size表示分割大小,如果preserver_key为true则保留原键名,默认为false重新生成数字键名。

比如像数据库中插入很大数据时,可以分成多个小部分后再插入:

  if ($data) {
            $arr = array_chunk($data, 2000);
            foreach ($arr as $info) {
                db('cust_account_settlement')->insertAll($info);
            }
        }

php array_merge的使用场景

两种用法。

对于键名数组,可用于一次性更新键值。(覆盖)

对于数字数组,可用于合并数组。(追加)

array_merge(array1,array2,array3...)

可以一次合并多个数组。

如果希望多个数组中相同键名元素不被覆盖且被合并为一个数组元素(保留所有的元素),可使用 array_merge_recursive

array_merge_recursive(array1,array2,array3...)

其他键名数组和数字数组的相关函数:

array_keys 取得数组的键名(并返回一个只包含键名的数组)

array_keys(array,value,strict)

array为原数组,value可以指定键值筛选,strict和value连用,默认为false,如果为true则 5 和 “5” 是不同的。

array_values返回去掉键名的数组(也就是值不变,键名变为默认值)

array_values(array)