Elasticsearch搜索引擎

86

简介

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. 下载镜像
1
2
docker pull elasticsearch
  1. 创建挂载的目录
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. 创建容器并启动
1
2
#discovery.type=single-node表示单节点 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
GET policy_dev/_mapping

删除索引

1
DELETE policy_dev

删除所有数据

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
目录