到下面的结构
我们要寻找既包含字符串“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.4PUT 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/123GET 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": "<strong>",
"post_tags": "</strong>"
}
}
}
}