elasticsearch

主要内容主要内容
什么是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)

一个索引可以存储超出单个结点硬件限制的大量数据。比如,一个具有10 亿文档的索引占据1TB 的磁盘空间,而任一节点都没有这样大的磁盘空间;或者单个节点的计算能力达不到期望的复杂功能的要求。这种情况下,可以将数据切分,每部分是一个单独的apachelucene索引,称为分片。每个分片可以被存储在集群的不同节点上。
       当你创建一个索引的时候,你可以指定你想要的分片的数量。每个分片本身也是一个功能完善并且独立的“索引”,这个“索引”可以被放置到集群中的任何节点上。

分片之所以重要,主要有两方面的原因:

    - 允许你水平分割/扩展你的内容容量
    - 允许你在分片(潜在地,位于多个节点上)之上进行分布式的、并行的操作,进而提高性能/吞吐量

    至于一个分片怎样分布,它的文档怎样聚合回搜索请求,是完全由Elasticsearch 管理的,对于作为用户的你来说,这些都是透明的。

在一个网络/云的环境里,失败随时都可能发生,在某个分片/节点不知怎么的就处于离线状态,或者由于任何原因消失了,这种情况下,有一个故障转移机制是非常有用并且是强烈推荐的。为此目的,Elasticsearch允许你创建分片的一份或多份拷贝,这些拷贝叫做复制分片,或者直接叫副本。

副本之所以重要,有两个主要原因:[高可用与高吞吐]
      - 在分片/节点失败的情况下,提供了高可用性。因为这个原因,注意到副本从不与原/主要(original/primary)分片置于同一节点上是非常重要的。
    - 扩展你的搜索量/吞吐量,因为搜索可以在所有的复制上并行运行

    总之,每个索引可以被分成多个分片。一个索引也可以被复制0 次(意思是没有复制)或多次。一旦复制了,每个索引就有了主分片(作为复制源的原来的分片)和复制分片(主分片的拷贝)之别。分片和复制的数量可以在索引创建的时候指定。在索引创建之后,你可以在任何时候动态地改变复制的数量,但是你事后不能改变分片的数量。

   
ž默认情况下,Elasticsearch中的每个索引被分片5 个主分片和1 个复制,这意味着,如果你的集群中至少有两个节点,你的索引将会有5 个主分片和另外5 个复制分片(1 个完全拷贝),这样的话每个索引总共就有10 个分片。
ž
构建索引

Elasticsearch使用文档的唯一标识符来计算文档应该被放到哪个分片中。索引请求发送到一个节点后,该节点会转发文档
到持有相关分片的目标节点中。

shard = hash(routing) %number_of_primary_shards


搜索

ž查询发送到Elasticsearch的其中一个节点,这时发生的是一个所谓的发散阶段。查询分布到建立过索引的所有分片上。如果它建立在5个分片和1个副本基础上,那么,这5个实体分片都会被查询(不需要同时查询分片及其副本,因为它们包含相同的数据)。每个查询的分片将只返回文档的标识符和得分。发送分散查询的节点将等待所有的分片完成它们的任务,收集结果并适当排序(在这种情况下,按得分从低到高)。
ž之后,将发送一个新的请求来生成搜索结果。然而,这次请求将只发送到那些持有响应所需文档的分片上。在大多数情况下,Elasticsearch不会把请求发送到所有的分片,而只是发送给其中的一部分。这是因为通常不需要整个查询结果,只要一部分。这一阶段被称为收集阶段(gather phase)。收集完所有文档,将建立最终响应,并返回查询结果。



安装和行安

安装java
Download zip文件
配置
Cdbin 运行./elasticsearch.bat

配置
cluster.name:skynet
node.name:es160-1
path.data:/path/to/data
http.port: 9200
discovery.zen.ping.unicast.hosts:["host1", "host2"]
discovery.zen.ping.multicast.group: 用于多播请求的群组地址, 默认224.2.2.4

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"]

}

检索文档

GEThttp://localhost:9200/blog/article/123
更新文档

POST http://localhost:9200/blog/article/123/_update

{

"script":"ctx._source.content = \"new content\""

}

删除文档
DELETEhttp://localhost:9200/blog/article/123

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

列出集群中所有的文档

GET http://localhost:9200/blog/_search?pretty&q=title:elasticsearch

            搜索blog索引中title字段包含elasticsearch一词的所有文档

高亮显示:

POST http://localhost:9200/blog/_search

{

 "query": {

   "term": {

      "title":"elasticsearch"

   }

 },

 "highlight": {

   "fields": {

      "title": {

        "pre_tags": "",

        "post_tags": ""

      }

   }

 }

}



你可能感兴趣的:(算法)