@@ -1053,7 +1053,7 @@ POST /blogs/_search
1053
1053
}
1054
1054
```
1055
1055
1056
- #### 3.5.2 与 ` dis_max ` 查询的异同
1056
+ #### 3.5.2 与 ` dis_max ` 查询的区别
1057
1057
1058
1058
| 特性 | best_fields | dis_max |
1059
1059
| :------------: | :------------------------: | :------------------------------: |
@@ -1075,5 +1075,212 @@ POST /blogs/_search
1075
1075
1076
1076
虽然` best_fields ` 查询本质上是通过` dis_max ` 实现的,但由于语法糖和特定优化,它们并不完全等价。** 可以认为` best_fields ` 是` dis_max ` 在multi_match查询中的一种特化实现** ,专为多字段文本搜索场景优化。
1077
1077
1078
+ ### 3.6 most_fields 查询
1078
1079
1080
+ ` most_fields ` 是 ` multi_match ` 查询的另一种类型,专门为需要** 综合多个字段匹配程度** 的场景设计。其核心特征是:
1079
1081
1082
+ 1 . ** 评分累加机制** :将所有匹配字段的评分累计得到最终评分
1083
+ 2 . ** 权重放大作用** :适合通过多字段叠加相关性信号
1084
+ 3 . 典型应用场景:
1085
+ - 主字段(包含词干扩展)+ 子字段(精确匹配)的组合
1086
+ - 希望强化跨字段匹配的综合相关性
1087
+
1088
+ most_fields策略获取全部匹配字段的累计得分(综合全部匹配字段的得分),等价于bool should查询方式。
1089
+
1090
+ 前面我们介绍了基于 ` bool should ` 多字段查询:
1091
+ ``` json
1092
+ POST /blogs/_search
1093
+ {
1094
+ "query" : {
1095
+ "bool" : {
1096
+ "should" : [
1097
+ {
1098
+ "match" : {
1099
+ "title" : " Brown fox"
1100
+ }
1101
+ },
1102
+ {
1103
+ "match" : {
1104
+ "body" : " Brown fox"
1105
+ }
1106
+ }
1107
+ ]
1108
+ }
1109
+ }
1110
+ }
1111
+ ```
1112
+
1113
+ 可以等价于 ` most_fields ` 查询:
1114
+
1115
+ ``` json
1116
+ POST /blogs/_search
1117
+ {
1118
+ "query" : {
1119
+ "multi_match" : {
1120
+ "type" : " most_fields" ,
1121
+ "fields" : [" title" ," body" ],
1122
+ "query" : " Brown fox"
1123
+ }
1124
+ }
1125
+ }
1126
+ ```
1127
+
1128
+ ### 3.7 cross_fields 查询
1129
+
1130
+ #### 3.7.1 核心概念
1131
+
1132
+ ` cross_fields ` 是 ` multi_match ` 查询的一种类型,专为** 跨字段联合匹配** 场景设计。其核心特点是:
1133
+
1134
+ - ** 字段融合** :将多个字段视为一个逻辑上的大字段
1135
+ - ** 统一统计** :合并所有字段的** 词项统计信息** (如IDF)
1136
+ - ** 强制覆盖** :要求查询词中的** 每个词项** 必须出现在** 至少一个字段** 中
1137
+
1138
+ #### 3.7.2 适用场景
1139
+
1140
+ 典型使用场景包括:
1141
+
1142
+ | 场景类型 | 示例 | 字段示例 |
1143
+ | :------------: | :--------------------: | :----------------------: |
1144
+ | ** 人名搜索** | "John Smith" | first_name, last_name |
1145
+ | ** 地址搜索** | "123 Main St, Boston" | street, city, state |
1146
+ | ** 产品信息** | "iPhone 13 Pro 256GB" | name, specs, description |
1147
+ | ** 跨字段实体** | "ISBN 978-7-01-019..." | isbn, title, author |
1148
+
1149
+ #### 3.7.3 查询语法详解
1150
+
1151
+ ``` json
1152
+ POST /_search
1153
+ {
1154
+ "query" : {
1155
+ "multi_match" : {
1156
+ "query" : " search text" ,
1157
+ "type" : " cross_fields" ,
1158
+ "fields" : [" field1" , " field2^3" ], // 支持字段权重
1159
+ "operator" : " and" , // 默认为or
1160
+ "minimum_should_match" : " 75%" , // 覆盖参数
1161
+ "tie_breaker" : 0.3 // 非主要参数
1162
+ }
1163
+ }
1164
+ }
1165
+ ```
1166
+
1167
+ 关键参数解析:
1168
+
1169
+ - operator:
1170
+ - ` or ` (默认):任意词项匹配即可
1171
+ - ` and ` :要求所有词项必须匹配
1172
+ - minimum_should_match:
1173
+ - 控制最少需要匹配的词项比例
1174
+ - 示例:` "75%" ` 表示在4个词项中至少匹配3个
1175
+ - analyzer:
1176
+ - 可指定统一的分析器覆盖字段原有设置
1177
+
1178
+ #### 3.7.5 案例
1179
+
1180
+ ``` json
1181
+ DELETE /address
1182
+ PUT /address
1183
+ {
1184
+ "settings" : {
1185
+ "index" : {
1186
+ "analysis.analyzer.default.type" : " ik_max_word"
1187
+ }
1188
+ }
1189
+ }
1190
+
1191
+
1192
+ PUT /address/_bulk
1193
+ {"index" : { "_id" : " 1" } }{"province" : " 湖南" ,"city" : " 长沙" }{ "index" : { "_id" : " 2" } }{"province" : " 湖南" ,"city" : " 常德" }{ "index" : { "_id" : " 3" } }{"province" : " 广东" ,"city" : " 广州" }{ "index" : { "_id" : " 4" } }{"province" : " 湖南" ,"city" : " 邵阳" }
1194
+
1195
+
1196
+ #使用 most_fields 的方式结果不符合预期,会将湖南其它城市查询出来,不支持 operator
1197
+ GET /address/_search
1198
+ {
1199
+ "query" : {
1200
+ "multi_match" : {
1201
+ "query" : " 湖南常德" ,
1202
+ "type" : " most_fields" ,
1203
+ "fields" : [
1204
+ " province" ,
1205
+ " city"
1206
+ ]
1207
+ }
1208
+ }
1209
+ }
1210
+
1211
+
1212
+ #与 copy_to 相比,其中一个优势就是它可以在搜索时为单个字段提升权重。
1213
+ GET /address/_search
1214
+ {
1215
+ "query" : {
1216
+ "multi_match" : {
1217
+ "query" : " 湖南常德" ,
1218
+ "type" : " cross_fields" ,
1219
+ "operator" : " and" ,
1220
+ "fields" : [
1221
+ " province" ,
1222
+ " city"
1223
+ ]
1224
+ }
1225
+ }
1226
+ }
1227
+ ```
1228
+
1229
+ 也可以使用copy_to完成类似效果:
1230
+
1231
+ ``` json
1232
+ DELETE /address
1233
+
1234
+ PUT /address
1235
+ {
1236
+ "mappings" : {
1237
+ "properties" : {
1238
+ "province" : {
1239
+ "type" : " keyword" ,
1240
+ "copy_to" : " full_address"
1241
+ },
1242
+ "city" : {
1243
+ "type" : " text" ,
1244
+ "copy_to" : " full_address"
1245
+ }
1246
+ }
1247
+ },
1248
+ "settings" : {
1249
+ "index" : {
1250
+ "analysis.analyzer.default.type" : " ik_max_word"
1251
+ }
1252
+ }
1253
+ }
1254
+
1255
+ PUT /address/_bulk
1256
+ {"index" : { "_id" : " 1" } }
1257
+ {"province" : " 湖南" ,"city" : " 长沙" }
1258
+ { "index" : { "_id" : " 2" } }
1259
+ {"province" : " 湖南" ,"city" : " 常德" }
1260
+ { "index" : { "_id" : " 3" } }
1261
+ {"province" : " 广东" ,"city" : " 广州" }
1262
+ { "index" : { "_id" : " 4" } }
1263
+ {"province" : " 湖南" ,"city" : " 邵阳" }
1264
+
1265
+ GET /address/_search
1266
+ {
1267
+ "query" : {
1268
+ "match" : {
1269
+ "full_address" : {
1270
+ "query" : " 湖南常德" ,
1271
+ "operator" : " and"
1272
+ }
1273
+ }
1274
+ }
1275
+ }
1276
+ ```
1277
+
1278
+ ### 3.8 三种查询类型的区别
1279
+
1280
+ | 查询类型 | 评分策略 | 字段关系 | 典型用例 |
1281
+ | :------------: | :----------------------: | :------: | :------------------: |
1282
+ | ` best_fields ` | 取最高字段得分 | 竞争关系 | 博客标题 vs 正文 |
1283
+ | ` most_fields ` | 累加所有字段得分 | 互补关系 | 主字段+子字段组合 |
1284
+ | ` cross_fields ` | 合并字段统计计算综合得分 | 协同关系 | 姓名、地址等分散信息 |
1285
+
1286
+ ####
0 commit comments