--- title: "搜索文档" date: 2026-01-11 lastmod: 2026-01-11 description: "在索引中执行全文搜索、聚合查询等操作" tags: ["搜索", "查询", "数据分析"] summary: "在索引中执行全文搜索、结构化查询、聚合等操作。 API # GET /_search POST /_search GET /{index}/_search POST /{index}/_search GET /_all/_search POST /_all/_search API 的作用 # 该 API 是 Easysearch 的核心搜索接口,支持: 全文搜索 结构化查询 复杂布尔查询 聚合分析 排序和分页 高亮显示 建议功能 多索引搜索 API 的参数 # 路由参数 # 参数 类型 是否必填 描述 {index} 字符串 否 索引名称。支持:单个索引、逗号分隔的多个索引、通配符表达式、_all(所有索引) Query String 参数 # 搜索控制参数 # 参数 类型 是否必填 默认值 描述 q 字符串 否 - 查询字符串(Lucene 查询语法) from 整数 否 0 从第几条结果开始 size 整数 否 10 返回结果数量 timeout 时间值 否 - 搜索超时时间 terminate_after 整数 否 0 匹配指定数量后终止 scroll 时间值 否 - 创建滚动上下文的时间 search_type 字符串 否 query_then_fetch 搜索类型 request_cache 布尔值 否 - 是否使用请求缓存 结果控制参数 # 参数 类型 是否必填 默认值 描述 explain 布尔值 否 false 是否返回评分解释 version 布尔值 否 false 是否返回文档版本号 seq_no_primary_term 布尔值 否 false 是否返回序列号和主分片信息 track_scores 布尔值 否 false 是否返回评分 track_total_hits 布尔值/整数 否 true 是否跟踪总命中数 min_score 浮点数 否 - 最小分数阈值 字段控制参数 # 参数 类型 是否必填 默认值 描述 _source 布尔值/字符串 否 true 控制返回的源字段 _source_excludes 字符串 否 - 排除的源字段 _source_includes 字符串 否 - 包含的源字段 stored_fields 字符串 否 - 返回的存储字段 docvalue_fields 字符串 否 - 返回的 docvalue 字段 fields 字符串 否 - 返回的字段 排序参数 # 参数 类型 是否必填 默认值 描述 sort 字符串 否 _score 排序字段,格式:field:asc 或 field:desc 其他参数 # 参数 类型 是否必填 默认值 描述 routing 字符串 否 - 路由值 preference 字符串 否 - 分片偏好:_local、_primary 等 allow_partial_search_results 布尔值 否 - 是否允许部分结果 batched_reduce_size 整数 否 512 批量减少大小 max_concurrent_shard_requests 整数 否 - 最大并发分片请求数 pre_filter_shard_size 整数 否 128 预过滤分片大小 ccs_minimize_roundtrips 布尔值 否 true 最小化跨集群搜索往返 请求体参数(POST) # { "query": { ." --- 在索引中执行全文搜索、结构化查询、聚合等操作。 ## API ``` GET /_search POST /_search GET /{index}/_search POST /{index}/_search GET /_all/_search POST /_all/_search ``` ## API 的作用 该 API 是 Easysearch 的核心搜索接口,支持: - 全文搜索 - 结构化查询 - 复杂布尔查询 - 聚合分析 - 排序和分页 - 高亮显示 - 建议功能 - 多索引搜索 ## API 的参数 ### 路由参数 | 参数 | 类型 | 是否必填 | 描述 | |------|------|----------|------| | `{index}` | 字符串 | 否 | 索引名称。支持:单个索引、逗号分隔的多个索引、通配符表达式、`_all`(所有索引) | ### Query String 参数 #### 搜索控制参数 | 参数 | 类型 | 是否必填 | 默认值 | 描述 | |------|------|----------|--------|------| | `q` | 字符串 | 否 | - | 查询字符串(Lucene 查询语法) | | `from` | 整数 | 否 | 0 | 从第几条结果开始 | | `size` | 整数 | 否 | 10 | 返回结果数量 | | `timeout` | 时间值 | 否 | - | 搜索超时时间 | | `terminate_after` | 整数 | 否 | 0 | 匹配指定数量后终止 | | `scroll` | 时间值 | 否 | - | 创建滚动上下文的时间 | | `search_type` | 字符串 | 否 | query_then_fetch | 搜索类型 | | `request_cache` | 布尔值 | 否 | - | 是否使用请求缓存 | #### 结果控制参数 | 参数 | 类型 | 是否必填 | 默认值 | 描述 | |------|------|----------|--------|------| | `explain` | 布尔值 | 否 | false | 是否返回评分解释 | | `version` | 布尔值 | 否 | false | 是否返回文档版本号 | | `seq_no_primary_term` | 布尔值 | 否 | false | 是否返回序列号和主分片信息 | | `track_scores` | 布尔值 | 否 | false | 是否返回评分 | | `track_total_hits` | 布尔值/整数 | 否 | true | 是否跟踪总命中数 | | `min_score` | 浮点数 | 否 | - | 最小分数阈值 | #### 字段控制参数 | 参数 | 类型 | 是否必填 | 默认值 | 描述 | |------|------|----------|--------|------| | `_source` | 布尔值/字符串 | 否 | true | 控制返回的源字段 | | `_source_excludes` | 字符串 | 否 | - | 排除的源字段 | | `_source_includes` | 字符串 | 否 | - | 包含的源字段 | | `stored_fields` | 字符串 | 否 | - | 返回的存储字段 | | `docvalue_fields` | 字符串 | 否 | - | 返回的 docvalue 字段 | | `fields` | 字符串 | 否 | - | 返回的字段 | #### 排序参数 | 参数 | 类型 | 是否必填 | 默认值 | 描述 | |------|------|----------|--------|------| | `sort` | 字符串 | 否 | _score | 排序字段,格式:`field:asc` 或 `field:desc` | #### 其他参数 | 参数 | 类型 | 是否必填 | 默认值 | 描述 | |------|------|----------|--------|------| | `routing` | 字符串 | 否 | - | 路由值 | | `preference` | 字符串 | 否 | - | 分片偏好:`_local`、`_primary` 等 | | `allow_partial_search_results` | 布尔值 | 否 | - | 是否允许部分结果 | | `batched_reduce_size` | 整数 | 否 | 512 | 批量减少大小 | | `max_concurrent_shard_requests` | 整数 | 否 | - | 最大并发分片请求数 | | `pre_filter_shard_size` | 整数 | 否 | 128 | 预过滤分片大小 | | `ccs_minimize_roundtrips` | 布尔值 | 否 | true | 最小化跨集群搜索往返 | ### 请求体参数(POST) ```json { "query": { ... }, "aggs": { ... }, "sort": [ ... ], "from": 0, "size": 10, "highlight": { ... }, "_source": [ ... ], "script_fields": { ... } } ``` ## 示例 ### 基本搜索(匹配所有) ```bash GET /my_index/_search { "query": { "match_all": {} } } ``` **响应示例:** ```json { "took": 5, "timed_out": false, "_shards": { "total": 1, "successful": 1, "skipped": 0, "failed": 0 }, "hits": { "total": { "value": 100, "relation": "eq" }, "max_score": 1.0, "hits": [ { "_index": "my_index", "_type": "_doc", "_id": "1", "_score": 1.0, "_source": { "field": "value" } } ] } } ``` ### 全文搜索 ```bash GET /my_index/_search { "query": { "match": { "title": "search engine" } } } ``` ### 使用查询字符串 ```bash GET /my_index/_search?q=title:easysearch ``` ### 分页 ```bash GET /my_index/_search { "from": 10, "size": 10, "query": { "match_all": {} } } ``` ### 排序 ```bash GET /my_index/_search { "sort": [ { "date": "desc" }, { "_score": "desc" } ], "query": { "match_all": {} } } ``` ### 字段过滤 ```bash GET /my_index/_search { "_source": ["title", "author"], "query": { "match_all": {} } } ``` ### 布尔查询 ```bash GET /my_index/_search { "query": { "bool": { "must": [ { "match": { "title": "search" } } ], "filter": [ { "term": { "status": "published" } } ], "must_not": [ { "range": { "views": { "lte": 0 } } } ] } } } ``` ### 聚合查询 ```bash GET /sales/_search { "size": 0, "aggs": { "by_category": { "terms": { "field": "category.keyword" }, "aggs": { "total_revenue": { "sum": { "field": "price" } } } } } } ``` ### 高亮显示 ```bash GET /my_index/_search { "query": { "match": { "content": "easysearch" } }, "highlight": { "fields": { "content": {} } } } ``` ### 多索引搜索 ```bash GET /index1,index2/_search { "query": { "match_all": {} } } ``` ### 使用通配符 ```bash GET /logs-*/_search { "query": { "range": { "@timestamp": { "gte": "now-1d" } } } } ``` ### 滚动搜索 ```bash GET /my_index/_search?scroll=1m { "size": 100, "query": { "match_all": {} } } ``` ### 范围查询 ```bash GET /products/_search { "query": { "range": { "price": { "gte": 10, "lte": 100 } } } } ``` ### 过滤结果 ```bash GET /my_index/_search { "post_filter": { "term": { "status": "active" } }, "query": { "match_all": {} } } ``` ### 脚本字段 ```bash GET /my_index/_search { "script_fields": { "discounted_price": { "script": { "source": "doc['price'] * params.discount", "params": { "discount": 0.9 } } } } } ``` ## 常见查询类型 | 查询类型 | 示例 | |----------|------| | `match_all` | 匹配所有文档 | | `match` | 全文搜索 | | `term` | 精确匹配 | | `terms` | 多值精确匹配 | | `range` | 范围查询 | | `bool` | 布尔组合查询 | | `wildcard` | 通配符查询 | | `prefix` | 前缀查询 | | `exists` | 字段存在查询 | | `fuzzy` | 模糊查询 | ## 使用场景 ### 场景 1:日志搜索 ```bash GET /logs-*/_search { "query": { "bool": { "must": [ { "match": { "message": "error" } } ], "filter": [ { "range": { "@timestamp": { "gte": "now-1h" } } } ] } }, "sort": [ { "@timestamp": "desc" } ] } ``` ### 场景 2:电商产品搜索 ```bash GET /products/_search { "query": { "multi_match": { "query": "laptop", "fields": ["name", "description", "brand"] } }, "post_filter": { "term": { "in_stock": true } }, "sort": [ { "popularity": "desc" } ], "aggs": { "by_brand": { "terms": { "field": "brand.keyword" } } } } ``` ### 场景 3:数据分析 ```bash GET /metrics/_search { "size": 0, "query": { "range": { "@timestamp": { "gte": "now-24h" } } }, "aggs": { "hourly": { "date_histogram": { "field": "@timestamp", "calendar_interval": "hour" }, "aggs": { "avg_value": { "avg": { "field": "value" } } } } } } ``` ## 注意事项 1. **GET vs POST**:复杂查询建议使用 POST 方法 2. **from + size 限制**:深分页性能差,建议使用 `search_after` 3. **通配符搜索**:`*` 开头的通配符查询性能较差 4. **聚合大小**:大量聚合可能占用大量内存 5. **请求缓存**:相同结构的请求会被缓存,修改参数时要小心