墨墨导读:之前我们分享了ElasticSearch最全详细使用教程:入门、索引管理、映射详解,本文详细介绍ElasticSearch的索引别名、分词器、文档管理、路由、搜索详解。

一、索引别名





1. 别名的用途

如果希望一次查询可查询多个索引。
如果希望通过索引的视图来操作索引,就像数据库库中的视图一样。
索引的别名机制,就是让我们可以以视图的方式来操作集群中的索引,这个视图可是多个索引,也可是一个索引或索引的一部分。
 
2. 新建索引时定义别名

 PUT /logs_20162801    {        "mappings" : {            "type" : {                "properties" : {                    "year" : {"type" : "integer"}                }            }        },        <!-- 定义了两个别名 -->        "aliases" : {            "current_day" : {},            "2016" : {                "filter" : {                    "term" : {"year" : 2016 }                }            }        }    }


3. 创建别名     /_aliases

为索引test1创建别名alias1

 POST /_aliases  {   "actions" : [ { "add" : { "index" : "test1", "alias" : "alias1" } } ]   }

 4. 删除别名

  POST /_aliases {   "actions" : [ { "remove" : { "index" : "test1", "alias" : "alias1" } }  ]   }

还可以这样写

DELETE /{index}/_alias/{name}

5. 批量操作别名

删除索引test1的别名alias1,同时为索引test2添加别名alias1

    POST /_aliases   {   "actions" : [ { "remove" : { "index" : "test1", "alias" : "alias1" } }, { "add" : { "index" : "test2", "alias" : "alias1" } } ]   }

6. 为多个索引定义一样的别名

方式1:

  POST /_aliases   {   "actions" : [ { "add" : { "index" : "test1", "alias" : "alias1" } },    { "add" : { "index" : "test2", "alias" : "alias1" } } ]   }

方式2:

    POST /_aliases  {   "actions" : [ { "add" : { "indices" : ["test1", "test2"], "alias" : "alias1" } }  ]   }

注意:只可通过多索引别名进行搜索,不可进行文档索引和根据id获取文档。

方式3:通过统配符*模式来指定要别名的索引

    POST /_aliases    {   "actions" : [ { "add" : { "index" : "test*", "alias" : "all_test_indices" } }   ]   }

注意:在这种情况下,别名是一个点时间别名,它将对所有匹配的当前索引进行别名,当添加/删除与此模式匹配的新索引时,它不会自动更新。

7. 带过滤器的别名

索引中需要有字段

 PUT /test1  {   "mappings": { "type1": {    "properties": {   "user" : {    "type": "keyword"   }   }   }   }   }

过滤器通过Query DSL来定义,将作用于通过该别名来进行的所有Search, Count,

Delete By Query and More Like This 操作。   POST /_aliases  {   "actions" : [ {   "add" : { "index" : "test1",  "alias" : "alias2", "filter" : { "term" : { "user" : "kimchy" } }   }   }   ]   }

8. 带routing的别名

可在别名定义中指定路由值,可和filter一起使用,用来限定操作的分片,避免不需要的其他分片操作。

 POST /_aliases    {   "actions" : [ {   "add" : { "index" : "test",   "alias" : "alias1", "routing" : "1" }   }   ]   }

为搜索、索引指定不同的路由值

  POST /_aliases    {   "actions" : [ {   "add" : { "index" : "test",   "alias" : "alias2", "search_routing" : "1,2",   "index_routing" : "2"   }   }   ]   }

9. 以PUT方式来定义一个别名

    PUT /{index}/_alias/{name}  PUT /logs_201305/_alias/2013

带filter 和 routing

 PUT /users    {   "mappings" : {    "user" : {    "properties" : {  "user_id" : {"type" : "integer"}  }   }   }   }   PUT /users/_alias/user_12   {   "routing" : "12",   "filter" : {  "term" : {    "user_id" : 12    }   }   }

