目录
创建索引
文档的CRUD操作
执行基本查询
使用过滤器
结果排序与分页
多条件组合查询
创建索引
在Elasticsearch中,索引是存储相关数据的地方。它类似于关系型数据库中的表,但具有更强的灵活性和可扩展性。创建一个索引时,可以定义索引的设置(settings)和映射(mapping)。设置包括分片数、副本数等;而映射则定义了字段的数据类型及属性。
示例: 创建一个名为library
的新索引,并为书籍信息配置映射。
PUT /library
{"settings": {"number_of_shards": 1,"number_of_replicas": 0},"mappings": {"properties": {"title": { "type": "text" },"author": { "type": "keyword" },"publish_date": { "type": "date" },"genre": { "type": "keyword" }}}
}
文档的CRUD操作
一旦索引被创建好,接下来就可以开始对其中的文档进行增删改查操作了。
-
创建文档 (Create)
POST /library/_doc/1 {"title": "Pride and Prejudice","author": "Jane Austen","publish_date": "1813-01-28","genre": "Romance" }
-
读取文档 (Read) 可以根据ID获取特定文档。
GET /library/_doc/1
-
更新文档 (Update) 更新文档内容。
POST /library/_update/1 {"doc": {"title": "Pride and Prejudice: Annotated Edition"} }
-
删除文档 (Delete) 删除指定ID的文档。
DELETE /library/_doc/1
执行基本查询
Elasticsearch支持多种类型的查询方式,从简单的全文搜索到复杂的布尔组合都有涵盖。这里我们先看一些基础的查询示例。
-
匹配查询 (Match Query) 搜索所有标题中包含“Prejudice”的书籍。
GET /library/_search {"query": {"match": {"title": "Prejudice"}} }
-
术语查询 (Term Query) 查找作者为“Jane Austen”的所有书籍。
GET /library/_search {"query": {"term": {"author": "Jane Austen"}} }
使用过滤器
过滤器允许你基于某些条件筛选结果集,且不影响评分。这对于优化性能非常有用,特别是在处理大量数据时。
- 范围过滤 (Range Filter) 找出出版日期在19世纪的所有书籍。
GET /library/_search {"query": {"bool": {"filter": [{"range": {"publish_date": {"gte": "1800-01-01","lte": "1899-12-31"}}}]}} }
结果排序与分页
当返回大量结果时,对它们进行排序和分页是非常有用的。
-
按字段排序 根据出版日期降序排列搜索结果。
GET /library/_search {"query": {"match_all": {}},"sort": [{"publish_date": {"order": "desc"}}] }
-
分页显示 获取第2页的结果,每页显示10条记录。
GET /library/_search {"size": 10,"from": 10,"query": {"match_all": {}} }
多条件组合查询
利用布尔查询,我们可以灵活地结合多个查询条件来实现复杂逻辑。
-
布尔组合查询 (Bool Query) 查找标题含有“love”并且属于“Romance”类别的书籍。
GET /library/_search {"query": {"bool": {"must": [{ "match": { "title": "love" }},{ "term": { "genre": "Romance" }}]}} }
-
或条件查询 (Should Clause) 返回标题含有“war”或者“peace”的书籍。
GET /library/_search {"query": {"bool": {"should": [{ "match": { "title": "war" }},{ "match": { "title": "peace" }}],"minimum_should_match": 1}} }