什么是Elasticsearch
ES的基本概念和原理
安装和配置
Rest api
定义
ElasticSearch是一个开源的基于Lucene构建的,分布式的,RESTful搜索引擎。
Lucene 是一个基于 Java 的全文信息检索工具包,它不是一个完整的搜索应用程序,而是为你的应用程序提供索引和搜索功能。Lucene 目前是 Apache Jakarta 家族中的一个开源项目。也是目前最为流行的基于 Java 开源全文检索工具包。
Lucene只是一个java库,想要使用它,你必须使用Java来作为开发语言并将其直接集成到你的应用中。更糟糕的是,Lucene非常复杂,你需要深入了解检索的相关知识来理解它是如何工作的。
Elasticsearch也使用Java开发并使用Lucene作为其核心来实现所有索引和搜索的功能,但是它的目的是通过简单的 RESTful API 来隐藏Lucene的复杂性,从而让全文搜索变得简单。
分布式:
分布式的实时文件存储,每个字段都被索引并可被搜索
可以扩展到上百台服务器,处理PB级的数据量
应用实例
GitHub 使用Elasticsearch搜索20TB数据,包括13亿文件和1300亿行代码。
维基百科使用 Elasticsearch 来进行全文搜索并高亮显示关键词,以及提供search-as-you-type、did-you-mean等搜索建议功能
基本概念
准实时(NRT)
集群和节点
文档
索引
分片和副本
准实时(NRT)
Elasticsearch 是一个准实时的搜索平台。这意味着,从索引一个文档直到这个文档能够被搜索到有一个轻微的延迟(通常是1 秒)。
集群和节点
Elasticsearch可以作为一个独立的单个搜索服务器。不过,可以运行在许多互相合作为了能够处理大型数据集,实现容错和高可用性,Elasticsearch的服务器上。这些服务器称为集群(cluster),形成集群的每个服务器称为节点(node)
集群名称默认为:elasticsearch,节点名称没有设置则由es产生。
文档(document)
存储在Elasticsearch中的主要实体叫文档(document)。
JSON格式
例:
{
"id": "1",
"title": "New version of Elasticsearch released!",
"content": "Version 1.0 released today!",
"tags": ["announce", "elasticsearch", "release"]
}
唯一标识符 索引/类型/唯一标识符
文档类型
在Elasticsearch中,一个索引对象可以存储很多不同类型的文档。
每一个类型都拥有自己的映射(mapping)或者结构定义,它们定义了当前类型下的数据结构。
索引index(正排索引和倒排索引)
由于从字符串到文件的映射是文件到字符
串映射的反向过程,于是保存这种信息的
索引称为倒排索引
假设我的文档集合里面有100篇文档,为了
方便表示,我们为文档编号从1到100,得
到下面的结构
我们要寻找既包含字符串“lucene”又包含
字符串“solr”的文档,我们只需要以下几
步:
1. 取出包含字符串“lucene”的文档链表。
2. 取出包含字符串“solr”的文档链表。
3. 通过合并链表,找出既包含“lucene”又
包含“solr”的文件。
分片和副本(shards & replicas)
当你创建一个索引的时候,你可以指定你想要的分片的数量。每个分片本身也是一个功能完善并且独立的“索引”,这个“索引”可以被放置到集群中的任何节点上。
分片之所以重要,主要有两方面的原因:
- 允许你水平分割/扩展你的内容容量
- 允许你在分片(潜在地,位于多个节点上)之上进行分布式的、并行的操作,进而提高性能/吞吐量
至于一个分片怎样分布,它的文档怎样聚合回搜索请求,是完全由Elasticsearch 管理的,对于作为用户的你来说,这些都是透明的。
副本之所以重要,有两个主要原因:[高可用与高吞吐]
- 在分片/节点失败的情况下,提供了高可用性。因为这个原因,注意到副本从不与原/主要(original/primary)分片置于同一节点上是非常重要的。
- 扩展你的搜索量/吞吐量,因为搜索可以在所有的复制上并行运行
总之,每个索引可以被分成多个分片。一个索引也可以被复制0 次(意思是没有复制)或多次。一旦复制了,每个索引就有了主分片(作为复制源的原来的分片)和复制分片(主分片的拷贝)之别。分片和复制的数量可以在索引创建的时候指定。在索引创建之后,你可以在任何时候动态地改变复制的数量,但是你事后不能改变分片的数量。
Elasticsearch使用文档的唯一标识符来计算文档应该被放到哪个分片中。索引请求发送到一个节点后,该节点会转发文档
到持有相关分片的目标节点中。
shard = hash(routing) %number_of_primary_shards
搜索
安装和行安
PUT http://localhost:9200/blog/article/123
{
"id":"1",
"title":"New version of released!",
"content":"Version 1.0 released today!",
"author": “李意文",
"priority":10,
"tags":["announce", ", "release"]
}
检索文档
{
"script":"ctx._source.content = \"new content\""
}
删除文档GET http://localhost:9200/blog/_mapping?pretty
获取索引下的所有类型
GET http://localhost:9200/_cat/indices?v
列出所有的索引
GET http://localhost:9200/blog/_search?pretty
列出索引blog下的所有文档
GET http://localhost:9200/blog/article/_search?pretty
列出索引blog下article类型所有文档
GET http://localhost:9200/_search?pretty
列出集群中所有的文档
搜索blog索引中title字段包含elasticsearch一词的所有文档
高亮显示:
POST http://localhost:9200/blog/_search
{
"query": {
"term": {
"title":"elasticsearch"
}
},
"highlight": {
"fields": {
"title": {
"pre_tags": "<strong>",
"post_tags": "</strong>"
}
}
}
}