10. 查看别名定义信息

    GET /{index}/_alias/{alias} GET /logs_20162801/_alias/* GET /_alias/2016    GET /_alias/20*

二、分词器


1. 认识分词器

1.1 Analyzer分析器
在ES中一个Analyzer 由下面三种组件组合而成:
character filter :字符过滤器,对文本进行字符过滤处理,如处理文本中的html标签字符。处理完后再交给tokenizer进行分词。一个analyzer中可包含0个或多个字符过滤器,多个按配置顺序依次进行处理。
tokenizer:分词器,对文本进行分词。一个analyzer必需且只可包含一个tokenizer。
token filter:词项过滤器,对tokenizer分出的词进行过滤处理。如转小写、停用词处理、同义词处理。一个analyzer可包含0个或多个词项过滤器,按配置顺序进行过滤。

1.2 如何测试分词器

  POST _analyze    {   "analyzer": "whitespace",   "text":     "The quick brown fox."  }   POST _analyze   {   "tokenizer": "standard",    "filter":  [ "lowercase", "asciifolding" ],   "text":      "Is this déja vu?" }


position:第几个词

offset:词的偏移位置

2. 内建的character filter

HTML Strip Character Filter
  html_strip :过滤html标签,解码HTML entities like &amp;.
Mapping Character Filter
  mapping :用指定的字符串替换文本中的某字符串。
Pattern Replace Character Filter
  pattern_replace :进行正则表达式替换。

2.1 HTML Strip Character Filter

 POST _analyze    {   "tokenizer":      "keyword",    "char_filter":  [ "html_strip" ],   "text": "<p>I&apos;m so <b>happy</b>!</p>"  }

 
 在索引中配置:

    PUT my_index  {   "settings": { "analysis": { "analyzer": { "my_analyzer": {  "tokenizer": "keyword", "char_filter": ["my_char_filter"]   }   },  "char_filter": {  "my_char_filter": {   "type": "html_strip",   "escaped_tags": ["b"]   }   }   }   }   }

escaped_tags 用来指定例外的标签。如果没有例外标签需配置,则不需要在此进行客户化定义,在上面的my_analyzer中直接使用 html_strip

测试:

 POST my_index/_analyze {   "analyzer": "my_analyzer",  "text": "<p>I&apos;m so <b>happy</b>!</p>"  }

2.2 Mapping character filter

官网链接:https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-mapping-charfilter.html

PUT my_index    {   "settings": { "analysis": { "analyzer": { "my_analyzer": {  "tokenizer": "keyword", "char_filter": [  "my_char_filter"  ]   }   },  "char_filter": {  "my_char_filter": {   "type": "mapping",  "mappings": [ "٠ => 0", "١ => 1", "٢ => 2", "٣ => 3", "٤ => 4", "٥ => 5", "٦ => 6", "٧ => 7", "٨ => 8", "٩ => 9"  ]   }   }   }   }   }

测试

 POST my_index/_analyze  {   "analyzer": "my_analyzer",  "text": "My license plate is ٢٥٠١٥" }

2.3 Pattern Replace Character Filter

官网链接:https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-pattern-replace-charfilter.html

 PUT my_index {   "settings": { "analysis": { "analyzer": { "my_analyzer": {  "tokenizer": "standard",    "char_filter": [  "my_char_filter"  ]   }   },  "char_filter": {  "my_char_filter": {   "type": "pattern_replace",  "pattern": "(\\d+)-(?=\\d)",  "replacement": "$1_"    }   }   }   }   }

测试

   POST my_index/_analyze    {   "analyzer": "my_analyzer",  "text": "My credit card is 123-456-789" }


3. 内建的Tokenizer

官网链接:https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-tokenizers.html

 Standard Tokenizer  Letter Tokenizer    Lowercase Tokenizer Whitespace Tokenizer    UAX URL Email Tokenizer Classic Tokenizer   Thai Tokenizer  NGram Tokenizer Edge NGram Tokenizer    Keyword Tokenizer   Pattern Tokenizer   Simple Pattern Tokenizer    Simple Pattern Split Tokenizer  Path Hierarchy Tokenizer

前面集成的中文分词器Ikanalyzer中提供的tokenizer:ik_smart 、 ik_max_word

测试tokenizer

  POST _analyze    {   "tokenizer":      "standard",   "text": "张三说的确实在理"  }   POST _analyze   {   "tokenizer":      "ik_smart",   "text": "张三说的确实在理"  }

4.  内建的Token Filter

ES中内建了很多Token filter ,详细了解:https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-tokenizers.html

Lowercase Token Filter :lowercase 转小写
    Stop Token Filter :stop 停用词过滤器
    Synonym Token Filter:synonym 同义词过滤器

说明:中文分词器Ikanalyzer中自带有停用词过滤功能。

4.1 Synonym Token Filter 同义词过滤器

PUT /test_index    {   "settings": { "index" : {   "analysis" : {    "analyzer" : {    "my_ik_synonym" : {   "tokenizer" : "ik_smart",   "filter" : ["synonym"]  }   },  "filter" : {  "synonym" : { "type" : "synonym", <!-- synonyms_path:指定同义词文件(相对config的位置)-->   "synonyms_path" : "analysis/synonym.txt"    }   }   }   }   }   }

同义词定义格式

ES同义词格式支持 solr、 WordNet 两种格式。

在analysis/synonym.txt中用solr格式定义如下同义词

张三,李四
    电饭煲,电饭锅 => 电饭煲
    电脑 => 计算机,computer

注意:

文件一定要UTF-8编码

一行一类同义词,=> 表示标准化为

测试:通过例子的结果了解同义词的处理行为

   POST test_index/_analyze {   "analyzer": "my_ik_synonym",    "text": "张三说的确实在理"  }   POST test_index/_analyze    {   "analyzer": "my_ik_synonym",    "text": "我想买个电饭锅和一个电脑"  }

5. 内建的Analyzer

官网链接:https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-analyzers.html

 Standard Analyzer Simple Analyzer Whitespace Analyzer Stop Analyzer   Keyword Analyzer    Pattern Analyzer    Language Analyzers  Fingerprint Analyzer

集成的中文分词器Ikanalyzer中提供的Analyzer:ik_smart 、 ik_max_word

内建的和集成的analyzer可以直接使用。如果它们不能满足我们的需要,则我们可自己组合字符过滤器、分词器、词项过滤器来定义自定义的analyzer

5.1 自定义 Analyzer

配置参数:

PUT my_index8   {   "settings": { "analysis": { "analyzer": { "my_ik_analyzer": {   "type": "custom",   "tokenizer": "ik_smart",    "char_filter": [  "html_strip"  ],  "filter": [   "synonym" ]   }   },  "filter": {   "synonym": {  "type": "synonym",  "synonyms_path": "analysis/synonym.txt" }   }    }  }}

5.2 为字段指定分词器

  PUT my_index8/_mapping/_doc {   "properties": {   "title": {    "type": "text", "analyzer": "my_ik_analyzer"    }   }   }

如果该字段的查询需要使用不同的analyzer

PUT my_index8/_mapping/_doc {   "properties": {   "title": {    "type": "text", "analyzer": "my_ik_analyzer",   "search_analyzer": "other_analyzer" }   }   }

测试结果

PUT my_index8/_doc/1    {   "title": "张三说的确实在理" }   GET /my_index8/_search  {   "query": {    "term": { "title": "张三"   }   }   }

5.3 为索引定义个default分词器

    PUT /my_index10  {   "settings": { "analysis": { "analyzer": { "default": {  "tokenizer": "ik_smart",    "filter": [   "synonym" ]   }   },  "filter": {   "synonym": {  "type": "synonym",  "synonyms_path": "analysis/synonym.txt" }   }   }   },  "mappings": { "_doc": { "properties": {   "title": {    "type": "text"  }   }   }   }   }

测试结果:

  PUT my_index10/_doc/1    {   "title": "张三说的确实在理" }   GET /my_index10/_search {   "query": {    "term": { "title": "张三"   }   }   }

6. Analyzer的使用顺序

我们可以为每个查询、每个字段、每个索引指定分词器。

在索引阶段ES将按如下顺序来选用分词:

首先选用字段mapping定义中指定的analyzer
字段定义中没有指定analyzer,则选用 index settings中定义的名字为default 的analyzer。
如index setting中没有定义default分词器,则使用 standard analyzer.

查询阶段ES将按如下顺序来选用分词:

The analyzer defined in a full-text query.
The search_analyzer defined in the field mapping.
The analyzer defined in the field mapping.
An analyzer named default_search in the index settings.
An analyzer named default in the index settings.
The standard analyzer.


三、文档管理




1. 新建文档

指定文档id,新增/修改

 PUT twitter/_doc/1   {   "id": 1,  "user" : "kimchy",  "post_date" : "2009-11-15T14:12:12",    "message" : "trying out Elasticsearch"  }

新增,自动生成文档id

  POST twitter/_doc/    {   "id": 1,  "user" : "kimchy",  "post_date" : "2009-11-15T14:12:12",    "message" : "trying out Elasticsearch"  }

返回结果说明:

2. 获取单个文档

 HEAD twitter/_doc/11 GET twitter/_doc/1

不获取文档的source:

 GET twitter/_doc/1?_source=false

获取文档的source:

GET twitter/_doc/1/_source  {   "_index": "twitter",    "_type": "_doc",    "_id": "1", "_version": 2,    "found": true,    "_source": {  "id": 1,  "user": "kimchy",   "post_date": "2009-11-15T14:12:12", "message": "trying out Elasticsearch"   }}

获取存储字段

  PUT twitter11 {   "mappings": { "_doc": { "properties": {   "counter": {  "type": "integer",  "store": false    },  "tags": { "type": "keyword",  "store": true } }   }  }} PUT twitter11/_doc/1    {   "counter" : 1,    "tags" : ["red"]    }   GET twitter11/_doc/1?stored_fields=tags,counter


3. 获取多个文档 _mget

方式1:

GET /_mget {   "docs" : [    {   "_index" : "twitter",   "_type" : "_doc",   "_id" : "1" },  {   "_index" : "twitter",   "_type" : "_doc",   "_id" : "2" "stored_fields" : ["field3", "field4"]    }   ]   }

方式2:

GET /twitter/_mget   {   "docs" : [    {   "_type" : "_doc",   "_id" : "1" },  {   "_type" : "_doc",   "_id" : "2" }   ]   }

方式3:

GET /twitter/_doc/_mget    {   "docs" : [    {   "_id" : "1" },  {   "_id" : "2" }   ]   }

方式4:

GET /twitter/_doc/_mget {   "ids" : ["1", "2"]    }

4. 删除文档

指定文档id进行删除

DELETE twitter/_doc/1

用版本来控制删除

DELETE twitter/_doc/1?version=1

返回结果:

{    "_shards" : { "total" : 2,  "failed" : 0, "successful" : 2  },  "_index" : "twitter",   "_type" : "_doc",   "_id" : "1",    "_version" : 2,   "_primary_term": 1,   "_seq_no": 5, "result": "deleted" }

查询删除

 POST twitter/_delete_by_query    {   "query": {    "match": {    "message": "some message"   }   }   }

当有文档有版本冲突时,不放弃删除操作(记录冲突的文档,继续删除其他复合查询的文档)

    POST twitter/_doc/_delete_by_query?conflicts=proceed  {   "query": {    "match_all": {}   }   }

通过task api 来查看 查询删除任务

GET _tasks?detailed=true&actions=*/delete/byquery

