learn.lianglianglee.com/专栏/ElasticSearch知识体系详解/05 索引:索引管理详解.md.html
2022-08-14 03:40:33 +08:00

379 lines
16 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html>
<!-- saved from url=(0046)https://kaiiiz.github.io/hexo-theme-book-demo/ -->
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1.0, user-scalable=no">
<link rel="icon" href="/static/favicon.png">
<title>05 索引:索引管理详解.md.html</title>
<!-- Spectre.css framework -->
<link rel="stylesheet" href="/static/index.css">
<!-- theme css & js -->
<meta name="generator" content="Hexo 4.2.0">
</head>
<body>
<div class="book-container">
<div class="book-sidebar">
<div class="book-brand">
<a href="/">
<img src="/static/favicon.png">
<span>技术文章摘抄</span>
</a>
</div>
<div class="book-menu uncollapsible">
<ul class="uncollapsible">
<li><a href="/" class="current-tab">首页</a></li>
</ul>
<ul class="uncollapsible">
<li><a href="../">上一级</a></li>
</ul>
<ul class="uncollapsible">
<li>
<a href="/专栏/ElasticSearch知识体系详解/01 认知ElasticSearch基础概念.md.html">01 认知ElasticSearch基础概念</a>
</li>
<li>
<a href="/专栏/ElasticSearch知识体系详解/02 认知Elastic Stack生态和场景方案.md.html">02 认知Elastic Stack生态和场景方案</a>
</li>
<li>
<a href="/专栏/ElasticSearch知识体系详解/03 安装ElasticSearch和Kibana安装.md.html">03 安装ElasticSearch和Kibana安装</a>
</li>
<li>
<a href="/专栏/ElasticSearch知识体系详解/04 入门:查询和聚合的基础使用.md.html">04 入门:查询和聚合的基础使用</a>
</li>
<li>
<a class="current-tab" href="/专栏/ElasticSearch知识体系详解/05 索引:索引管理详解.md.html">05 索引:索引管理详解</a>
</li>
<li>
<a href="/专栏/ElasticSearch知识体系详解/06 索引:索引模板(Index Template)详解.md.html">06 索引:索引模板(Index Template)详解</a>
</li>
<li>
<a href="/专栏/ElasticSearch知识体系详解/07 查询DSL查询之复合查询详解.md.html">07 查询DSL查询之复合查询详解</a>
</li>
<li>
<a href="/专栏/ElasticSearch知识体系详解/08 查询DSL查询之全文搜索详解.md.html">08 查询DSL查询之全文搜索详解</a>
</li>
<li>
<a href="/专栏/ElasticSearch知识体系详解/09 查询DSL查询之Term详解.md.html">09 查询DSL查询之Term详解</a>
</li>
<li>
<a href="/专栏/ElasticSearch知识体系详解/10 聚合聚合查询之Bucket聚合详解.md.html">10 聚合聚合查询之Bucket聚合详解</a>
</li>
<li>
<a href="/专栏/ElasticSearch知识体系详解/11 聚合聚合查询之Metric聚合详解.md.html">11 聚合聚合查询之Metric聚合详解</a>
</li>
<li>
<a href="/专栏/ElasticSearch知识体系详解/12 聚合聚合查询之Pipline聚合详解.md.html">12 聚合聚合查询之Pipline聚合详解</a>
</li>
<li>
<a href="/专栏/ElasticSearch知识体系详解/13 原理从图解构筑对ES原理的初步认知.md.html">13 原理从图解构筑对ES原理的初步认知</a>
</li>
<li>
<a href="/专栏/ElasticSearch知识体系详解/14 原理ES原理知识点补充和整体结构.md.html">14 原理ES原理知识点补充和整体结构</a>
</li>
<li>
<a href="/专栏/ElasticSearch知识体系详解/15 原理ES原理之索引文档流程详解.md.html">15 原理ES原理之索引文档流程详解</a>
</li>
<li>
<a href="/专栏/ElasticSearch知识体系详解/16 原理ES原理之读取文档流程详解.md.html">16 原理ES原理之读取文档流程详解</a>
</li>
<li>
<a href="/专栏/ElasticSearch知识体系详解/17 优化ElasticSearch性能优化详解.md.html">17 优化ElasticSearch性能优化详解</a>
</li>
<li>
<a href="/专栏/ElasticSearch知识体系详解/18 大厂实践:腾讯万亿级 Elasticsearch 技术实践.md.html">18 大厂实践:腾讯万亿级 Elasticsearch 技术实践</a>
</li>
<li>
<a href="/专栏/ElasticSearch知识体系详解/19 资料Awesome Elasticsearch.md.html">19 资料Awesome Elasticsearch</a>
</li>
<li>
<a href="/专栏/ElasticSearch知识体系详解/20 WrapperQuery.md.html">20 WrapperQuery</a>
</li>
<li>
<a href="/专栏/ElasticSearch知识体系详解/21 备份和迁移.md.html">21 备份和迁移</a>
</li>
</ul>
</div>
</div>
<div class="sidebar-toggle" onclick="sidebar_toggle()" onmouseover="add_inner()" onmouseleave="remove_inner()">
<div class="sidebar-toggle-inner"></div>
</div>
<script>
function add_inner() {
let inner = document.querySelector('.sidebar-toggle-inner')
inner.classList.add('show')
}
function remove_inner() {
let inner = document.querySelector('.sidebar-toggle-inner')
inner.classList.remove('show')
}
function sidebar_toggle() {
let sidebar_toggle = document.querySelector('.sidebar-toggle')
let sidebar = document.querySelector('.book-sidebar')
let content = document.querySelector('.off-canvas-content')
if (sidebar_toggle.classList.contains('extend')) { // show
sidebar_toggle.classList.remove('extend')
sidebar.classList.remove('hide')
content.classList.remove('extend')
} else { // hide
sidebar_toggle.classList.add('extend')
sidebar.classList.add('hide')
content.classList.add('extend')
}
}
function open_sidebar() {
let sidebar = document.querySelector('.book-sidebar')
let overlay = document.querySelector('.off-canvas-overlay')
sidebar.classList.add('show')
overlay.classList.add('show')
}
function hide_canvas() {
let sidebar = document.querySelector('.book-sidebar')
let overlay = document.querySelector('.off-canvas-overlay')
sidebar.classList.remove('show')
overlay.classList.remove('show')
}
</script>
<div class="off-canvas-content">
<div class="columns">
<div class="column col-12 col-lg-12">
<div class="book-navbar">
<!-- For Responsive Layout -->
<header class="navbar">
<section class="navbar-section">
<a onclick="open_sidebar()">
<i class="icon icon-menu"></i>
</a>
</section>
</header>
</div>
<div class="book-content" style="max-width: 960px; margin: 0 auto;
overflow-x: auto;
overflow-y: hidden;">
<div class="book-post">
<p id="tip" align="center"></p>
<div><h1>05 索引:索引管理详解</h1>
<h2>索引管理的引入</h2>
<p>我们在前文中增加文档时如下的语句会动态创建一个customer的index</p>
<pre><code class="language-bash">PUT /customer/_doc/1
{
&quot;name&quot;: &quot;John Doe&quot;
}
</code></pre>
<p>而这个index实际上已经自动创建了它里面的字段name的类型。我们不妨看下它自动创建的mapping</p>
<pre><code class="language-json">{
&quot;mappings&quot;: {
&quot;_doc&quot;: {
&quot;properties&quot;: {
&quot;name&quot;: {
&quot;type&quot;: &quot;text&quot;,
&quot;fields&quot;: {
&quot;keyword&quot;: {
&quot;type&quot;: &quot;keyword&quot;,
&quot;ignore_above&quot;: 256
}
}
}
}
}
}
}
</code></pre>
<p>那么如果我们需要对这个建立索引的过程做更多的控制:比如想要确保这个索引有数量适中的主分片,并且在我们索引任何数据之前,分析器和映射已经被建立好。那么就会引入两点:第一个<strong>禁止自动创建索引</strong>,第二个是<strong>手动创建索引</strong></p>
<ul>
<li>禁止自动创建索引</li>
</ul>
<p>可以通过在 config/elasticsearch.yml 的每个节点下添加下面的配置:</p>
<pre><code class="language-bash">action.auto_create_index: false
</code></pre>
<p>手动创建索引就是接下来文章的内容。</p>
<h2>索引的格式</h2>
<p>在请求体里面传入设置或类型映射,如下所示:</p>
<pre><code class="language-bash">PUT /my_index
{
&quot;settings&quot;: { ... any settings ... },
&quot;mappings&quot;: {
&quot;properties&quot;: { ... any properties ... }
}
}
</code></pre>
<ul>
<li>
<p><strong>settings</strong>: 用来设置分片,副本等配置信息</p>
</li>
<li>
<p>mappings</p>
<p>: 字段映射,类型等</p>
<ul>
<li><strong>properties</strong>: 由于type在后续版本中会被Deprecated, 所以无需被type嵌套</li>
</ul>
</li>
</ul>
<h2>索引管理操作</h2>
<blockquote>
<p>我们通过kibana的devtool来学习索引的管理操作。</p>
</blockquote>
<h3>创建索引</h3>
<p>我们创建一个user 索引<code>test-index-users</code>其中包含三个属性nameage, remarks; 存储在一个分片一个副本上。</p>
<pre><code class="language-bash">PUT /test-index-users
{
&quot;settings&quot;: {
&quot;number_of_shards&quot;: 1,
&quot;number_of_replicas&quot;: 1
},
&quot;mappings&quot;: {
&quot;properties&quot;: {
&quot;name&quot;: {
&quot;type&quot;: &quot;text&quot;,
&quot;fields&quot;: {
&quot;keyword&quot;: {
&quot;type&quot;: &quot;keyword&quot;,
&quot;ignore_above&quot;: 256
}
}
},
&quot;age&quot;: {
&quot;type&quot;: &quot;long&quot;
},
&quot;remarks&quot;: {
&quot;type&quot;: &quot;text&quot;
}
}
}
}
</code></pre>
<p>执行结果</p>
<p><img src="assets/es-index-manage-1.png" alt="img" /></p>
<ul>
<li><strong>插入测试数据</strong></li>
</ul>
<p><img src="assets/es-index-manage-2.png" alt="img" /></p>
<p>查看数据</p>
<p><img src="assets/es-index-manage-3.png" alt="img" /></p>
<ul>
<li>我们再<strong>测试下不匹配的数据类型</strong>(age)</li>
</ul>
<pre><code class="language-bash">POST /test-index-users/_doc
{
&quot;name&quot;: &quot;test user&quot;,
&quot;age&quot;: &quot;error_age&quot;,
&quot;remarks&quot;: &quot;hello eeee&quot;
}
</code></pre>
<p>你可以看到无法类型不匹配的错误:</p>
<p><img src="assets/es-index-manage-4.png" alt="img" /></p>
<h3>修改索引</h3>
<p>查看刚才的索引,<code>curl 'localhost:9200/_cat/indices?v' | grep users</code></p>
<pre><code class="language-bash">yellow open test-index-users LSaIB57XSC6uVtGQHoPYxQ 1 1 1 0 4.4kb 4.4kb
</code></pre>
<p>我们注意到刚创建的索引的状态是yellow的因为我测试的环境是单点环境无法创建副本但是在上述<code>number_of_replicas</code>配置中设置了副本数是1 所以在这个时候我们需要修改索引的配置。</p>
<p>修改副本数量为0</p>
<pre><code class="language-bash">PUT /test-index-users/_settings
{
&quot;settings&quot;: {
&quot;number_of_replicas&quot;: 0
}
}
</code></pre>
<p><img src="assets/es-index-manage-5.png" alt="img" /></p>
<p>再次查看状态:</p>
<pre><code class="language-bash">green open test-index-users LSaIB57XSC6uVtGQHoPYxQ 1 1 1 0 4.4kb 4.4kb
</code></pre>
<h3>打开/关闭索引</h3>
<ul>
<li><strong>关闭索引</strong></li>
</ul>
<p>一旦索引被关闭,那么这个索引只能显示元数据信息,<strong>不能够进行读写操作</strong></p>
<p><img src="assets/es-index-manage-7.png" alt="img" /></p>
<p>当关闭以后,再插入数据时:</p>
<p><img src="assets/es-index-manage-8.png" alt="img" /></p>
<ul>
<li><strong>打开索引</strong></li>
</ul>
<p><img src="assets/es-index-manage-9.png" alt="img" /></p>
<p>打开后又可以重新写数据了</p>
<p><img src="assets/es-index-manage-10.png" alt="img" /></p>
<h3>删除索引</h3>
<p>最后我们将创建的test-index-users删除。</p>
<pre><code class="language-bash">DELETE /test-index-users
</code></pre>
<p><img src="assets/es-index-manage-11.png" alt="img" /></p>
<h3>查看索引</h3>
<p>由于test-index-users被删除所以我们看下之前bank的索引的信息</p>
<ul>
<li><strong>mapping</strong></li>
</ul>
<pre><code class="language-bash">GET /bank/_mapping
</code></pre>
<p><img src="assets/es-index-manage-12.png" alt="img" /></p>
<ul>
<li><strong>settings</strong></li>
</ul>
<pre><code class="language-bash">GET /bank/_settings
</code></pre>
<p><img src="assets/es-index-manage-13.png" alt="img" /></p>
<h2>Kibana管理索引</h2>
<p>在Kibana如下路径我们可以查看和管理索引</p>
<p><img src="assets/es-index-manage-6.png" alt="img" /></p>
<h2>参考文章</h2>
<p>https://www.elastic.co/guide/cn/elasticsearch/guide/current/_creating_an_index.html</p>
<p>https://www.elastic.co/guide/en/elasticsearch/reference/current/mapping.html</p>
<p>https://www.elastic.co/guide/en/elasticsearch/reference/current/removal-of-types.html</p>
<p>https://www.cnblogs.com/quanxiaoha/p/11515057.html</p>
</div>
</div>
<div>
<div style="float: left">
<a href="/专栏/ElasticSearch知识体系详解/04 入门:查询和聚合的基础使用.md.html">上一页</a>
</div>
<div style="float: right">
<a href="/专栏/ElasticSearch知识体系详解/06 索引:索引模板(Index Template)详解.md.html">下一页</a>
</div>
</div>
</div>
</div>
</div>
</div>
<a class="off-canvas-overlay" onclick="hide_canvas()"></a>
</div>
<script defer src="https://static.cloudflareinsights.com/beacon.min.js/v652eace1692a40cfa3763df669d7439c1639079717194" integrity="sha512-Gi7xpJR8tSkrpF7aordPZQlW2DLtzUlZcumS8dMQjwDHEnw9I7ZLyiOj/6tZStRBGtGgN6ceN6cMH8z7etPGlw==" data-cf-beacon='{"rayId":"70996f95fa563d60","version":"2021.12.0","r":1,"token":"1f5d475227ce4f0089a7cff1ab17c0f5","si":100}' crossorigin="anonymous"></script>
</body>
<!-- Global site tag (gtag.js) - Google Analytics -->
<script async src="https://www.googletagmanager.com/gtag/js?id=G-NPSEEVD756"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag() {
dataLayer.push(arguments);
}
gtag('js', new Date());
gtag('config', 'G-NPSEEVD756');
var path = window.location.pathname
var cookie = getCookie("lastPath");
console.log(path)
if (path.replace("/", "") === "") {
if (cookie.replace("/", "") !== "") {
console.log(cookie)
document.getElementById("tip").innerHTML = "<a href='" + cookie + "'>跳转到上次进度</a>"
}
} else {
setCookie("lastPath", path)
}
function setCookie(cname, cvalue) {
var d = new Date();
d.setTime(d.getTime() + (180 * 24 * 60 * 60 * 1000));
var expires = "expires=" + d.toGMTString();
document.cookie = cname + "=" + cvalue + "; " + expires + ";path = /";
}
function getCookie(cname) {
var name = cname + "=";
var ca = document.cookie.split(';');
for (var i = 0; i < ca.length; i++) {
var c = ca[i].trim();
if (c.indexOf(name) === 0) return c.substring(name.length, c.length);
}
return "";
}
</script>
</html>