@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.
Files changed (82) hide show
  1. package/README.md +1 -1
  2. package/package.json +1 -1
  3. package/prompts/approval/database-guidance.md +79 -0
  4. package/prompts/approval/generate.md +600 -290
  5. package/skills/database/LICENSE +405 -0
  6. package/skills/database/ORIGIN.md +6 -0
  7. package/skills/database/README.md +30 -0
  8. package/skills/database/elasticsearch/LICENSE.txt +202 -0
  9. package/skills/database/elasticsearch/SKILL.md +199 -0
  10. package/skills/database/elasticsearch/examples/01-fulltext-search.md +215 -0
  11. package/skills/database/elasticsearch/examples/02-aggregation-report.md +206 -0
  12. package/skills/database/elasticsearch/examples/03-reindex-zero-downtime.md +200 -0
  13. package/skills/database/elasticsearch/examples/04-cluster-monitoring.md +204 -0
  14. package/skills/database/elasticsearch/references/01-query-dsl-fulltext.md +162 -0
  15. package/skills/database/elasticsearch/references/02-query-dsl-term.md +210 -0
  16. package/skills/database/elasticsearch/references/03-aggregations-metric.md +161 -0
  17. package/skills/database/elasticsearch/references/04-aggregations-bucket.md +236 -0
  18. package/skills/database/elasticsearch/references/05-mapping-types.md +134 -0
  19. package/skills/database/elasticsearch/references/06-analyzers.md +187 -0
  20. package/skills/database/elasticsearch/references/07-cluster-ops.md +225 -0
  21. package/skills/database/elasticsearch/references/08-elk-integration.md +170 -0
  22. package/skills/database/mysql/SKILL.md +195 -0
  23. package/skills/database/mysql/examples/01-connection-pool.md +75 -0
  24. package/skills/database/mysql/examples/02-slow-query-optimization.md +98 -0
  25. package/skills/database/mysql/examples/03-master-slave-setup.md +144 -0
  26. package/skills/database/mysql/examples/04-backup-strategy.md +212 -0
  27. package/skills/database/mysql/references/01-functions-string.md +103 -0
  28. package/skills/database/mysql/references/02-functions-date.md +152 -0
  29. package/skills/database/mysql/references/03-functions-aggregate-window.md +167 -0
  30. package/skills/database/mysql/references/04-functions-json.md +129 -0
  31. package/skills/database/mysql/references/05-sql-ddl-types.md +235 -0
  32. package/skills/database/mysql/references/06-index-optimization.md +232 -0
  33. package/skills/database/mysql/references/07-replication-ha.md +213 -0
  34. package/skills/database/mysql/references/08-backup-restore.md +207 -0
  35. package/skills/database/mysql/references/09-advanced-features.md +345 -0
  36. package/skills/database/oracle/LICENSE.txt +202 -0
  37. package/skills/database/oracle/SKILL.md +238 -0
  38. package/skills/database/oracle/examples/01-plsql-procedure.md +90 -0
  39. package/skills/database/oracle/examples/02-awr-analysis.md +99 -0
  40. package/skills/database/oracle/examples/03-rman-backup.md +108 -0
  41. package/skills/database/oracle/examples/04-dataguard-setup.md +146 -0
  42. package/skills/database/oracle/references/01-functions-string.md +91 -0
  43. package/skills/database/oracle/references/02-functions-date.md +71 -0
  44. package/skills/database/oracle/references/03-analytic-functions.md +103 -0
  45. package/skills/database/oracle/references/04-plsql-guide.md +303 -0
  46. package/skills/database/oracle/references/05-performance-tuning.md +164 -0
  47. package/skills/database/oracle/references/06-backup-recovery.md +115 -0
  48. package/skills/database/oracle/references/07-dataguard-rac.md +76 -0
  49. package/skills/database/oracle/references/08-security.md +170 -0
  50. package/skills/database/oracle/references/09-sql-syntax.md +152 -0
  51. package/skills/database/oracle/references/10-features.md +174 -0
  52. package/skills/database/postgresql/LICENSE.txt +202 -0
  53. package/skills/database/postgresql/SKILL.md +182 -0
  54. package/skills/database/postgresql/examples/.gitkeep +0 -0
  55. package/skills/database/postgresql/examples/01-jsonb-query.md +72 -0
  56. package/skills/database/postgresql/examples/02-cte-recursive.md +110 -0
  57. package/skills/database/postgresql/examples/03-performance-tuning.md +114 -0
  58. package/skills/database/postgresql/examples/04-streaming-replication.md +113 -0
  59. package/skills/database/postgresql/references/.gitkeep +0 -0
  60. package/skills/database/postgresql/references/01-functions-string.md +174 -0
  61. package/skills/database/postgresql/references/02-functions-datetime.md +54 -0
  62. package/skills/database/postgresql/references/03-functions-aggregate-window.md +142 -0
  63. package/skills/database/postgresql/references/04-functions-jsonb.md +117 -0
  64. package/skills/database/postgresql/references/05-fulltext-search.md +109 -0
  65. package/skills/database/postgresql/references/06-index-types.md +95 -0
  66. package/skills/database/postgresql/references/07-partition-fdw.md +133 -0
  67. package/skills/database/postgresql/references/08-replication-backup.md +215 -0
  68. package/skills/database/redis/LICENSE.txt +202 -0
  69. package/skills/database/redis/SKILL.md +922 -0
  70. package/skills/database/redis/examples/01-cache-usage.md +104 -0
  71. package/skills/database/redis/examples/02-session-storage.md +72 -0
  72. package/skills/database/redis/examples/03-leaderboard.md +63 -0
  73. package/skills/database/redis/examples/04-redis-cluster-setup.md +70 -0
  74. package/skills/database/redis/examples/05-stream-queue.md +65 -0
  75. package/skills/database/redis/references/command-quick-ref.md +180 -0
  76. package/skills/database/redis/references/commands-admin-key.md +413 -0
  77. package/skills/database/redis/references/commands-set-sorted-advanced.md +539 -0
  78. package/skills/database/redis/references/commands-string-hash-list.md +458 -0
  79. package/skills/database/redis/references/memory-optimization.md +150 -0
  80. package/skills/database/redis/references/redis-conf-production.md +139 -0
  81. package/skills/specflow-approval/SKILL.md +102 -181
  82. 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`