查询具体任务的状态

GET /_tasks/taskId:1

取消任务

POST _tasks/task_id:1/_cancel

5. 更新文档

指定文档id进行修改

    PUT twitter/_doc/1  {   "id": 1,  "user" : "kimchy",  "post_date" : "2009-11-15T14:12:12",    "message" : "trying out Elasticsearch"  }

乐观锁并发更新控制

   PUT twitter/_doc/1?version=1 {   "id": 1,  "user" : "kimchy",  "post_date" : "2009-11-15T14:12:12",    "message" : "trying out Elasticsearch"  }

返回结果

   { "_index": "twitter",    "_type": "_doc",    "_id": "1", "_version": 3,    "result": "updated",    "_shards": {  "total": 3,   "successful": 1,  "failed": 0   },  "_seq_no": 2, "_primary_term": 3    }

6. Scripted update 通过脚本来更新文档

6.1 准备一个文档

PUT uptest/_doc/1    {   "counter" : 1,    "tags" : ["red"]    }

6.2 对文档1的counter + 4

   POST uptest/_doc/1/_update  {   "script" : {  "source": "ctx._source.counter += params.count",  "lang": "painless", "params" : {  "count" : 4   }   }   }

6.3 往数组中加入元素

    POST uptest/_doc/1/_update    {   "script" : {  "source": "ctx._source.tags.add(params.tag)",   "lang": "painless", "params" : {  "tag" : "blue"  }   }   }

