Skip to content

Commit c85167d

Browse files
committed
修改笔记:Elasticsearch搜索相关性
1 parent 335bb88 commit c85167d

File tree

1 file changed

+208
-1
lines changed

1 file changed

+208
-1
lines changed

基础笔记/数据库/Elasticsearch/subfile/_7Elasticsearch搜索相关性.md

Lines changed: 208 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1053,7 +1053,7 @@ POST /blogs/_search
10531053
}
10541054
```
10551055

1056-
#### 3.5.2 与 `dis_max` 查询的异同
1056+
#### 3.5.2 与 `dis_max` 查询的区别
10571057

10581058
| 特性 | best_fields | dis_max |
10591059
| :------------: | :------------------------: | :------------------------------: |
@@ -1075,5 +1075,212 @@ POST /blogs/_search
10751075

10761076
虽然`best_fields`查询本质上是通过`dis_max`实现的,但由于语法糖和特定优化,它们并不完全等价。**可以认为`best_fields``dis_max`在multi_match查询中的一种特化实现**,专为多字段文本搜索场景优化。
10771077

1078+
### 3.6 most_fields 查询
10781079

1080+
`most_fields``multi_match` 查询的另一种类型,专门为需要**综合多个字段匹配程度**的场景设计。其核心特征是:
10791081

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

Comments
 (0)