前言
es是一个强大的搜索引擎,目前知名公司内部都在使用!
因为Elasticsearch 是一个基于 Apache Lucene™ 的开源搜索引擎。无论在开源还是专有领域,Lucene 可以被认为是迄今为止最先进、性能最好的、功能最全的搜索引擎库。
首先我们要知道,es虽然强大,但是不方便操作,所以我们需要借助于kibana工具来进行开发!
kibana
本篇不讲kibana和es的安装,后面会专门写安装过程。这里先知道kibana工具是提供了一个可视化的界面。
我们的es需要以基于 HTTP 协议,以 JSON 为数据交互格式的 RESTful API来进行交互!
Kibana 可以看出是一个操作 ElasticSeach 的客户端.
由于Kibana是用nodejs写的一个web项目。所以进程查询使用ps来进行查询区别es用jps查询!
什么是RESTful
一张图演示什么是restful
ES
ElasticSearch 交互方式
- 基于 HTTP 协议,以 JSON 为数据交互格式的 RESTful API GET POST PUT DELETE HEAD
es与其他数据存储产品比较
关于es几个重要概念
概念 | 解释 |
---|---|
cluster | 整个elasticsearch 默认就是集群状态,整个集群是一份完整、互备的数据。 |
node | 集群中的一个节点,一般只一个进程就是一个node |
shard | 分片,即使是一个节点中的数据也会通过 hash 算法,分成多个片存放,默认是 5 片。(7.0 默认是 1 片) |
index | 相当于EDBMS 的 database, 对于用户来说是一个逻辑数据库,虽然物理上会被分多个 shard 存放,也可能存放在多个 node 中。 |
type | 类似于 rdbms 的 table,但是与其说像 table,其实更像面向对象中的 class , 同一Json 的格式的数据集合。((6.x只允许建一个,7.0被废弃,造成index实际相当于table级)) |
document | 类似于 rdbms 的 row、面向对象里的object |
field | 相当于字段、属性 |
小总结
- cluster 整个elasticsearch 默认就是集群状态
- 一个节点一个node
- 一个index可以类比成一个database!一个ndoe可以拥有多个index!
- 一个index(6.x)对应唯一的type,类比table!(5.x之前是对应多个type,7.x以后 type被舍弃!)
- shard为其切片!在6.x默认是5片。7.x默认是1片
- document类比row
- field类比 column
- 注意:ES是自带索引,且为倒排索引!
可参考内容
Kibana上操作数据
插入数据
当没有在type后面跟上id的话,那么会自动生成一个uuid。id是不能重复的,这里的id要区别于_source中自己定义的id!
注意
:此id为
document
的id!
覆盖
没有在put里面声明_update
,这里将自定义内容修改
修改
修改指定位置时,必须使用post请求!这里区别于HTTP里的PUT(create,update)请求!!
删除
查询
GET movie_index/_search
{
"query": {
"term": {
"id": {
"value": "2"
}
}
}
}
GET movie_index/_search
{
"query": {
"bool": {
"should": [
{"term": {
"actorList.name": {
"value": "zhang"
}
}},{
"term": {
"name": {
"value": "red"
}
}
}
]
}
}
}
GET movie_index/_search
{
"query": {
"bool": {
"must_not": [
{"term": {
"name": {
"value": "red"
}
}}
]
}
}
}
GET movie_index/_search
{
"query": {
"range": {
"doubanScore": {
"gt": 8
}
}
}
}
GET movie_index/_search
{
"query": {
"bool": {
"filter": {
"range": {
"doubanScore": {
"gte": 5,
"lte": 8
}
}
}
}
}
}
GET movie_index/_search
{
"from": 2
, "size": 1
}
GET movie_index/_search
{
"aggs": {
"a": {
"sum": {
"field": "doubanScore"
}
}
}
}
GET movie_index/_search
{
"aggs": {
" ": {
"terms": {
"field": "actorList.id",
"size": 10
}
}
}
}
GET movie_index/_search
{
"aggs": {
"a": {
"value_count": {
"field": "doubanScore"
}
}
}
}
GET movie_index/_search
{
"aggs": {
"b": {
"terms": {
"field": "actorList.name",
"size": 10
}
, "aggs": {
"sum": {
"sum": {
"field": "doubanScore"
}
}
}
}
}
}
PUT movie_index/_mapping/movie
{
"properties": {
"actorList.name": {
"type": "text",
"fielddata": true
}
}
}
GET movie_index/_search
{
"aggs": {
"group": {
"terms": {
"field": "actorList.id",
"size": 10
}
, "aggs": {
"maxScore": {
"max": {
"field": "doubanScore"
}
}
,
"minscore": {
"min": {
"field": "doubanScore"
}
}
}
}
}
}
GET movie_index/_search
{
"aggs": {
"group": {
"terms": {
"field": "actorList.id",
"size": 1
, "order": {
"_term": "desc"
}
}
}
}
}
GET zhengkw/_analyze
{
"analyzer": "ik_smart"
, "text": "第一节课"
}
GET zhengkw/_analyze
{
"analyzer": "ik_max_word"
, "text": "第一节课"
}
关于Mapping
之前说 type 可以理解为table,那每个字段的数据类型是如何定义的呢?
- 默认情况下, 是由插入的第一条数据的类型来自动推断来设定的!
- 可以通过 Mapping 来设置和查看每个字段的数据类型.
简单类型中除了text会进行分词,分词后建立索引,其他简单类型则
不会分词
!但是也会建立索引!
也支持一些JSON对象,还有地图类型的信息,比如地理位置的坐标,或者地理位置的图形!
关于使用
手动建立索引
PUT /movie_chn
{
"mappings": {
"movie":{
"properties": {
"id":{
"type": "long"
},
"name":{
"type": "text"
, "analyzer": "ik_smart"
},
"doubanScore":{
"type": "double"
},
"actorList":{
"properties": {
"id":{
"type":"long"
},
"name":{
"type":"keyword"
}
}
}
}
}
}
}
建立的时候 type指定为movie document指定 id,name等 ,声明用properties将doc括起来。properties后面的v并不是json数组!而是一个json字符串!指定text的name的时候也
声明分词器
!
插入数据
PUT /movie_chn/movie/1
{ "id":1,
"name":"红海行动",
"doubanScore":8.5,
"actorList":[
{"id":1,"name":"张译"},
{"id":2,"name":"海清"},
{"id":3,"name":"张涵予"}
]
}
PUT /movie_chn/movie/2
{
"id":2,
"name":"湄公河行动",
"doubanScore":8.0,
"actorList":[
{"id":3,"name":"张涵予"}
]
}
PUT /movie_chn/movie/3
{
"id":3,
"name":"红海事件",
"doubanScore":5.0,
"actorList":[
{"id":4,"name":"张晨"}
]
}
查询
GET /movie_chn/movie/_search
{
"query": {
"match": {
"name": "红海"
}
}
}
GET /movie_chn/movie/_search
{
"query": {
"term": {
"actorList.name": "张"
}
}
}
注意事项(不断更新ing)
1.创建index的时候可以包含空格!但是不能包含
大写字母
!只能小写字母!