脚本说明:painless是es内置的一种脚本语言,ctx执行上下文对象(通过它还可访问_index, _type, _id, _version, _routing and _now (the current timestamp) ),params是参数集合

说明:脚本更新要求索引的_source 字段是启用的。更新执行流程:
a、获取到原文档
b、通过_source字段的原始数据,执行脚本修改。
c、删除原索引文档
d、索引修改后的文档
它只是降低了一些网络往返,并减少了get和索引之间版本冲突的可能性。

6.4 添加一个字段

   POST uptest/_doc/1/_update    {   "script" : "ctx._source.new_field = 'value_of_new_field'"    }

6.5 移除一个字段

 POST uptest/_doc/1/_update   {   "script" : "ctx._source.remove('new_field')"  }

6.6 判断删除或不做什么

  POST uptest/_doc/1/_update  {   "script" : {  "source": "if (ctx._source.tags.contains(params.tag)) { ctx.op = 'delete' } else { ctx.op = 'none' }",    "lang": "painless", "params" : {  "tag" : "green" }   }   }

6.7 合并传人的文档字段进行更新

    POST uptest/_doc/1/_update {   "doc" : { "name" : "new_name" }   }

6.8 再次执行7,更新内容相同,不需做什么

 { "_index": "uptest", "_type": "_doc",    "_id": "1", "_version": 4,    "result": "noop",   "_shards": {  "total": 0,   "successful": 0,  "failed": 0   }   }

