简介
Elaticsearch,简称为es, es是一个开源的高扩展的分布式全文检索引擎,它可以近乎实时的存储、检索数据;本身扩展性很好,可以扩展到上百台服务器,处理PB级别(大数据时代)的数据。es也使用Java开发并使用Lucene作为其核心来实现所有索引和搜索的功能,但是它的目的是通过简单的RESTful API来隐藏Lucene的复杂性,从而让全文搜索变得简单。
与关系型数据库对比
| Relational DB |
Elasticsearch |
| 数据库(database) |
索引 index |
| 表(tables) |
类型 types |
| 行(rows) |
文档 documents |
| 字段(columns) |
fields |
文档
之前说elasticsearch是面向文档的,那么就意味着索引和搜索数据的最小单位是文档,elasticsearch中,文档有几个重要属性 :
- 自我包含,一篇文档同时包含字段和对应的值,也就是同时包含 key:value!
- 可以是层次型的,一个文档中包含自文档,复杂的逻辑实体就是这么来的! {就是一个json对象! fastjson进行自动转换!}
- 灵活的结构,文档不依赖预先定义的模式,我们知道关系型数据库中,要提前定义字段才能使用,在elasticsearch中,对于字段是非常灵活的,有时候,我们可以忽略该字段,或者动态的添加一个 新的字段。
尽管我们可以随意的新增或者忽略某个字段,但是,每个字段的类型非常重要,比如一个年龄字段类型,可以是字符 串也可以是整形。因为elasticsearch会保存字段和类型之间的映射及其他的设置。这种映射具体到每个映射的每种类型,这也是为什么在elasticsearch中,类型有时候也称为映射类型。
类型
类型是文档的逻辑容器,就像关系型数据库一样,表格是行的容器。 类型中对于字段的定义称为映射, 比如 name 映 射为字符串类型。 我们说文档是无模式的,它们不需要拥有映射中所定义的所有字段, 比如新增一个字段,那么elasticsearch是怎么做的呢?elasticsearch会自动的将新字段加入映射,但是这 个字段的不确定它是什么类型,elasticsearch就开始猜,如果这个值是18,那么elasticsearch会认为它 是整形。 但是elasticsearch也可能猜不对, 所以最安全的方式就是提前定义好所需要的映射,这点跟关系型数据库殊途同归了,先定义好字段,然后再使用。
索引
索引是映射类型的容器,elasticsearch中的索引是一个非常大的文档集合。索引存储了映射类型的字段 和其他设置。 然后它们被存储到了各个分片上了。
Docker安装ElasticSearch
- 下载镜像
1
2
docker pull elasticsearch
- 创建挂载的目录
1
2
3
mkdir -p /mydata/elasticsearch/config
mkdir -p /mydata/elasticsearch/data
echo "http.host: 0.0.0.0" >> /mydata/elasticsearch/config/elasticsearch.yml
- 创建容器并启动
1
2
docker run --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms64m -Xmx128m" -v /mydata/elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml -v /mydata/elasticsearch/data:/usr/share/elasticsearch/data -v /mydata/elasticsearch/plugins:/usr/share/elasticsearch/plugins -d elasticsearch
ElasticSearch常用API
创建index
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
PUT /policy_dev
{
"mappings": {
"properties": {
"information_id": {
"type": "text"
},
"title": {
"type": "text",
"analyzer": "ik_smart"
},
"content": {
"type": "text",
"analyzer": "ik_smart"
},
"archContent": {
"type": "text",
"analyzer": "ik_smart"
},
"pubDate" : {
"type" : "date",
"format" : "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd"
},
"insertDate" : {
"type" : "date",
"format" : "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd"
}
}
}
}
查看索引信息
删除索引
删除所有数据
1
2
3
4
5
6
POST policy_dev/_delete_by_query?pretty=true
{
"query": {
"match_all": {}
}
}
返回特定字段
1
2
3
4
5
6
7
8
GET policy_dev/_search
{
"size": 20,
"_source": {
"includes": [
"title","insertDate","pubdate"]
}
}
导数据
1
2
3
4
docker run --rm -ti elasticdump/elasticsearch-dump \
--input=http://用户名:密码@192.168.5.249:9200/sentiment \
--output=http://elastic:fToC78aNvG7Ypg6ae0tZ@192.168.0.188:9200/sentiment_t \
--type=data
<h2><a id="_0"></a>简介</h2>
<p>Elaticsearch,简称为es, es是一个开源的高扩展的分布式全文检索引擎,它可以近乎实时的存储、检索数据;本身扩展性很好,可以扩展到上百台服务器,处理PB级别(大数据时代)的数据。es也使用Java开发并使用Lucene作为其核心来实现所有索引和搜索的功能,但是它的目的是通过简单的RESTful API来隐藏Lucene的复杂性,从而让全文搜索变得简单。</p>
<h3><a id="_2"></a>与关系型数据库对比</h3>
<table>
<thead>
<tr>
<th>Relational DB</th>
<th>Elasticsearch</th>
</tr>
</thead>
<tbody>
<tr>
<td>数据库(database)</td>
<td>索引 index</td>
</tr>
<tr>
<td>表(tables)</td>
<td>类型 types</td>
</tr>
<tr>
<td>行(rows)</td>
<td>文档 documents</td>
</tr>
<tr>
<td>字段(columns)</td>
<td>fields</td>
</tr>
</tbody>
</table>
<h4><a id="_10"></a>文档</h4>
<p>之前说elasticsearch是面向文档的,那么就意味着索引和搜索数据的最小单位是文档,elasticsearch中,文档有几个重要属性 :</p>
<ul>
<li>自我包含,一篇文档同时包含字段和对应的值,也就是同时包含 key:value!</li>
<li>可以是层次型的,一个文档中包含自文档,复杂的逻辑实体就是这么来的! {就是一个json对象! fastjson进行自动转换!}</li>
<li>灵活的结构,文档不依赖预先定义的模式,我们知道关系型数据库中,要提前定义字段才能使用,在elasticsearch中,对于字段是非常灵活的,有时候,我们可以忽略该字段,或者动态的添加一个 新的字段。</li>
</ul>
<p>尽管我们可以随意的新增或者忽略某个字段,但是,每个字段的类型非常重要,比如一个年龄字段类型,可以是字符 串也可以是整形。因为elasticsearch会保存字段和类型之间的映射及其他的设置。这种映射具体到每个映射的每种类型,这也是为什么在elasticsearch中,类型有时候也称为映射类型。</p>
<h4><a id="_19"></a>类型</h4>
<p>类型是文档的逻辑容器,就像关系型数据库一样,表格是行的容器。 类型中对于字段的定义称为映射, 比如 name 映 射为字符串类型。 我们说文档是无模式的,它们不需要拥有映射中所定义的所有字段, 比如新增一个字段,那么elasticsearch是怎么做的呢?elasticsearch会自动的将新字段加入映射,但是这 个字段的不确定它是什么类型,elasticsearch就开始猜,如果这个值是18,那么elasticsearch会认为它 是整形。 但是elasticsearch也可能猜不对, 所以最安全的方式就是提前定义好所需要的映射,这点跟关系型数据库殊途同归了,先定义好字段,然后再使用。</p>
<h4><a id="_21"></a>索引</h4>
<p>索引是映射类型的容器,elasticsearch中的索引是一个非常大的文档集合。索引存储了映射类型的字段 和其他设置。 然后它们被存储到了各个分片上了。</p>
<h2><a id="DockerElasticSearch_23"></a>Docker安装ElasticSearch</h2>
<ol>
<li>下载镜像</li>
</ol>
<pre><div class="hljs"><code class="lang-bash">docker pull elasticsearch
</code></div></pre>
<ol start="2">
<li>创建挂载的目录</li>
</ol>
<pre><div class="hljs"><code class="lang-bash">mkdir -p /mydata/elasticsearch/config
mkdir -p /mydata/elasticsearch/data
<span class="hljs-built_in">echo</span> <span class="hljs-string">"http.host: 0.0.0.0"</span> >> /mydata/elasticsearch/config/elasticsearch.yml
</code></div></pre>
<ol start="3">
<li>创建容器并启动</li>
</ol>
<pre><div class="hljs"><code class="lang-bash"><span class="hljs-comment">#discovery.type=single-node表示单节点</span>
docker run --name elasticsearch -p 9200:9200 -p 9300:9300 -e <span class="hljs-string">"discovery.type=single-node"</span> -e ES_JAVA_OPTS=<span class="hljs-string">"-Xms64m -Xmx128m"</span> -v /mydata/elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml -v /mydata/elasticsearch/data:/usr/share/elasticsearch/data -v /mydata/elasticsearch/plugins:/usr/share/elasticsearch/plugins -d elasticsearch
</code></div></pre>
<h2><a id="ElasticSearchAPI_46"></a>ElasticSearch常用API</h2>
<h3><a id="index_47"></a>创建index</h3>
<pre><div class="hljs"><code class="lang-json">PUT /policy_dev
{
<span class="hljs-attr">"mappings"</span>: {
<span class="hljs-attr">"properties"</span>: {
<span class="hljs-attr">"information_id"</span>: {
<span class="hljs-attr">"type"</span>: <span class="hljs-string">"text"</span>
},
<span class="hljs-attr">"title"</span>: {
<span class="hljs-attr">"type"</span>: <span class="hljs-string">"text"</span>,
<span class="hljs-attr">"analyzer"</span>: <span class="hljs-string">"ik_smart"</span>
},
<span class="hljs-attr">"content"</span>: {
<span class="hljs-attr">"type"</span>: <span class="hljs-string">"text"</span>,
<span class="hljs-attr">"analyzer"</span>: <span class="hljs-string">"ik_smart"</span>
},
<span class="hljs-attr">"archContent"</span>: {
<span class="hljs-attr">"type"</span>: <span class="hljs-string">"text"</span>,
<span class="hljs-attr">"analyzer"</span>: <span class="hljs-string">"ik_smart"</span>
},
<span class="hljs-attr">"pubDate"</span> : {
<span class="hljs-attr">"type"</span> : <span class="hljs-string">"date"</span>,
<span class="hljs-attr">"format"</span> : <span class="hljs-string">"yyyy-MM-dd HH:mm:ss||yyyy-MM-dd"</span>
},
<span class="hljs-attr">"insertDate"</span> : {
<span class="hljs-attr">"type"</span> : <span class="hljs-string">"date"</span>,
<span class="hljs-attr">"format"</span> : <span class="hljs-string">"yyyy-MM-dd HH:mm:ss||yyyy-MM-dd"</span>
}
}
}
}
</code></div></pre>
<h3><a id="_82"></a>查看索引信息</h3>
<pre><div class="hljs"><code class="lang-json">GET policy_dev/_mapping
</code></div></pre>
<h3><a id="_87"></a>删除索引</h3>
<pre><div class="hljs"><code class="lang-json">DELETE policy_dev
</code></div></pre>
<h3><a id="_93"></a>删除所有数据</h3>
<pre><div class="hljs"><code class="lang-json">POST policy_dev/_delete_by_query?pretty=<span class="hljs-literal">true</span>
{
<span class="hljs-attr">"query"</span>: {
<span class="hljs-attr">"match_all"</span>: {}
}
}
</code></div></pre>
<h3><a id="_104"></a>返回特定字段</h3>
<pre><div class="hljs"><code class="lang-json">GET policy_dev/_search
{
<span class="hljs-attr">"size"</span>: <span class="hljs-number">20</span>,
<span class="hljs-attr">"_source"</span>: {
<span class="hljs-attr">"includes"</span>: [
<span class="hljs-string">"title"</span>,<span class="hljs-string">"insertDate"</span>,<span class="hljs-string">"pubdate"</span>]
}
}
</code></div></pre>
<h4><a id="_116"></a>导数据</h4>
<pre><div class="hljs"><code class="lang-shell">docker run --rm -ti elasticdump/elasticsearch-dump \
--input=http://用户名:密码@192.168.5.249:9200/sentiment \
--output=http://elastic:fToC78aNvG7Ypg6ae0tZ@192.168.0.188:9200/sentiment_t \
--type=data
</code></div></pre>