windows下部署
折腾了两天了,因为elasticsearch版本不同意,各种尝试,最后总结规律
elasticsearch的版本和springboot引入jar的版本最好一致,不然会出现各种疑难杂症。
本次使用elasticsearch5.5.0运行,jar也是5.5.0
集群搭建,可以不配置环境变量 方法com进入安装文件目录bin 启动elasticsearch.bat
本机搭建模拟三个服务器
主服务器config/下yml配置
http.cors.enabled: true
http.cors.allow-origin: "*"
#名字 主服务器和节点服务器必须一致
cluster.name: wali
#master主服务器
node.name: master
#确认主服务器,此处还有另一个意思,就是备选主机,当主机死了时 如果有节点服务器设置 node.master:true时,可是当做备选主机
node.master: true
#本机ip
network.host: 127.0.0.1
节点服务器1
cluster.name: wali
node.name: serve1
#非备选主机
node.master: false
network.host: 127.0.0.1
#设置端口号,可以不设置端口号 默认9200
http.port: 8200
#主服务器地址
discovery.zen.ping.unicast.hosts: ["127.0.0.1"]
节点服务器2
cluster.name: wali
node.name: serve2
node.master: false
network.host: 127.0.0.1
http.port: 8000
discovery.zen.ping.unicast.hosts: ["127.0.0.1"]
安装elasticsearch-head-master插件,此处略
启动顺序 先启动主服务器 在启动节点服务器 启动之后 粗线框住分片 细线是备份
创建数据结构 创建脚本不多说,拿来直接上
put 127.0.0.1:9200/client
{
"mappings": {
"book": {
"properties": {
"name": {
"type": "text"
},
"author": {
"type": "text"
},
"typeworks": {
"type": "integer"
},
"typework": {
"type": "integer"
},
"workscount": {
"type": "long"
},
"store": {
"type": "integer"
},
"state": {
"type": "integer"
},
"createdate": {
"type": "date",
"format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd"
},
"updatedate": {
"type": "date",
"format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd"
}
}
}
}
}
返回值 表示创建成功
插入数据 注意细节 提交方式
查看es里已经插入的数据
接下来集成springboot里,首先pom文件
5.5.0
org.elasticsearch elasticsearch ${elasticsearch.version} org.elasticsearch.client transport ${elasticsearch.version}
clasticsearch注入 新建一个类即可,我这里把包也贴出来,防止导错包
package com.example.demo.config; import org.elasticsearch.client.transport.TransportClient; import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.transport.InetSocketTransportAddress; import org.elasticsearch.transport.client.PreBuiltTransportClient; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import java.net.InetAddress; import java.net.UnknownHostException; /** * Created by Alex on 2018/1/24. */ @Configuration public class EsConfig { @Value("${spring.elasticsearch.host}") private String host;//elasticsearch的地址 @Value("${spring.elasticsearch.port}") private Integer port;//elasticsearch的端口 private static final Logger logger = LoggerFactory.getLogger(EsConfig.class); @Bean public TransportClient esclient() { InetSocketTransportAddress node = null; try { // node = new InetSocketTransportAddress(InetAddress.getByName(host), port); node = new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9300); } catch (UnknownHostException e) { e.printStackTrace(); logger.error("创建elasticsearch客户端失败"); } logger.info("创建elasticsearch客户端成功"); Settings settings = Settings.builder() .put("cluster.name", "wali") .build(); TransportClient client = new PreBuiltTransportClient(settings); client.addTransportAddress(node); //集群可以new多个地址node 在add进去 return client; } }下一步查询数据
package com.example.demo.controller; import org.elasticsearch.action.get.GetResponse; import org.elasticsearch.client.transport.TransportClient; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; /** * 书籍控制器 * 主要目的 实现elasticsearch的查询功能演练 * Created by Alex on 2018/1/25. */ @RestController @RequestMapping("/esbook") public class ESClientBookController { /** * 注入es操作对象 */ @Autowired private TransportClient client; // TODO: 2018/1/26 http://127.0.0.1:9200/client/book/1 @GetMapping(value = "/get") public ResponseEntity get() { GetResponse result = client.prepareGet("client", "book", "1").get(); if (!result.isExists()) { return new ResponseEntity(HttpStatus.NOT_FOUND); } return new ResponseEntity(result.getSource(), HttpStatus.OK); } }
到此集成完毕
介绍下elasticsearch的一些基本查询语法
修改数据
people类型 man表 1数据 _update标识要更改id等于1的数据
127.0.0.1:9200/people/man/1/_update
关键字 doc 后面直接属性对应要修改的名字
{
"doc":{
"name": "谁是XXX"
}
}
1_update id号
127.0.0.1:9200/people/man/1_update/_update
脚本语言更新 "painless",
内置脚本语言
{
"script":{
"lang": "painless",
"inline": " ctx._source.date='2018-01-23' "
}
}
删除操作
1_update 是id
【delete 】127.0.0.1:9200/people/man/1_update/
查询操作1是id
get 127.0.0.1:9200/people/man/1
条件查询
【post】127.0.0.1:9200/people/_search
{
"query": {
"match_all":{}
}
}
{
"query": {
"match":{
}
},
"from":1,
"size":1
}//from指定从哪里返回 size指定返回多少数据
{
"query": {
"match":{
"name": "谁是瓦力"
}
}
}指定条件查询
{
"query": {
"match":{
"name": "谁是瓦力"
}
},
"sort": {
"date": {"order": "asc"}
}
}指定字段排序查询
多聚合条件查询
aggs 聚合条件查询的关键字
group_by_age_count自定义名字 按照age聚合查询
group_by_date自定义名字 按照date聚合查询
{"aggs": {"group_by_age_count": {"terms":{"field":"age" }},"group_by_date": {"terms": {"field": "date"}}}
stats提取计算 按照age计算 也可以指定函数min max
{"aggs": {"grades_age_count": {"stats": {"field":"age"}}}}
结果 "aggregations": { "grades_age_count": {"count": 2,
"min": 40, "max": 40,"avg": 40,
"sum": 80
}}
模糊匹配查询 关键字match
{"query": {"match": {"name":"力"}}}
短语匹配
{"query": {"match_phrase": {"name":"超重瓦"} }}
多条件匹配 name和country里都包含a的数据出来
{"query": {"multi_match": {"query":"a","fields": ["name","country"]}}}
语法查询 关键字query_string 查询name和country里包含 瓦力 或者or a的数据 or语法查询 或者and "瓦力 or a"也可以加更多逻辑条件 "(瓦力 and a) or 重"
{"query": {"query_string": {"query":"瓦力 or a","fields": ["name","country"]}}}
具体项查询
{ "query": { "term": { "age":"40" } }
age大于等于30小于等于50的数据
{ "query": { "range": { "age":{"gte":30,"lte":"50"} } }}
date日期格式查询
{ "query": { "range": { "date":{"gt":"1980-03-03","lte":"1990-03-03"} } }}
filter context //比如女友问你爱不爱我,你的回答是爱或者不爱 query的结果是 很爱 特别爱 非常非常爱
关键词bool 字符串匹配
{ "query": { "bool": { "filter":{"term":{"name":"瓦力"}}} }}