6.9 设置不做noop检测

   POST uptest/_doc/1/_update    {   "doc" : { "name" : "new_name" },  "detect_noop": false  }

什么是noop检测?

即已经执行过的脚本不再执行

6.10 upsert 操作:如果要更新的文档存在,则执行脚本进行更新,如不存在,则把 upsert中的内容作为一个新文档写入。

   POST uptest/_doc/1/_update    {   "script" : {  "source": "ctx._source.counter += params.count",  "lang": "painless", "params" : {  "count" : 4   }   },  "upsert" : {  "counter" : 1 }   }

7. 通过条件查询来更新文档

满足查询条件的才更新

  POST twitter/_update_by_query   {   "script": {   "source": "ctx._source.likes++",  "lang": "painless"  },  "query": {    "term": { "user": "kimchy"    }   }   }

8. 批量操作

批量操作API /_bulk 让我们可以在一次调用中执行多个索引、删除操作。这可以大大提高索引数据的速度。批量操作内容体需按如下以新行分割的json结构格式给出:

语法:

action_and_meta_data\n
optional_source\n
action_and_meta_data\n
optional_source\n
....
action_and_meta_data\n
optional_source\n

说明:
action_and_meta_data: action可以是 index, create, delete and update ,meta_data 指: _index ,_type,_id 请求端点可以是: /_bulk, /{index}/_bulk, {index}/{type}/_bulk

示例:

 POST _bulk  { "index" : { "_index" : "test", "_type" : "_doc", "_id" : "1" } }    { "field1" : "value1" } { "delete" : { "_index" : "test", "_type" : "_doc", "_id" : "2" } }   { "create" : { "_index" : "test", "_type" : "_doc", "_id" : "3" } }   { "field1" : "value3" } { "update" : {"_id" : "1", "_type" : "_doc", "_index" : "test"} } { "doc" : {"field2" : "value2"} }

8.1 curl + json 文件 批量索引多个文档

注意:accounts.json要放在执行curl命令的同等级目录下,后续学习的测试数据基本都使用这份银行的数据了
curl -H "Content-Type: application/json" -XPOST "localhost:9200/bank/_doc/_bulk?pretty&refresh" --data-binary "@accounts.json"

9. reindex 重索引

Reindex API /_reindex 让我们可以将一个索引中的数据重索引到另一个索引中(拷贝),要求源索引的_source 是开启的。目标索引的setting 、mapping 信息与源索引无关。

什么时候需要重索引?

即当需要做数据的拷贝的时候

POST _reindex   {   "source": {   "index": "twitter"  },  "dest": { "index": "new_twitter"  }   }

