赞
踩
es是一个强大的搜索引擎,目前知名公司内部都在使用!
因为Elasticsearch 是一个基于 Apache Lucene™ 的开源搜索引擎。无论在开源还是专有领域,Lucene 可以被认为是迄今为止最先进、性能最好的、功能最全的搜索引擎库。
首先我们要知道,es虽然强大,但是不方便操作,所以我们需要借助于kibana工具来进行开发!
本篇不讲kibana和es的安装,后面会专门写安装过程。这里先知道kibana工具是提供了一个可视化的界面。
我们的es需要以基于 HTTP 协议,以 JSON 为数据交互格式的 RESTful API来进行交互!
Kibana 可以看出是一个操作 ElasticSeach 的客户端.
由于Kibana是用nodejs写的一个web项目。所以进程查询使用ps来进行查询区别es用jps查询!
什么是RESTful
概念 | 解释 |
---|---|
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 | 相当于字段、属性 |
当没有在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": "第一节课" }
之前说 type 可以理解为table,那每个字段的数据类型是如何定义的呢?
简单类型中除了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": "张" } } }
1.创建index的时候可以包含空格!但是不能包含大写字母!只能小写字母!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。