Elasticsearch是一款开源的全文搜索引擎,基于apache lucene。后者只是一款开源搜索引擎库,如果想直接使用lucene,这将非常复杂,而且需要了解大量检索的相关知识。
而elasticsearch使用Lucene作为核心组件,实现了所有索引和搜索的功能。并将复杂的部分隐藏封装,最终以restful api的形式展现到用户面前。同时,他也有以下几个特点
- 分布式的实时文件存储,每个字段都被索引并可被搜索
- 分布式的实时分析搜索引擎
- 可以扩展到上百台服务器,处理PB级结构化或非结构化数据
这些功能可以集成到一个服务里,并最终暴露为restful api,这很符合微服务化开发的特点。因此你可以将elasticsearch集成为你应用中的一个专用搜索服务。为其他客户端提供大数据下的快速检索服务。
接下来将介绍一些elasticsearch的基础知识。
1.面向文档
elasticsearch适合用来存储非结构化数据,例如文档类型数据(就像mongo)。文档类型的数据的特点就是非结构化,且数据的表现力非常丰富,可以具有非常复杂的数据结构。
elasticsearch存储数据的序列化格式为json,这就意味着你可以方便的使用web客户端进行交互,且json也已经基本被所有的编程语言所支持。
2.索引
类似于关系型数据库中的“数据库”的概念,用来存储数据的地方。一个文档数据想要被检索,需要先存储到elasticsearch的索引(index),而我们在关系型数据库中的“索引”(即为特定的数据列增加一个B-树,以加快列检索速度),在elasticsearch中,默认每个文档的每个属性都是被索引了的(加了一个倒排索引) 。
例如,现在插入如下数据:
PUT /megacorp/employee/1
{
"first_name" : "John",
"last_name" : "Smith",
"age" : 25,
"about" : "I love to go rock climbing",
"interests": [ "sports", "music" ]
}
执行这个命令时,无需关心这个索引或类型是否存在,elasticsearch会自动完成索引,类型的创建。如果该索引或类型已存在,则会往该类型中插入一条数据。因此命令中的索引名和类型名一定要写正确。
3.其他操作
根据restful api 风格,可以使用标准的http方法(get,post,put,delete)来操作elasticsearch的数据。
4.基本检索
elasticsearch可以直接通过http的get方法来直接检索文档,例如:
GET /megacorp/employee/1
这会返回刚刚我们存储的文档1的结构数据并且会包含一些id等元数据
我们也可以使用'_search',来添加一些简单的条件来查询数据,例如:
GET /megacorp/employee/_search
这将会查询类型employe中的所有数据
GET /megacorp/employee/_search?q=last_name:Smith
使用_query-string查询字符串,这会加入一个查询条件last_name:Smith,多个查询条件可以用+连接
更高级的检索功能将在另一篇文章里详细说明