重索引要考虑的一个问题:目标索引中存在源索引中的数据,这些数据的version如何处理。

1. 如果没有指定version_type 或指定为 internal,则会是采用目标索引中的版本,重索引过程中,执行的就是新增、更新操作。

    POST _reindex  {   "source": {   "index": "twitter"  },  "dest": { "index": "new_twitter", "version_type": "internal"  }   }

2. 如果想使用源索引中的版本来进行版本控制更新,则设置 version_type 为extenal。重索引操作将写入不存在的,更新旧版本的数据。

 POST _reindex   {   "source": {   "index": "twitter"  },  "dest": { "index": "new_twitter", "version_type": "external"  }   }

如果你只想从源索引中复制目标索引中不存在的文档数据,可以指定 op_type 为 create 。此时存在的文档将触发 版本冲突(会导致放弃操作),可设置“conflicts”: “proceed“,跳过继续

 POST _reindex   {   "conflicts": "proceed", "source": {   "index": "twitter"  },  "dest": { "index": "new_twitter", "op_type": "create" }   }

你也可以只索引源索引的一部分数据,通过 type 或 查询来指定你需要的数据

    POST _reindex   {   "source": {   "index": "twitter", "type": "_doc", "query": {    "term": { "user": "kimchy"    }   }   },  "dest": { "index": "new_twitter"  }   }

可以从多个源获取数据

 POST _reindex    {   "source": {   "index": ["twitter", "blog"], "type": ["_doc", "post"]  },  "dest": { "index": "all_together" }   }

可以限定文档数量

    POST _reindex  {   "size": 10000,    "source": {   "index": "twitter", "sort": { "date": "desc" }    },  "dest": { "index": "new_twitter"  }   }

可以选择复制源文档的哪些字段

  POST _reindex {   "source": {   "index": "twitter", "_source": ["user", "_doc"]   },  "dest": { "index": "new_twitter"  }   }

可以用script来改变文档

   POST _reindex    {   "source": {   "index": "twitter"  },  "dest": { "index": "new_twitter", "version_type": "external"  },  "script": {   "source": "if (ctx._source.foo == 'bar') {ctx._version++; ctx._source.remove('foo')}",  "lang": "painless"  }   }

可以指定路由值把文档放到哪个分片上

POST _reindex  {   "source": {   "index": "source",  "query": {    "match": {    "company": "cat"    }   }   },  "dest": { "index": "dest",    "routing": "=cat"  }   }

从远程源复制

 POST _reindex   {   "source": {   "remote": {   "host": "http://otherhost:9200",    "username": "user", "password": "pass"  },  "index": "source",  "query": {    "match": {    "test": "data"  }   }   },  "dest": { "index": "dest" }   }

通过_task 来查询执行状态

GET _tasks?detailed=true&actions=*reindex

10. refresh

对于索引、更新、删除操作如果想操作完后立马重刷新可见,可带上refresh参数

    PUT /test/_doc/1?refresh {"test": "test"}    PUT /test/_doc/2?refresh=true  {"test": "test"}

refresh 可选值说明

未给值或=true,则立马会重刷新读索引。
=false ,相当于没带refresh 参数,遵循内部的定时刷新。
=wait_for ,登记等待刷新,当登记的请求数达到index.max_refresh_listeners 参数设定的值时(defaults to 1000),将触发重刷新。

四、路由详解


1. 集群组成

第一个节点启动

说明:首先启动的一定是主节点,主节点存储的是集群的元数据信息

Node2启动

说明:

Node2节点启动之前会配置集群的名称Cluster-name:ess,然后配置可以作为主节点的ip地址信息discovery.zen.ping.unicast.hosts: [“10.0.1.11",“10.0.1.12"],配置自己的ip地址networ.host: 10.0.1.12;

Node2启动的过程中会去找到主节点Node1告诉Node1我要加入到集群里面了,主节点Node1接收到请求以后看Node2是否满足加入集群的条件,如果满足就把node2的ip地址加入的元信息里面,然后广播给集群中的其他节点有

新节点加入,并把最新的元信息发送给其他的节点去更新

Node3..NodeN加入

