ElasticSearch
安装elasticsearch
官网:elastic.co
https://www.elastic.co/cn/downloads/elasticsearch
官网下载巨慢,翻墙下载
目录
启动,访问9200:
访问9200接口:
安装elasticsearch-head:
git clone git://github.com/mobz/elasticsearch-head.git
cd elasticsearch-head
npm install
npm run start
open http://localhost:9100/
存在一个9200和9100的跨域问题!
点击链接,报跨域的错!
修改elasticsearch中config下的yaml配置文件,修改:
重启,连接成功:
把索引当做一个数据库!可以建立索引(库),文档(库中的数据!)
后面所有的查询,查询功能在Kibana中做!
了解ELK
安装Kibana
好处:ELK基本上都是拆箱即用
启动测试:点bin下的kibana
默认的kibana端口为5601
PS:注意elasticsearch和kibana的版本必须一致 否则出错!
开发工具:(Post curl head 谷歌浏览器插件测试)
汉化,修改kibana yaml中配置 重启,
ES核心概念
- 索引
- 字段类型(mapping)
- 文档(documents)
概述:
集群、节点、索引、类型、文档、分片、映射是什么?
elasticsearch是面向文档,关系型数据库和elasticsearch 客观的对比如下,一切都是JSON!
类型示例:
IK分词器
安装https://github.com/medcl/elasticsearch-analysis-ik/releases
放在elasticsearch的plugin(插件)下
重启观察ES
关于elasticsearch中的命令 如elasticsearch-plugin:
命令行输入:
elasticsearch-plugin list
- 1
在kibana中测分词器:
我们输入 超级喜欢狂神或java
发现问题:狂神说被拆开了!
这种自己需要的词,需要自己加到我们的分词器字典中!
向ik分词器增加自己的配置
重启es、kibana
再次测试一下狂神说,看下效果!ik_max_word最细粒度划分
以后自定义dic、导入即可!
索引引擎里面最重要的首先就是分词
Rest风格说明
一种软件架构风格,而不是标准,只是提供了一组设计原则和约束条件。它主要用于客户端和服务器交互类的软件,基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制!
基础测试
- 创建一个索引!也是在kibana终端中试用版PUT命令
PUT /test1/type1/1{ "name": "狂神说", "age": "3"}
- 1
- 2
- 3
- 4
完成了自动增加索引!数据也成功的添加了,这就是可以当做数据库看的原因。。
-
那么name字段用不用指定类型呢?毕竟我们关系型数据库 是需要指定类型的啊!
- 字符串类型 text、keyword
- 数值类型 long、integer、short、byte、double、float、scaled float
- 日期类型date
- te布尔值类型boolean
- 二进制类型binary
- 等等。。。
-
指定字段的类型——创建规则
GET命令得到库的信息:
- 查看默认的信息
通过命令get _cat/可以获得es当前的很多信息!
修改 提交还是使用PUT即可!然后覆盖!最新办法
曾经的办法:
现在的方法 使用POST:
删除索引——DELETE
通过DELETE命令实现删除、根据你的请求来判断是删除索引还是删除文档记录!
使用RESTFUL风格是我们ES推荐大家使用的!
关于文档的基本操作(重点):
基本操作:
添加数据
更新数据,将小明改成小红
PUT更新数据
version代表被改变的次数
Post,_update自由度更高,PUT必须一次性修改一个个体的全部内容,但是Post可以选择部分修改!
这个和PUT无异,要在后加_update
简单的搜索:
GET Kuangshen/user/_search?q=name:狂神说
简单的条件查询,可以根据默认的映射规则,产生基本的查询!
复杂操作搜索 select(排序,分页,高亮,模糊查询,精准查询)
GET kuangshen/_search
- 1
输出:
{"took" : 0,"timed_out" : false,"_shards" : {"total" : 1,"successful" : 1,"skipped" : 0,"failed" : 0},"hits" : {"total" : {"value" : 5,"relation" : "eq"},"max_score" : 1.0,"hits" : [{"_index" : "kuangshen","_type" : "user","_id" : "1","_score" : 1.0,"_source" : {"name" : "狂神说","age" : 23,"desc" : "一顿操作猛如虎,一看工资2500","tags" : ["技术宅","温暖","直男"]}},{"_index" : "kuangshen","_type" : "user","_id" : "2","_score" : 1.0,"_source" : {"name" : "张三","age" : 3,"desc" : "法外狂徒","tags" : ["交友","旅游","渣男"]}},{"_index" : "kuangshen","_type" : "user","_id" : "3","_score" : 1.0,"_source" : {"name" : "李四","age" : 30,"desc" : "不知道如何形容","tags" : ["篮球","IT","型男"]}},{"_index" : "kuangshen","_type" : "user","_id" : "4","_score" : 1.0,"_source" : {"name" : "王五","age" : 32,"desc" : "就是一个屌丝","tags" : ["羽毛球","钢琴","渣男"]}},{"_index" : "kuangshen","_type" : "user","_id" : "5","_score" : 1.0,"_source" : {"name" : "狂神说Java8","age" : 34,"desc" : "就是一个大帅哥","tags" : ["围棋","小提琴","暖男"]}}]}
}
- 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
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
GET kuangshen/_search
{"query": {"match": {"name": "狂神"}}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
输出:
{"took" : 9,"timed_out" : false,"_shards" : {"total" : 1,"successful" : 1,"skipped" : 0,"failed" : 0},"hits" : {"total" : {"value" : 2,"relation" : "eq"},"max_score" : 1.9034984,"hits" : [{"_index" : "kuangshen","_type" : "user","_id" : "1","_score" : 1.9034984,"_source" : {"name" : "狂神说","age" : 23,"desc" : "一顿操作猛如虎,一看工资2500","tags" : ["技术宅","温暖","直男"]}},{"_index" : "kuangshen","_type" : "user","_id" : "5","_score" : 1.6534033,"_source" : {"name" : "狂神说Java8","age" : 34,"desc" : "就是一个大帅哥","tags" : ["围棋","小提琴","暖男"]}}]}
}
- 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
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
hit: 索引和文档信息
查询的结果总数
然后就是查询出来的具体文档
数据中的东西都可以遍历出来
分数:通过score判断谁更加符合结果
指定字段查询:
GET kuangshen/_search
{"query": {"match": {"name": "狂神"}},"_source": ["name","desc"]
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
之后使用java操作es,所有的方法和对象就是这里面的key!
复杂操作:
排序
order中的desc降序、asc升序;按照age
GET kuangshen/_search
{"query": {"match": {"name": "狂神"}},"sort": [{"age": {"order": "desc"}}]
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
分页
GET kuangshen/_search
{"query": {"match": {"name": "狂神"}},"sort": [{"age": {"order": "desc"}}],"from": 0,"size": 1
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
From:从第几个数据开始,返回多少条数据(单页面的数据)
数据下标还是从0开始的,和学的所有数据结构是一样的
/search/{current}/{pagesize}
布尔值查询
通过布尔值进行更加精确的查询:多条件精确查询
must命令(相当于mysql的and),即所有条件要同时符合;如果将must改为should(相当于or),则只要满足其一即可;
类似的 must not 查询不是。。
GET kuangshen/user/_search
{"query": {"bool": {"must": [{"match": {"name": "狂神说"}},{"match": {"age": 23}}]}}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
过滤器(filter)
筛选age范围
GET kuangshen/user/_search
{"query": {"bool": {"must": [{"match": {"name": "狂神"}}],"filter": [{"range": {"age": {"gte": 10,"lte": 40}}}]}}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- gt 大于
- gte 大于等于
- lt 小于
- lte 小于等于
匹配多个条件
匹配出tags里面只要包含有男的,同时按照上到下分值高到低排列
GET kuangshen/user/_search
{"query": {"match": {"tags": "男 技术"}}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
多个条件使用空格隔开
只要满足其中一个结果即可以被查出
这个时候可以通过分值基本的判断
精确查询
term查询是直接通过待排索引指定的词条进行精确的查找的!
关于分词:
term,直接查询精确的
match:会使用分词器解析!(先分析文档,然后再通过分析的文档进行查询!)
两个字段类型text keyword
#新建dbPUT testdb{"mappings": {"properties": {"name":{"type": "text"},"desc":{"type": "keyword"} }}}#插入两条数据PUT testdb/_doc/1{"name": "狂神说Java name","desc": "狂神说Java name"}