Elasticsearch 的搜索 API 是其最强大的功能之一,允许您根据各种条件高效地查找和筛选索引中的文档。以下是搜索 API 的实战指南:
1. 基本搜索请求
请求方式:GET
URL:GET /<index>/_search
请求体(JSON 格式):包含搜索查询定义和其他搜索参数。
示例:
GET /my_index/_search
{
"query": {
"match_all": {}
}
}
此示例执行了一个简单的全量搜索,返回 my_index
中的所有文档。
2. 查询结构
搜索请求的核心是 query
部分,它支持多种查询类型。以下是一些常用的查询类型:
a. 全文搜索 (Match Query)
目的:对全文字段执行模糊匹配。
示例:
{
"query": {
"match": {
"title": "example search"
}
}
}
b. 精确匹配 (Term Query)
目的:对非全文字段执行精确值匹配。
示例:
{
"query": {
"term": {
"category.keyword": "electronics"
}
}
}
c. 范围查询 (Range Query)
目的:查找在指定数值或日期范围内匹配的文档。
示例:
{
"query": {
"range": {
"price": {
"gte": 50,
"lte": 200
}
}
}
}
d. 模糊搜索与通配符查询 (Fuzzy & Wildcard Queries)
目的:执行近似匹配或模式匹配。
- Fuzzy Query 示例:
{
"query": {
"fuzzy": {
"title": {
"value": "exmpl",
"fuzziness": "AUTO"
}
}
}
}
- Wildcard Query 示例:
{
"query": {
"wildcard": {
"product_code": {
"value": "PRD*"
}
}
}
}
e. 复合查询
目的:组合多个查询,如 bool
查询(AND、OR、NOT逻辑)、constant_score
查询、dis_max
查询等。
示例(Bool Query):
{
"query": {
"bool": {
"must": [
{ "match": { "title": "example" } },
{ "range": { "price": { "gte": 100 } } }
],
"should": [
{ "match": { "description": "exclusive" } },
{ "match": { "tags": "limited edition" } }
],
"minimum_should_match": 1,
"filter": [
{ "term": { "in_stock": true } }
]
}
}
}
3. 排序 (Sorting)
通过 sort
参数指定搜索结果的排序字段和方向。
示例:
{
"query": ...,
"sort": [
{ "price": { "order": "asc" } },
{ "popularity": { "order": "desc" } }
]
}
4. 分页 (Pagination)
使用 from
和 size
参数进行分页。
示例:
{
"query": ...,
"from": 10,
"size": 20
}
5. 高亮 (Highlighting)
为搜索结果中匹配的文本片段添加高亮标记。
示例:
{
"query": ...,
"highlight": {
"fields": {
"title": {},
"description": {}
}
}
}
6. 聚合 (Aggregations)
对搜索结果进行统计分析和数据分组。
示例(Terms Aggregation):
{
"query": ...,
"aggs": {
"categories": {
"terms": {
"field": "category.keyword"
}
}
}
}
7. 脚本字段 (Script Fields)
计算动态值并在搜索结果中返回。
示例:
{
"query": ...,
"script_fields": {
"discounted_price": {
"script": {
"source": "doc['price'].value * params.discount",
"params": {
"discount": 0.9
}
}
}
}
}
8. 实时性与一致性
-
刷新 (Refresh):通过在URL中添加
?refresh=true
参数,确保搜索结果包含最近的索引更改。 -
一致性控制:使用
search_type
参数(如query_then_fetch
、dfs_query_then_fetch
)控制搜索的一致性级别。
9. 搜索模板 (Search Templates)
预定义查询模板,使用变量和条件逻辑简化复杂查询的构建。
10. 跨索引搜索与别名
-
跨索引搜索:在URL中指定多个索引,如
GET /index1,index2/_search
。 -
别名:使用别名代替索引名进行搜索,便于管理索引集合和路由。
实战中,根据实际需求灵活组合以上搜索特性,构建复杂而精准的查询语句,以高效地从Elasticsearch中检索所需数据。同时,关注性能指标,如查询速度、内存使用和磁盘I/O,适时调整查询复杂性和索引设置以优化搜索性能。