说明:集群中的所有节点的元信息都是和主节点一致的,因为一旦有新的节点加入进来,主节点会通知其他的节点同步元信息

2. 在集群中创建索引的流程


3. 有索引的集群

4. 集群有节点出现故障,如主节点挂了,会重新选择主节点

5. 在集群中索引文档

索引文档的步骤:

1. node2计算文档的路由值得到文档存放的分片(假定路由选定的是分片0)。
2. 将文档转发给分片0(P0)的主分片节点 node1。
3. node1索引文档,同步给副本(R0)节点node3索引文档。
4. node1向node2反馈结果
5. node2作出响应
6. 文档是如何路由的

文档该存到哪个分片上?
决定文档存放到哪个分片上就是文档路由。ES中通过下面的计算得到每个文档的存放分片:

shard = hash(routing) % number_of_primary_shards

参数说明:

routing 是用来进行hash计算的路由值,默认是使用文档id值。我们可以在索引文档时通过routing参数指定别的路由值

number_of_primary_shards:创建索引时指定的主分片数

  POST twitter/_doc?routing=kimchy   {   "user" : "kimchy",  "post_date" : "2009-11-15T14:12:12",    "message" : "trying out Elasticsearch"  }

在索引、删除、更新、查询中都可以使用routing参数(可多值)指定操作的分片。

创建索引时强制要求给定路由值:

  PUT my_index2 {   "mappings": { "_doc": { "_routing": { "required": true  }   }   }   }

7. 在集群中进行搜索

搜索的步骤:如要搜索 索引 s0

1. node2解析查询。
2. node2将查询发给索引s0的分片/副本(R1,R2,R0)节点
3. 各节点执行查询,将结果发给Node2
4. Node2合并结果,作出响应。

8. Master节点的工作是什么?

1. 存储集群的元信息,如集群名称、集群中的节点
2. 转发创建索引和索引文档的请求
3. 和其他的节点进行通信,告诉其他节点有新的节点加入等

出处:https://www.cnblogs.com/leeSmall/p/9195782.html

扩展阅读


  1. 10分钟搞懂:亿级用户的分布式数据存储解决方案!

  2. 2019年8月数据库流行度排行:双星闪耀 MySQL 成月度最大赢家

  3. 从400+节点ElasticSearch集群的运维中,我们总结了这些经验

  4. 两万字的数据库面试题,不看绝对后悔

  5. Oracle数据库应用系统结构

  6. 慌的一批!妹子一个rm -rf把公司服务器数据删没了...

  7. 史上最全近百条Oracle DBA日常维护SQL脚本指令

数据和云小程序『DBASK』在线问答,随时解惑  欢迎了解和关注。

在线问答即时回复

数据和云

ID:OraNews

如有收获,请划至底部,点击“在看”,谢谢!


公司简介  | 招聘 | DTCC | 数据技术嘉年华 | 免费课程 | 入驻华为严选商城

zCloud | SQM | Bethune Pro2 | zData一体机 | MyData一体机 | ZDBM 备份一体机

Oracle技术架构 | 免费课程 | 数据库排行榜 | DBASK问题集萃 | 技术通讯

升级迁移 | 性能优化 | 智能整合 | 安全保障 |  架构设计 | SQL审核 | 分布式架构 | 高可用容灾 | 运维代维

云和恩墨大讲堂 | 一个分享交流的地方

长按,识别二维码,加入万人交流社群

请备注:云和恩墨大讲堂

