Elasticsearch 是一个强大的搜索引擎,支持丰富的查询语法,能够满足各种复杂的搜索需求。
基础搜索语法
简单搜索
最简单的搜索方式是直接在指定的索引中搜索包含特定关键字的文档。
GET /my_index/_search
{
"query": {
"match": {
"content": "Elasticsearch"
}
}
}
以上查询会在 my_index 索引中搜索 content 字段中包含 "Elasticsearch" 的文档。
匹配所有文档
如果你想匹配索引中的所有文档,可以使用 match_all 查询。
GET /my_index/_search
{
"query": {
"match_all": {}
}
}
这个查询会返回 my_index 中的所有文档。
精确匹配 (Term Query)
精确查询用于精确匹配指定字段的内容,适用于关键词搜索。
GET /my_index/_search
{
"query": {
"term": {
"status": "active"
}
}
}
该查询会返回 status 字段值为 active 的文档。
组合查询
布尔查询 (Bool Query)
布尔查询允许将多个查询组合在一起。它支持 must、should、must_not 和 filter 子句,分别对应 AND、OR、NOT 和过滤条件。
GET /my_index/_search
{
"query": {
"bool": {
"must": [
{ "match": { "content": "Elasticsearch" } },
{ "term": { "status": "active" } }
],
"filter": [
{ "range": { "date": { "gte": "2024-01-01" } } }
]
}
}
}
此查询会返回满足以下条件的文档:
-
content 字段包含 "Elasticsearch"。
-
status 字段为 active。
-
date 字段大于等于 "2024-01-01"。
范围查询 (Range Query)
范围查询允许你搜索数值、日期或其他可比较字段的范围内的值。
GET /my_index/_search
{
"query": {
"range": {
"price": {
"gte": 100,
"lte": 200
}
}
}
}
这个查询会返回 price 字段值在 100 到 200 之间的文档。
多字段查询
多字段匹配 (Multi-Match Query)
多字段查询用于在多个字段中搜索相同的关键词。
GET /my_index/_search
{
"query": {
"multi_match": {
"query": "Elasticsearch",
"fields": ["title", "content"]
}
}
}
这个查询会在 title 和 content 字段中搜索 "Elasticsearch"。
字段存在查询 (Exists Query)
存在查询用于查找某个字段存在的文档。
GET /my_index/_search
{
"query": {
"exists": {
"field": "user"
}
}
}
这个查询会返回所有 user 字段存在的文档。
排序与分页
排序 (Sort)
你可以根据一个或多个字段对搜索结果进行排序。
GET /my_index/_search
{
"sort": [
{ "date": { "order": "desc" } },
{ "price": { "order": "asc" } }
],
"query": {
"match_all": {}
}
}
此查询会先按 date 字段降序排序,再按 price 字段升序排序。
分页 (Pagination)
分页可以通过 from 和 size 参数来实现。
GET /my_index/_search
{
"from": 10,
"size": 5,
"query": {
"match_all": {}
}
}
这个查询会跳过前 10 条记录,并返回接下来的 5 条记录。
高级搜索
嵌套查询 (Nested Query)
如果文档中包含嵌套对象或数组,nested 查询可以用于对嵌套字段进行搜索。
GET /my_index/_search
{
"query": {
"nested": {
"path": "comments",
"query": {
"bool": {
"must": [
{ "match": { "comments.author": "John" } },
{ "range": { "comments.date": { "gte": "2024-01-01" } } }
]
}
}
}
}
}
此查询会返回 comments 数组中包含 author 为 John 且 date 在 "2024-01-01" 之后的文档。
高亮显示 (Highlighting)
highlight 用于在搜索结果中突出显示匹配的关键词。
GET /my_index/_search
{
"query": {
"match": { "content": "Elasticsearch" }
},
"highlight": {
"fields": {
"content": {}
}
}
}
该查询会在搜索结果中高亮显示 content 字段中匹配到的 "Elasticsearch" 关键词。
以上是一些Elasticsearch的基础搜索语法示例,这些语法能够帮助进行有效的数据查询。根据实际业务需求,可以进一步组合这些查询来实现更复杂的搜索功能。