1.优点 :
①简化 Luence API的复杂操作
②轻松横向扩展 (支持集群,需要多少个es查询器,就配置几个节点即可,node.name: xxx,....)
③其实就是 集合 : 全文检索,数据分析,分布式部署 为一体 就形成了 ES。
应用场景 : 全文检索,复杂数据分析,同义词处理,相关度排名,海量数据的近实时处理。
启动步骤:
①先cmd去到head 目录, grunt server ,启动head插件
②直接.bat启动 elastaticSearch 服务
2.elasticSearch.yml 在设置参数的时候,后边一定要有空格!
cluster.name: kaven-test #设置集群的名称
node.name: master #当前elasticSearch节点的名称
network.host: xxx #监听的地址 host
http.port: 9200 #端口
对于集群里的子ES,一定要配上以下配置,否则找不到指挥官master 。
#增加新的参数,这样head插件就可以访问 es
http.cors.enabled: true
http.cors.allow-origin: "*"
ES的基本概念 :
Index (索引),即mysql中的数据库,index必须小写。
Type(逻辑分组),即数据库中的表
Document(文档)【JSON 格式】,即数据库中的行
Node(节点),Cluster(集群),一个集群由一个唯一的名字标识 。 一个集群下的多个节点,通过 这个集群的唯一标识来加入集群。
切记 : systemctl status firewalld [确保 firewalld是关闭] 与 chkconfig iptables off [确保 iptables 是关闭]
elasticsearch.yml 配置 :
network.host: 0.0.0.0 # 指定哪些IP 可以访问es ,【0.0.0.0表示任何ip都可以访问】 【只有设置了 network.host ,程序里 才能直接用9300来连接 ES 】
cluster.name :KAVEN-CLUSTER # 集群名称 ,同个集群中所有节点node,集群名称必须相同
node.name : node1 # 每个节点都有各自唯一的 node 名称
【
http.cors.enabled: true
http.cors.allow-origin: "*"
】 #设置跨域访问
3.增删改查 操作 :
创建索引:
增:ip:9200/index/type/1 (PUT) 【指定ID 插入数据】
jsonBody
ip:9200/index/type (POST)【系统生成ID插入数据】
改 :ip:9200/index/type/id (POST)
doc(修改的内容) :
删除索引:
简单查询 :ip:9200/index/type/id (GET)
带条件查询(POST):
http://ip:9200/index/type/_search
-- 查询所有,从一条开始,只查两条数据
{
"query":{
"match_all":{}
},
"from":1,
"size":2
}
排序查找关键字 :
-- 精确匹配
解释 :author字段必须是完全匹配 kaven 才会显示出来
term : term的意思就是过滤条件 ,查询条件 ,而且是文档中必须包含整个搜索的词汇。
term 与 match的区别在于 :
term 【精确查询】 :不采用分词器查询。
match 【模糊查询】:采用分词器 查询。
比如:查询“我的宝马多少速度”,term 就会直接以整个"我的宝马多少速度"去文档中寻找匹配。而 match 会使用分词器,将该串分为"我的" , "宝马","多少","速度" ,去文档中寻找是否有与这四个词其一匹配的 ,有一个匹配,该数据就会显示。
{
"query":{
"term":{
"author" : "kaven"
}
}
}
-- 关键词 模糊 查询 (POST):
注意 : 匹配的时候,会分为两个词:ElasticSearch,入门,凡是有这个两个词的都会显示出来。
{
"query":{
"match":{
"title" : "ElasticSearch入门"
}
}
}
-- 排序 查询 ,按 publish_date 降序排序(POST):
{
"query":{
"match":{
"title" : "ElasticSearch"
}
},
"sort":[
{"publish_date":{"order" : "desc"}}
]
}
-- 聚合查询 (POST):
分组 :
解释 : group_by_word_count-> 分组聚合的名称 , world_count,publish_date ->以该这两个字段 分别 分组
{
"aggs":{
"group_by_country":{
"terms":{
"field":"country"
}
}
}
}
统计:
可以统计出 最大最小值等信息
{
"aggs" : {
"grades_by_word_count":{
"stats":{
"filed" :"world_count"
}
}
}
}
-- 高级查询 :
子条件查询 :
精确整个词 (总体来说是模糊搜索)匹配:(也就是说要所有词都包括,而且按顺序) 【可以查出 yes , you are find me completely !】
{
"query":{
"match_phrase":{
"title" : "find me completely"
}
},
"from":1,
"size":2
}
多字段 的【精确】匹配查询 :
解释: 字段:author 或者 title 只要有一个 包含有 Man词 ,就会显示出来
{
"query":{
"multi_match": {
"query": "kaven",
"fields": [ "author", "title" ]
}
}
}
查询所有字段 , 可匹配 多个词 查询 :
解释: 任何字段 只要包含 ElasticSearch 或者Python 的 都会显示出来
{
"query":{
"query_string":{
"query" : "(ElasticSearch) OR (Python) "
}
}
}
查询指定字段 , 可匹配 多个词 查询 :
解释: 字段 title 和 name 包含 ElasticSearch 或者Python 的 都会显示出来
{
"query":{
"query_string":{
"query" : "(ElasticSearch) OR (Python) ",
"field" : ["title" , "name"]
}
}
}
范围查询 :
查找字段 read_count ,范围是 大于等于1000,小于等于2000的数据
{
"query":{
"range" :{
"read_count":{
"gte": 1000,
"lte" : 2000
}
}
}
}
---Filter Context :
filter 相比于 query :
①filter 相对于 query 会比较快一些,因为第一次查询的结果会进行缓存。
②filter 只查询出结果,但是query不仅查询出结果,还会计算出 相关度。
解释 : 查询 字段word_count 为1000 的 数据,
term : 完全匹配
{
"query" : {
"bool" : {
"filter" : {
"term" : {
"word_count" : 1000
}
}
}
}
}
--复合条件查询:
-- 固定分数查询:
解释 :查询出来的结果 ,分数_score都是 固定为 2
{
"query":{
"constant_score" :{
"filter":{
"match":{
"title" : "ElasticSearch"
}
},
"boost" : 2
}
}
}
-- 布尔 查询 (联合查询):
should 查询 :
解释 :也称为或查询,只要 author 包含kaven 或者 title 包含book,就会显示。
{
"query":{
"bool" :{
"should":[
{
"match" :{
"author" :"kaven"
}
},
{
"match" :{
"title" :"book"
}
}
]
}
}
}
-- must查询 :
解释 :也称为 与查询,只要 author 包含kaven 而且 title 包含book,就会显示。
{
"query":{
"bool" :{
"must":[
{
"match" :{
"author" :"kaven"
}
},
{
"match" :{
"title" :"book"
}
}
]
}
}
}
-- 过滤 + must 查询:
解释 :字段 author 必须包含kaven 且 title 必须包含book,且过滤剩下word_count 为 1000的 数据。
{
"query":{
"bool" :{
"must":[
{
"match" :{
"author" :"kaven"
}
},
{
"match" :{
"title" :"book"
}
}
],
"filter":[
{
"term" :{
"word_count":1000
}
}
]
}
}
}
must_not查询 :
查询 author 不是 kaven的数据
{
"query":{
"bool" :{
"must_not":{
"term":{
"author":"kaven"
}
}
}
}
}
--- 用java实现ES功能的时候(BUG: None of the configured)
切记 除了集群名,端口号外,还有就是必须得是5.x以上的版本,2.x就有这个问题!!!
--- ElastaticSearch 与 mysql 实现同步 :
使用第三方插件:go-mysql-elasticsearch
配置:
主要配置好,Mysql的连接,es的连接即可。
原理 :
如果是第一次启动该程序,首先会使用mysqldump 对 源mysql 数据库 进行一次全量同步,通过 es client 执行写入数据到ES。然后实现了 一个 Mysql client,作为 slave 数据库 连接到 源 数据库(master)。之后如果有对源数据库进行改动,master数据库会通过binlog event 同步给 slave 数据库,binlog event获取到改动的内容 写入ES。
中文分词器 :IKAnalyzer
简历 带分词器 的索引
analyzer: 分词器 【ik_max_word 是最细粒度分词】
search_analyzer: 分词规则
ElasticSearch 集群 :
一。ElasticSearch的数据存储机制 - 分片备份 Shard【分片就是对数据切分成多个部分】。 正因为分片的存在,集群上的某台机子宕机了,其他的机器也可以访问该机器的数据。
分片 : ES 上的索引 就是分片存储的,ES默认会把一个索引分出 5 片 ,数据保存在分片内,片数是可以自定义的。 当ES 的集群扩大或缩小的时候,各个节点会进行 分片的 迁移,这样就让各个节点都能访问到所有的数据。
副本 :副本就是对原分片的复制,和原分片的内容是一样的。这时,需要将某个分片的副本存在其他的机器上,这样这台机宕机了, 也可以在 其他机器上找到对应的副本数据。
一般来说,Elasticsearch 会尽量把一个索引的不同分片存储在不同的主机上,分片的副本也尽可能存在不同的主机上,这样可以提高容错率,从而提高高可用性。
健康状态 :Elasticsearch 衡量 索引 有三种健康状态
绿色: 代表所有的主分片 和 副本 都已经分配, 集群100%可用。
黄色 : 所有的主分片 已经分配了,但至少还有一个副本是缺失的。
红色 :至少一个主分片以及它的全部副本都在缺失中。