ElasticSearch最全详细使用教程:入门、索引管理、映射详解、索引别名、分词器、文档管理、路由、搜索详解...相关推荐

  1. ElasticSearch 最全详细使用教程

    一.快速入门 查看集群的健康状况 http://localhost:9200/_cat 查看ES集群的master主节点状态 #curl -XGET 'http://10.0.8.47:9200/_c ...

  2. ElasticSearch最全详细使用教程:入门、索引管理、映射详解

    墨墨导读:本文介绍了ElasticSearch的必备知识:从入门.索引管理到映射详解. 一.快速入门 1. 查看集群的健康状况http://localhost:9200/_cat http://loc ...

  3. elasticsearch最全详细使用教程:入门、索引管理、映射详解、索引别名、分词器、文档管理、路由、搜索详解

    一.快速入门 1. 查看集群的健康状况 http://localhost:9200/_cat http://localhost:9200/_cat/health?v 说明:v是用来要求在结果中返回表头 ...

  4. 如此简单 | ElasticSearch 最全详细使用教程

    点击上方"朱小厮的博客",选择"设为星标" 后台回复"书",获取 来源:r6a.cn/cyJw 本文介绍了ElasticSearch的必备知 ...

  5. elasticsearch最全详细使用教程:搜索详解

    一.搜索API 1. 搜索API 端点地址 从索引tweet里面搜索字段user为kimchy的记录 GET /twitter/_search?q=user:kimchy 从索引tweet,user里 ...

  6. 全文检索引擎ElasticSearch:文档管理、集成IK分词器

    ElasticSearch 文档管理 添加文档 修改文档 删除文档 文档的查询 IK分词器安装 使用IK分词器 文档管理 添加文档 定位到资源 url http://localhost:9200/{i ...

  7. elasticsearch系列三:索引详解(分词器、文档管理、路由详解(集群))

    目录 一.分词器​ 1. 认识分词器 1.1 Analyzer 分析器 1.2 如何测试分词器 2. 内建的字符过滤器(character filter) 2.1 HTML过滤字符过滤器(HTML S ...

  8. Elasticsearch笔记(五):分词器与文档管理

    在上一篇中已经对索引的相关知识做了一定的讲解,本章讲重点讲解分词器与文档操作的API的相关使用.当然了,分享还是基于es 6.2.x版本展开. 目录 1.倒序索引 2.分词器 2.1 分析器的结构组成 ...

  9. Go语言从入门到规范-1.1、Go语言官网文档大纲及环境搭建

    Go语言从入门到规范-1.1.Go语言官网文档大纲及环境搭建 文章目录 Go语言从入门到规范-1.1.Go语言官网文档大纲及环境搭建 前言 一.go简介及学习路径 二.安装go 1.下载Go发行版 2 ...

最新文章

  1. TensorFlow人工智能引擎入门教程之十 最强网络 RSNN深度残差网络 平均准确率96-99%
  2. LTE网元间控制面协议
  3. 【Paper】Few-Shot Charge Prediction with Discriminative Legal Attributes
  4. vue 自己写上传excel组件_vue结合elementui组件 el-upload 上传excel表格(二)
  5. 一个显示日期的工具类
  6. 使用Junit的时候出现InitializationError
  7. java5分钟项目讲解_5分钟快速创建spring boot项目的完整步骤
  8. 先有电脑然后才有手机,为什么当时手机不叫“手脑”呢?
  9. Centos系统添加系统用户操作记录审计
  10. MDI Jade6的安装(含ocx控件的安装、PDF索引建立、修改注册表)
  11. 迭代扩展卡尔曼滤波IEKF
  12. 三险一金包括什么?三险和五险有什么区别?
  13. python中的token是什么
  14. linux chm 阅读器,linux下最好的chm阅读器KchmViewer,安装使用/与oklular,xCHM,gnochm简单比较...
  15. 周易六十四卦——风火家人卦
  16. Oracle - CentOS7.4 静默安装Oracle11g
  17. python语言的实验心得体会范文_实验报告心得体会范文3篇_心得体会
  18. rrpp协议如何修改_RRPP协议
  19. convert ps pcl emf wmf to pdf files using ghostscript
  20. 北京市工作居住证只有电子版没有纸质版

热门文章

  1. dns 服务器 linux_在Linux上构建自己的DNS服务器
  2. daisy_DAISY:视障人士的Linux兼容文本格式
  3. 《揭秘 CSS》开源啦
  4. qt 程序异常结束。_软件特攻队|VLC-Qt,功能齐全的跨平台多媒体开发利器
  5. java oxm_spring使用OXM进行对象XML映射解析
  6. SIAMATIC S7-1200 中通过 Modbus RTU 如何读取地址范围 9999 到 65535 的输入字
  7. sql script: Calculating Days
  8. 实现一个Golang的reverse函数
  9. 编写高质量代码:改善Java程序的151个建议(第1章:JAVA开发中通用的方法和准则___建议6~10)...
  10. session过期返回登录页面跳出frame