0%

基础概念

  • 节点 node:提供存储、索引和搜索功能的服务器。
  • 集群 cluster:多个节点的集合,共同持有全部数据。
  • 索引 index:拥有相似特征的文档的集合。
  • 类型 type:同一个索引中用于分类数据的一种方式,7.x之后的版本默认为单类型索引,类型固定为_doc
  • 文档 document: 可被索引的基础信息单元。
  • 分片和复制shards and replicas:将索引划分成多片存储在多个节点,解决单节点硬件限制的问题;而且可以为分片创建一份或多份拷贝,提高了部分节点失败情况下的高可用性。
  • 映射 mapping:定义了文档以及其字段如何被存储和索引。
  • 路由 routing:可选机制,用于分片之间分配文档。路由允许你控制文档应该被索引到哪个分片上,这可以用于优化查询性能、负载均衡和数据定位。默认情况下基础路由会通过哈希算法实现,以确保文档被均匀的分布在所有可用的分片上。
阅读全文 »

整理一下Laravel Scout的使用细节,包含基础搜索使用、搜索后数据整理及模型配置

搜索使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 直接全文索引
$posts = Post::search("张三")->get();

# 获取原始结果
Post::search("张三")->raw();

# 指定查询时自定义的索引
->within("test_posts_index")

# 简单的where及whereIn子句
->where('user_id', 1)
->whereIn('user_id', [1, 2])

# 分页
->paginate(15)

搜索后数据整理

1
2
3
4
# 自定义结果的其他查询
->query(fn (Builder $query) => $query->with('author'))

# 分页后修整数据,必须单独再次foreach,否则分页数据会丢失,且修改无效
阅读全文 »

Laravel Scout 是一个基于驱动程序的简单全文搜索解决方案,通过使用模型观察者,Scout 将自动同步 Eloquent 记录的搜索索引。而 Elasticsearch是一个分布式、RESTful 风格的搜索和数据分析引擎,通过 elastic-scout-driver 来实现Scout的搜索扩展。

阅读全文 »

前后端分离项目天生对SEO不友好,目前的方案主要有以下几种:

  • 服务端渲染:需要选定支持SSR的前端框架 Next.jsNuxt.js
  • 预渲染:针对搜索引擎的爬取做服务端的模拟渲染
  • 静态站点生成
  • 提供多版本

针对已有的前后端分离,使用服务端渲染方案改造工程较大,主要使用的是预渲染的模式。
下面针对遇到的实际Vue项目做一下预渲染方案

阅读全文 »

查看可用版本

1
$ gnvm ls

搜索可用版本

1
$ gnvm search 16.*.*

安装多版本

1
2
3
$ gnvm install latest
$ gnvm install 16.5.0
$ gnvm update latest

切换版本

1
2
$ gnvm use latest
$ gnvm use 16.5.0
阅读全文 »

文档地址

数组函数data_*系列

data_fill 填充

用于多维数组或对象设置缺省值;
多级键名可以用.连接;
可以使用*作为通配符;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$data = [
'products' => [
['name' => 'Desk 1', 'price' => 100],
['name' => 'Desk 2'],
],
];

data_fill($data, 'products.*.price', 200);

/*
[
'products' => [
['name' => 'Desk 1', 'price' => 100],
['name' => 'Desk 2', 'price' => 200],
],
]
*/

data_get 检索

data_fill相反,用于从多维数组或对象中检索值;
多级键名可以用.连接;
可以使用*作为通配符;
如果找不到指定的键,可设置默认返回值;

1
$discount = data_get($data, 'products.desk.discount', 0);

data_set 设置

data_fill不同在于,data_set默认会覆盖原有值;
可以设置第四个参数为false,用于取消覆盖;

1
2
3
4
5
$data = ['products' => ['desk' => ['price' => 100]]];

data_set($data, 'products.desk.price', 200, false);

// ['products' => ['desk' => ['price' => 100]]]

参考来源

自然排名

实现结果:1,2,3,4,5;
思路实现:
设置名次自增变量,每次加1;

1
2
3
4
5
6
7
SELECT
obj.user_id,
obj.score,
@rownum := @rownum + 1 AS rownum
FROM
( SELECT user_id, score FROM `sql_rank` ORDER BY score DESC ) AS obj,
( SELECT @rownum := 0 ) r
阅读全文 »

label 标签

定位符,用于跳转到程序的任意位置;
标签可以是任意的标识符,但不能是保留字;
标签可以跟 breakcontinue 配合,用于多层循环的跳出;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
top:
for (var i = 0; i < 3; i++){
for (var j = 0; j < 3; j++){
if (i === 1 && j === 1) break top;
console.log('i=' + i + ', j=' + j);
}
}
// i=0, j=0
// i=0, j=1
// i=0, j=2
// i=1, j=0

foo: {
console.log(1);
break foo;
console.log('本行不会输出');
}
console.log(2);
// 1
// 2
阅读全文 »

path.normalize()

规范化路径

path.join()

多参数路径连接;
不同系统下会使用不同的路径分隔符;

1
2
path.join('home', "git");
// Linux 下 'home/git'

path.isAbsolute()

判断是否是绝对路径;

path.resolve()

将相对路径转为绝对路径;
可以接受多个参数,依次表示所要进入的路径,直到将最后一个参数转为绝对路径;
如果根据参数无法得到绝对路径,就以当前所在路径作为基准;
除了根目录,该方法的返回值都不带尾部的斜杠;

1
2
path.resolve('/home/git', './data')
// '/home/git/data'
阅读全文 »

字符集与字符序

字符集

定义了字符以及字符的编码;
utf8mb4utf8 的超集,用来兼容四字节的unicode

字符序

定义了字符的比较规则;
utf8mb4_general_ci 不区分大小写,_cicase insensitive
utf8mb4_general_cs 区分大小写;
utf8mb4_bin 字符串每个字符都用二进制数据编译存储,区分大小写;

varchar

一般用一个字符来存储字符的长度;
当字符长度超过一个字符存储长度的上限255(2^8-1)时,将会用两个字符来存储;
最多能存储 65535 个字节的数据;

变量及赋值

变量使用 @符号定义与赋值;
非独立语句中,变量赋值需要添加:

1
(SELECT @rownum := 0, @rowtotal := NULL, @incrnum := 0) b