@gordon.gan/specflow 1.4.0-beta → 1.4.2-beta
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/package.json +1 -1
- package/prompts/approval/database-guidance.md +79 -0
- package/prompts/approval/generate.md +600 -290
- package/skills/database/LICENSE +405 -0
- package/skills/database/ORIGIN.md +6 -0
- package/skills/database/README.md +30 -0
- package/skills/database/elasticsearch/LICENSE.txt +202 -0
- package/skills/database/elasticsearch/SKILL.md +199 -0
- package/skills/database/elasticsearch/examples/01-fulltext-search.md +215 -0
- package/skills/database/elasticsearch/examples/02-aggregation-report.md +206 -0
- package/skills/database/elasticsearch/examples/03-reindex-zero-downtime.md +200 -0
- package/skills/database/elasticsearch/examples/04-cluster-monitoring.md +204 -0
- package/skills/database/elasticsearch/references/01-query-dsl-fulltext.md +162 -0
- package/skills/database/elasticsearch/references/02-query-dsl-term.md +210 -0
- package/skills/database/elasticsearch/references/03-aggregations-metric.md +161 -0
- package/skills/database/elasticsearch/references/04-aggregations-bucket.md +236 -0
- package/skills/database/elasticsearch/references/05-mapping-types.md +134 -0
- package/skills/database/elasticsearch/references/06-analyzers.md +187 -0
- package/skills/database/elasticsearch/references/07-cluster-ops.md +225 -0
- package/skills/database/elasticsearch/references/08-elk-integration.md +170 -0
- package/skills/database/mysql/SKILL.md +195 -0
- package/skills/database/mysql/examples/01-connection-pool.md +75 -0
- package/skills/database/mysql/examples/02-slow-query-optimization.md +98 -0
- package/skills/database/mysql/examples/03-master-slave-setup.md +144 -0
- package/skills/database/mysql/examples/04-backup-strategy.md +212 -0
- package/skills/database/mysql/references/01-functions-string.md +103 -0
- package/skills/database/mysql/references/02-functions-date.md +152 -0
- package/skills/database/mysql/references/03-functions-aggregate-window.md +167 -0
- package/skills/database/mysql/references/04-functions-json.md +129 -0
- package/skills/database/mysql/references/05-sql-ddl-types.md +235 -0
- package/skills/database/mysql/references/06-index-optimization.md +232 -0
- package/skills/database/mysql/references/07-replication-ha.md +213 -0
- package/skills/database/mysql/references/08-backup-restore.md +207 -0
- package/skills/database/mysql/references/09-advanced-features.md +345 -0
- package/skills/database/oracle/LICENSE.txt +202 -0
- package/skills/database/oracle/SKILL.md +238 -0
- package/skills/database/oracle/examples/01-plsql-procedure.md +90 -0
- package/skills/database/oracle/examples/02-awr-analysis.md +99 -0
- package/skills/database/oracle/examples/03-rman-backup.md +108 -0
- package/skills/database/oracle/examples/04-dataguard-setup.md +146 -0
- package/skills/database/oracle/references/01-functions-string.md +91 -0
- package/skills/database/oracle/references/02-functions-date.md +71 -0
- package/skills/database/oracle/references/03-analytic-functions.md +103 -0
- package/skills/database/oracle/references/04-plsql-guide.md +303 -0
- package/skills/database/oracle/references/05-performance-tuning.md +164 -0
- package/skills/database/oracle/references/06-backup-recovery.md +115 -0
- package/skills/database/oracle/references/07-dataguard-rac.md +76 -0
- package/skills/database/oracle/references/08-security.md +170 -0
- package/skills/database/oracle/references/09-sql-syntax.md +152 -0
- package/skills/database/oracle/references/10-features.md +174 -0
- package/skills/database/postgresql/LICENSE.txt +202 -0
- package/skills/database/postgresql/SKILL.md +182 -0
- package/skills/database/postgresql/examples/.gitkeep +0 -0
- package/skills/database/postgresql/examples/01-jsonb-query.md +72 -0
- package/skills/database/postgresql/examples/02-cte-recursive.md +110 -0
- package/skills/database/postgresql/examples/03-performance-tuning.md +114 -0
- package/skills/database/postgresql/examples/04-streaming-replication.md +113 -0
- package/skills/database/postgresql/references/.gitkeep +0 -0
- package/skills/database/postgresql/references/01-functions-string.md +174 -0
- package/skills/database/postgresql/references/02-functions-datetime.md +54 -0
- package/skills/database/postgresql/references/03-functions-aggregate-window.md +142 -0
- package/skills/database/postgresql/references/04-functions-jsonb.md +117 -0
- package/skills/database/postgresql/references/05-fulltext-search.md +109 -0
- package/skills/database/postgresql/references/06-index-types.md +95 -0
- package/skills/database/postgresql/references/07-partition-fdw.md +133 -0
- package/skills/database/postgresql/references/08-replication-backup.md +215 -0
- package/skills/database/redis/LICENSE.txt +202 -0
- package/skills/database/redis/SKILL.md +922 -0
- package/skills/database/redis/examples/01-cache-usage.md +104 -0
- package/skills/database/redis/examples/02-session-storage.md +72 -0
- package/skills/database/redis/examples/03-leaderboard.md +63 -0
- package/skills/database/redis/examples/04-redis-cluster-setup.md +70 -0
- package/skills/database/redis/examples/05-stream-queue.md +65 -0
- package/skills/database/redis/references/command-quick-ref.md +180 -0
- package/skills/database/redis/references/commands-admin-key.md +413 -0
- package/skills/database/redis/references/commands-set-sorted-advanced.md +539 -0
- package/skills/database/redis/references/commands-string-hash-list.md +458 -0
- package/skills/database/redis/references/memory-optimization.md +150 -0
- package/skills/database/redis/references/redis-conf-production.md +139 -0
- package/skills/specflow-approval/SKILL.md +102 -181
- package/templates/approval.md +321 -221
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
# 桶聚合 (Bucket Aggregations)
|
|
2
|
+
|
|
3
|
+
桶聚合将文档分组到不同的"桶"中,类似 SQL 的 GROUP BY。每个桶可以嵌套子聚合。
|
|
4
|
+
|
|
5
|
+
## terms — 分组聚合 (GROUP BY)
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
# 按标签分组统计
|
|
9
|
+
GET /products/_search
|
|
10
|
+
{
|
|
11
|
+
"size": 0,
|
|
12
|
+
"aggs": {
|
|
13
|
+
"by_tags": {
|
|
14
|
+
"terms": {
|
|
15
|
+
"field": "tags",
|
|
16
|
+
"size": 20,
|
|
17
|
+
"order": { "_count": "desc" }
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
# 带子聚合: 每个分组的平均价格
|
|
24
|
+
GET /products/_search
|
|
25
|
+
{
|
|
26
|
+
"size": 0,
|
|
27
|
+
"aggs": {
|
|
28
|
+
"by_brand": {
|
|
29
|
+
"terms": {
|
|
30
|
+
"field": "brand",
|
|
31
|
+
"size": 10,
|
|
32
|
+
"order": { "avg_price": "desc" }
|
|
33
|
+
},
|
|
34
|
+
"aggs": {
|
|
35
|
+
"avg_price": { "avg": { "field": "price" } },
|
|
36
|
+
"product_count": { "value_count": { "field": "id" } }
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
**注意事项**:
|
|
44
|
+
- `size` 控制返回桶数(默认 10),超大 size 消耗内存
|
|
45
|
+
- `order` 支持按文档数 (`_count`)、聚合键 (`_key`)、子聚合排序
|
|
46
|
+
- keyword 字段上聚合性能最佳,text 字段需开启 `fielddata`
|
|
47
|
+
|
|
48
|
+
## range / date_range — 范围分组
|
|
49
|
+
|
|
50
|
+
```bash
|
|
51
|
+
# 价格区间分组
|
|
52
|
+
GET /products/_search
|
|
53
|
+
{
|
|
54
|
+
"size": 0,
|
|
55
|
+
"aggs": {
|
|
56
|
+
"price_ranges": {
|
|
57
|
+
"range": {
|
|
58
|
+
"field": "price",
|
|
59
|
+
"ranges": [
|
|
60
|
+
{ "key": "0-1000", "from": 0, "to": 1000 },
|
|
61
|
+
{ "key": "1000-5000", "from": 1000, "to": 5000 },
|
|
62
|
+
{ "key": "5000+", "from": 5000 }
|
|
63
|
+
]
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
# 日期范围
|
|
70
|
+
GET /orders/_search
|
|
71
|
+
{
|
|
72
|
+
"size": 0,
|
|
73
|
+
"aggs": {
|
|
74
|
+
"date_ranges": {
|
|
75
|
+
"date_range": {
|
|
76
|
+
"field": "order_date",
|
|
77
|
+
"ranges": [
|
|
78
|
+
{ "from": "now-30d/d", "to": "now" },
|
|
79
|
+
{ "from": "now-90d/d", "to": "now-30d/d" }
|
|
80
|
+
]
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
## histogram / date_histogram — 直方图
|
|
88
|
+
|
|
89
|
+
```bash
|
|
90
|
+
# 价格直方图 (间隔 1000)
|
|
91
|
+
GET /products/_search
|
|
92
|
+
{
|
|
93
|
+
"size": 0,
|
|
94
|
+
"aggs": {
|
|
95
|
+
"price_histogram": {
|
|
96
|
+
"histogram": {
|
|
97
|
+
"field": "price",
|
|
98
|
+
"interval": 1000,
|
|
99
|
+
"min_doc_count": 1
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
# 时间直方图 (按小时/天/月/年聚合)
|
|
106
|
+
GET /orders/_search
|
|
107
|
+
{
|
|
108
|
+
"size": 0,
|
|
109
|
+
"aggs": {
|
|
110
|
+
"orders_over_time": {
|
|
111
|
+
"date_histogram": {
|
|
112
|
+
"field": "order_date",
|
|
113
|
+
"calendar_interval": "day", // month, quarter, year
|
|
114
|
+
"format": "yyyy-MM-dd",
|
|
115
|
+
"min_doc_count": 0,
|
|
116
|
+
"extended_bounds": {
|
|
117
|
+
"min": "2024-01-01",
|
|
118
|
+
"max": "2024-12-31"
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
## filter / filters — 过滤聚合
|
|
127
|
+
|
|
128
|
+
```bash
|
|
129
|
+
# 单一过滤
|
|
130
|
+
GET /products/_search
|
|
131
|
+
{
|
|
132
|
+
"size": 0,
|
|
133
|
+
"aggs": {
|
|
134
|
+
"active_products": {
|
|
135
|
+
"filter": { "term": { "status": "active" } },
|
|
136
|
+
"aggs": {
|
|
137
|
+
"avg_price": { "avg": { "field": "price" } }
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
# 多过滤
|
|
144
|
+
GET /products/_search
|
|
145
|
+
{
|
|
146
|
+
"size": 0,
|
|
147
|
+
"aggs": {
|
|
148
|
+
"price_categories": {
|
|
149
|
+
"filters": {
|
|
150
|
+
"other_bucket": true,
|
|
151
|
+
"filters": {
|
|
152
|
+
"budget": { "range": { "price": { "lte": 5000 } } },
|
|
153
|
+
"mid": { "range": { "price": { "from": 5000, "to": 15000 } } },
|
|
154
|
+
"premium": { "range": { "price": { "gte": 15000 } } }
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
## 管道聚合 (Pipeline Aggregations)
|
|
163
|
+
|
|
164
|
+
```bash
|
|
165
|
+
# derivative — 环比增量
|
|
166
|
+
GET /orders/_search
|
|
167
|
+
{
|
|
168
|
+
"size": 0,
|
|
169
|
+
"aggs": {
|
|
170
|
+
"sales_per_day": {
|
|
171
|
+
"date_histogram": {
|
|
172
|
+
"field": "order_date",
|
|
173
|
+
"calendar_interval": "day"
|
|
174
|
+
},
|
|
175
|
+
"aggs": {
|
|
176
|
+
"daily_sales": { "sum": { "field": "amount" } },
|
|
177
|
+
"sales_derivative": {
|
|
178
|
+
"derivative": { "buckets_path": "daily_sales" }
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
# bucket_script — 计算桶间比例
|
|
186
|
+
GET /products/_search
|
|
187
|
+
{
|
|
188
|
+
"size": 0,
|
|
189
|
+
"aggs": {
|
|
190
|
+
"total_products": { "value_count": { "field": "id" } },
|
|
191
|
+
"active_products": {
|
|
192
|
+
"filter": { "term": { "status": "active" } }
|
|
193
|
+
},
|
|
194
|
+
"active_ratio": {
|
|
195
|
+
"bucket_script": {
|
|
196
|
+
"buckets_path": {
|
|
197
|
+
"activeCount": "active_products>_count",
|
|
198
|
+
"totalCount": "total_products"
|
|
199
|
+
},
|
|
200
|
+
"script": "params.activeCount / params.totalCount * 100"
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
# bucket_selector — 过滤桶 (类似 HAVING)
|
|
207
|
+
GET /products/_search
|
|
208
|
+
{
|
|
209
|
+
"size": 0,
|
|
210
|
+
"aggs": {
|
|
211
|
+
"by_brand": {
|
|
212
|
+
"terms": { "field": "brand", "size": 100 },
|
|
213
|
+
"aggs": {
|
|
214
|
+
"avg_price": { "avg": { "field": "price" } },
|
|
215
|
+
"brands_having_avg_gt_10000": {
|
|
216
|
+
"bucket_selector": {
|
|
217
|
+
"buckets_path": { "avgPrice": "avg_price" },
|
|
218
|
+
"script": "params.avgPrice > 10000"
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
```
|
|
226
|
+
|
|
227
|
+
## 业务场景速查
|
|
228
|
+
|
|
229
|
+
| 聚合 | 场景 |
|
|
230
|
+
|------|------|
|
|
231
|
+
| terms | 商品分类统计、品牌分布、标签统计 |
|
|
232
|
+
| date_histogram | 销售日报/月报、API 请求时序、监控趋势 |
|
|
233
|
+
| range | 价格区间分布、年龄段统计 |
|
|
234
|
+
| filters | 多条件对比分析 |
|
|
235
|
+
| derivative | 环比增长/下降分析 |
|
|
236
|
+
| bucket_selector | 过滤出符合条件的组 (HAVING) |
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
# 映射与字段类型详解
|
|
2
|
+
|
|
3
|
+
Mapping 定义文档中每个字段的数据类型和分析方式,相当于关系型数据库的 Schema。
|
|
4
|
+
|
|
5
|
+
## 字段类型速查
|
|
6
|
+
|
|
7
|
+
| 字段类型 | 说明 | 适用场景 |
|
|
8
|
+
|---------|------|---------|
|
|
9
|
+
| `text` | 被分词的全文字段 | 全文搜索、文章内容 |
|
|
10
|
+
| `keyword` | 精确值、不被分词 | 标签、状态、分类、ID |
|
|
11
|
+
| `integer` | 32 位整数 | 年龄、计数 |
|
|
12
|
+
| `long` | 64 位整数 | 时间戳、大数值 |
|
|
13
|
+
| `float` | 单精度浮点 | 价格、分数 |
|
|
14
|
+
| `double` | 双精度浮点 | 科学计算 |
|
|
15
|
+
| `boolean` | 布尔值 | 开关、状态 |
|
|
16
|
+
| `date` | 日期 (可多 format) | 时间字段 |
|
|
17
|
+
| `ip` | IPv4/IPv6 | IP 分析、CIDR 匹配 |
|
|
18
|
+
| `geo_point` | 经纬度点 | 地理位置、距离排序 |
|
|
19
|
+
| `geo_shape` | 复杂地理形状 | 区域查询、地理围栏 |
|
|
20
|
+
| `nested` | 嵌套对象 (独立索引) | 保持数组内对象关联 |
|
|
21
|
+
| `object` | JSON 对象 (默认) | 普通嵌套数据 |
|
|
22
|
+
| `completion` | 自动补全 | 搜索建议 |
|
|
23
|
+
| `dense_vector` | 稠密向量 | KNN 语义搜索 |
|
|
24
|
+
| `flattened` | 扁平化嵌套对象 | 未知结构的元数据 |
|
|
25
|
+
| `percolator` | 反向搜索 | 告警规则匹配 |
|
|
26
|
+
| `range` | 范围类型 (integer_range) | IP 段、时间范围 |
|
|
27
|
+
|
|
28
|
+
## 动态映射 (Dynamic Mapping)
|
|
29
|
+
|
|
30
|
+
| 设置 | 行为 |
|
|
31
|
+
|------|------|
|
|
32
|
+
| `"dynamic": true` | 自动检测并添加新字段 (默认) |
|
|
33
|
+
| `"dynamic": "runtime"` | 运行时映射 (7.11+) |
|
|
34
|
+
| `"dynamic": false` | 忽略新字段 (不索引,可查询 _source) |
|
|
35
|
+
| `"dynamic": "strict"` | 遇到新字段抛出异常 |
|
|
36
|
+
|
|
37
|
+
## 映射参数详解
|
|
38
|
+
|
|
39
|
+
```json
|
|
40
|
+
PUT /articles
|
|
41
|
+
{
|
|
42
|
+
"mappings": {
|
|
43
|
+
"properties": {
|
|
44
|
+
"title": {
|
|
45
|
+
"type": "text",
|
|
46
|
+
"analyzer": "ik_max_word",
|
|
47
|
+
"search_analyzer": "ik_smart",
|
|
48
|
+
"fields": {
|
|
49
|
+
"keyword": {
|
|
50
|
+
"type": "keyword",
|
|
51
|
+
"ignore_above": 256
|
|
52
|
+
},
|
|
53
|
+
"pinyin": {
|
|
54
|
+
"type": "text",
|
|
55
|
+
"analyzer": "pinyin"
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
},
|
|
59
|
+
"price": {
|
|
60
|
+
"type": "float",
|
|
61
|
+
"coerce": false
|
|
62
|
+
},
|
|
63
|
+
"meta_data": {
|
|
64
|
+
"type": "flattened"
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
## 关键参数
|
|
72
|
+
|
|
73
|
+
| 参数 | 说明 | 默认值 |
|
|
74
|
+
|------|------|--------|
|
|
75
|
+
| `analyzer` | 索引分词器 | standard |
|
|
76
|
+
| `search_analyzer` | 搜索分词器 | 同 analyzer |
|
|
77
|
+
| `fields` | 多字段 | 无 |
|
|
78
|
+
| `copy_to` | 复制到组合字段 | 无 |
|
|
79
|
+
| `coerce` | 自动类型转换 | true |
|
|
80
|
+
| `doc_values` | 列式存储(排序/聚合) | text 外 true |
|
|
81
|
+
| `index` | 是否索引 | true |
|
|
82
|
+
| `norms` | 归一化因子(算分用) | true |
|
|
83
|
+
| `ignore_above` | 超长不索引 (keyword) | 无 |
|
|
84
|
+
| `eager_global_ordinals` | 预加载全局序数 | false |
|
|
85
|
+
|
|
86
|
+
## 别名 (Alias) 与索引模板
|
|
87
|
+
|
|
88
|
+
```json
|
|
89
|
+
// 原子切换别名 (零停机重建)
|
|
90
|
+
POST /_aliases
|
|
91
|
+
{
|
|
92
|
+
"actions": [
|
|
93
|
+
{ "remove": { "index": "products_v1", "alias": "products" } },
|
|
94
|
+
{ "add": { "index": "products_v2", "alias": "products" } }
|
|
95
|
+
]
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
// 索引模板
|
|
99
|
+
PUT /_index_template/logs_template
|
|
100
|
+
{
|
|
101
|
+
"index_patterns": ["logs-*"],
|
|
102
|
+
"template": {
|
|
103
|
+
"settings": {
|
|
104
|
+
"number_of_shards": 3,
|
|
105
|
+
"number_of_replicas": 1
|
|
106
|
+
},
|
|
107
|
+
"mappings": {
|
|
108
|
+
"properties": {
|
|
109
|
+
"@timestamp": { "type": "date" },
|
|
110
|
+
"message": { "type": "text" },
|
|
111
|
+
"level": { "type": "keyword" }
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
## 索引设置
|
|
119
|
+
|
|
120
|
+
```json
|
|
121
|
+
PUT /my_index
|
|
122
|
+
{
|
|
123
|
+
"settings": {
|
|
124
|
+
"number_of_shards": 3,
|
|
125
|
+
"number_of_replicas": 1,
|
|
126
|
+
"refresh_interval": "30s",
|
|
127
|
+
"max_result_window": 100000,
|
|
128
|
+
"codec": "best_compression"
|
|
129
|
+
},
|
|
130
|
+
"mappings": { ... }
|
|
131
|
+
}
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
**重要**:`number_of_shards` 建后不可修改。`refresh_interval` 大批量写入时可设为 `-1`(关闭)。
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
# 分词器 (Analyzer)
|
|
2
|
+
|
|
3
|
+
分词器将文本拆分为词项 (Token),用于建立倒排索引和搜索。
|
|
4
|
+
|
|
5
|
+
## Analyzer 组成
|
|
6
|
+
|
|
7
|
+
```
|
|
8
|
+
Analyzer = Char Filter(s) + Tokenizer + Token Filter(s)
|
|
9
|
+
(字符过滤) (分词器) (词项过滤)
|
|
10
|
+
|
|
11
|
+
输入: "I <3 Elasticsearch!"
|
|
12
|
+
↓
|
|
13
|
+
char_filter: HTML 解码 → "I <3 Elasticsearch!"
|
|
14
|
+
↓
|
|
15
|
+
tokenizer: 按空格/标点拆分 → ["I", "<3", "Elasticsearch"]
|
|
16
|
+
↓
|
|
17
|
+
token_filter: 小写化 → ["i", "<3", "elasticsearch"]
|
|
18
|
+
↓
|
|
19
|
+
输出: ["i", "<3", "elasticsearch"] (存入倒排索引)
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
## 测试分词器
|
|
23
|
+
|
|
24
|
+
```bash
|
|
25
|
+
# 测试分析器效果
|
|
26
|
+
POST /_analyze
|
|
27
|
+
{
|
|
28
|
+
"analyzer": "standard",
|
|
29
|
+
"text": "I love Elasticsearch 搜索引擎"
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
# 指定字段测试 (使用字段配置的分析器)
|
|
33
|
+
POST /products/_analyze
|
|
34
|
+
{
|
|
35
|
+
"field": "title",
|
|
36
|
+
"text": "Apple MacBook Pro 16英寸"
|
|
37
|
+
}
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
## 内置分词器
|
|
41
|
+
|
|
42
|
+
| 分词器 | 说明 | 示例: "I love ES" |
|
|
43
|
+
|--------|------|------------------|
|
|
44
|
+
| `standard` | Unicode 分词, 小写化 (默认) | ["i", "love", "es"] |
|
|
45
|
+
| `simple` | 非字母分割, 小写化 | ["i", "love", "es"] |
|
|
46
|
+
| `whitespace` | 空格分割 (不小写) | ["I", "love", "ES"] |
|
|
47
|
+
| `keyword` | 不分词, 整个字符串输出 | ["I love ES"] |
|
|
48
|
+
| `pattern` | 正则分割 | 取决于 pattern |
|
|
49
|
+
| `stop` | 类似 simple + 去停用词 | ["love", "es"] |
|
|
50
|
+
| `fingerprint` | 排序 + 去重 | ["es", "i", "love"] |
|
|
51
|
+
|
|
52
|
+
## IK 分词器 (中文)
|
|
53
|
+
|
|
54
|
+
```bash
|
|
55
|
+
# 安装 (需重启 ES)
|
|
56
|
+
./bin/elasticsearch-plugin install \
|
|
57
|
+
https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v8.12.0/elasticsearch-analysis-ik-8.12.0.zip
|
|
58
|
+
|
|
59
|
+
# ik_smart (粗粒度)
|
|
60
|
+
POST /_analyze { "analyzer": "ik_smart", "text": "中华人民共和国国歌" }
|
|
61
|
+
# → ["中华人民共和国", "国歌"]
|
|
62
|
+
|
|
63
|
+
# ik_max_word (细粒度, 穷尽所有可能)
|
|
64
|
+
POST /_analyze { "analyzer": "ik_max_word", "text": "中华人民共和国国歌" }
|
|
65
|
+
# → ["中华人民共和国", "中华人民", "中华", "华人", "人民共和国", "人民", "共和国", "共和", "国歌"]
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
| 场景 | 推荐 | 理由 |
|
|
69
|
+
|------|------|------|
|
|
70
|
+
| 索引 (建倒排索引) | `ik_max_word` | 细粒度, 覆盖更多可能性 |
|
|
71
|
+
| 搜索 (用户输入) | `ik_smart` | 粗粒度, 提高搜索精度 |
|
|
72
|
+
|
|
73
|
+
## 拼音分词器
|
|
74
|
+
|
|
75
|
+
```bash
|
|
76
|
+
./bin/elasticsearch-plugin install \
|
|
77
|
+
https://github.com/medcl/elasticsearch-analysis-pinyin/releases/download/v8.12.0/elasticsearch-analysis-pinyin-8.12.0.zip
|
|
78
|
+
|
|
79
|
+
# 测试
|
|
80
|
+
POST /_analyze { "analyzer": "pinyin", "text": "王大力" }
|
|
81
|
+
# → ["wang", "da", "li", "wangda", "dali", "wangdali", "wdl"]
|
|
82
|
+
|
|
83
|
+
# 拼音字段配置
|
|
84
|
+
PUT /products
|
|
85
|
+
{
|
|
86
|
+
"mappings": {
|
|
87
|
+
"properties": {
|
|
88
|
+
"title": {
|
|
89
|
+
"type": "text",
|
|
90
|
+
"analyzer": "ik_max_word",
|
|
91
|
+
"fields": {
|
|
92
|
+
"pinyin": {
|
|
93
|
+
"type": "text",
|
|
94
|
+
"analyzer": "pinyin",
|
|
95
|
+
"search_analyzer": "pinyin"
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
# 搜索 "wdali" → 匹配 "王大力"
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
## 自定义分析器
|
|
106
|
+
|
|
107
|
+
```json
|
|
108
|
+
PUT /my_index
|
|
109
|
+
{
|
|
110
|
+
"settings": {
|
|
111
|
+
"analysis": {
|
|
112
|
+
"char_filter": {
|
|
113
|
+
"html_strip": { "type": "html_strip" },
|
|
114
|
+
"my_mapping": {
|
|
115
|
+
"type": "mapping",
|
|
116
|
+
"mappings": ["& => and", "| => or"]
|
|
117
|
+
}
|
|
118
|
+
},
|
|
119
|
+
"tokenizer": {
|
|
120
|
+
"my_standard": { "type": "standard", "max_token_length": 100 }
|
|
121
|
+
},
|
|
122
|
+
"filter": {
|
|
123
|
+
"my_stop": {
|
|
124
|
+
"type": "stop",
|
|
125
|
+
"stopwords": ["a", "an", "the", "is"]
|
|
126
|
+
},
|
|
127
|
+
"my_synonym": {
|
|
128
|
+
"type": "synonym",
|
|
129
|
+
"synonyms": [
|
|
130
|
+
"笔记本, 笔记本电脑, laptop",
|
|
131
|
+
"手机, 移动电话, smartphone"
|
|
132
|
+
]
|
|
133
|
+
}
|
|
134
|
+
},
|
|
135
|
+
"analyzer": {
|
|
136
|
+
"my_custom_analyzer": {
|
|
137
|
+
"type": "custom",
|
|
138
|
+
"char_filter": ["html_strip", "my_mapping"],
|
|
139
|
+
"tokenizer": "my_standard",
|
|
140
|
+
"filter": ["lowercase", "my_stop", "my_synonym", "asciifolding"]
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
## 自动补全 (Edge Ngram)
|
|
149
|
+
|
|
150
|
+
```json
|
|
151
|
+
PUT /autocomplete_index
|
|
152
|
+
{
|
|
153
|
+
"settings": {
|
|
154
|
+
"analysis": {
|
|
155
|
+
"filter": {
|
|
156
|
+
"autocomplete_filter": {
|
|
157
|
+
"type": "edge_ngram",
|
|
158
|
+
"min_gram": 1,
|
|
159
|
+
"max_gram": 20
|
|
160
|
+
}
|
|
161
|
+
},
|
|
162
|
+
"analyzer": {
|
|
163
|
+
"autocomplete": {
|
|
164
|
+
"type": "custom",
|
|
165
|
+
"tokenizer": "standard",
|
|
166
|
+
"filter": ["lowercase", "autocomplete_filter"]
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
},
|
|
171
|
+
"mappings": {
|
|
172
|
+
"properties": {
|
|
173
|
+
"title": {
|
|
174
|
+
"type": "text",
|
|
175
|
+
"analyzer": "autocomplete",
|
|
176
|
+
"search_analyzer": "standard"
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
## 同义词注意事项
|
|
184
|
+
|
|
185
|
+
- **单向同义词**: `"laptop => 笔记本"` (搜索 laptop 映射到笔记本)
|
|
186
|
+
- **双向同义词**: `"laptop, 笔记本"` (互相等价)
|
|
187
|
+
- **最佳实践**: 索引时不用同义词(保持原始词),搜索时用 `search_analyzer`
|