在 Elasticsearch 中,可以通过多种方式控制搜索结果中字段的返回方式,以下是所有相关参数及其用途:
1. `_source` 参数
`_source` 参数用于控制是否返回 `_source` 字段中的原始 JSON 数据,以及指定需要返回的字段。
- 返回指定字段:
```json
GET /my_index/_search
{
"_source": ["field1", "field2"],
"query": {
"match_all": {}
}
}
```
- 排除字段:
```json
GET /my_index/_search
{
"_source": {
"excludes": ["field3"]
},
"query": {
"match_all": {}
}
}
```
- 完全禁用 `_source` 返回:
```json
GET /my_index/_search
{
"_source": false,
"query": {
"match_all": {}
}
}
```
2. `fields` 参数
`fields` 参数可以用于返回指定的字段值,但需要注意,该参数在较新的版本中已被 `_source` 替代,不过仍然可以使用。
```json
GET /my_index/_search
{
"fields": ["field1", "field2"],
"query": {
"match_all": {}
}
}
```
3. `docvalue_fields` 参数
`docvalue_fields` 参数用于返回支持 doc values 的字段值,适合用于聚合或排序的字段,性能较高。
```json
GET /my_index/_search
{
"docvalue_fields": ["field1", "field2"],
"query": {
"match_all": {}
}
}
```
4. `stored_fields` 参数
`stored_fields` 参数用于返回在索引映射中设置为 `store: true` 的字段。
```json
GET /my_index/_search
{
"stored_fields": ["field1", "field2"],
"query": {
"match_all": {}
}
}
```
5. `script_fields` 参数
`script_fields` 参数用于通过脚本动态计算字段值。
```json
GET /my_index/_search
{
"script_fields": {
"scripted_field": {
"script": {
"source": "doc['field1'].value * 2"
}
}
},
"query": {
"match_all": {}
}
}
```
6. `source_filtering` 参数
`source_filtering` 参数用于在查询中包含或排除特定字段,通常在使用高级 REST 客户端或特定客户端库时可用。
```json
GET /my_index/_search
{
"_source": {
"includes": ["field1", "field2"],
"excludes": ["field3"]
},
"query": {
"match_all": {}
}
}
```
7. `inner_hits` 参数
`inner_hits` 参数用于在嵌套查询中返回嵌套字段的匹配结果。
```json
GET /my_index/_search
{
"query": {
"nested": {
"path": "nested_field",
"query": {
"match": {
"nested_field.sub_field": "value"
}
},
"inner_hits": {
"_source": ["nested_field.sub_field"]
}
}
}
}
```
8. `highlight` 参数
`highlight` 参数用于高亮显示匹配的字段内容,虽然主要用于高亮显示,但也可以用于返回特定字段。
```json
GET /my_index/_search
{
"query": {
"match": {
"field1": "search_term"
}
},
"highlight": {
"fields": {
"field1": {}
}
}
}
```
总结
- 使用 `_source` 参数可以灵活地包含或排除字段。
- `docvalue_fields` 和 `stored_fields` 适合性能优化场景。
- `script_fields` 用于动态计算字段值。
- `fields` 参数在旧版本中使用,但已被 `_source` 替代。
- `source_filtering` 和 `inner_hits` 提供了更高级的字段控制方式。
- `highlight` 参数可以用于高亮显示字段内容。
根据具体需求选择合适的参数可以显著优化查询性能和减少数据传输量。