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