1.安装elasticsearch
这儿用的是5.6.9的版本,下载安装过程较为简单,在官网上下载好后解压到文件夹。需要注意的是在elasticsearch-5.6.9config下的elasticsearch.yml文件夹中
配置data与log的地址,自己创建文件夹后如下配置
1 # ----------------------------------- Paths ------------------------------------ 2 # 3 # Path to directory where to store the data (separate multiple locations by comma): 4 # 5 path.data: D:/java/soft/elasticsearch/dev/data 6 # 7 # Path to log files: 8 # 9 path.logs: D:/java/soft/elasticsearch/dev/log 10 #
启动elasticsearch 点击elasticksearch.bat即可启动 注意电脑上要安装1.8以上的jdk
出现以下消息则说明启动成功
上面红圈的9300端口则是与es进行数据交互时的端口,下面的9200则是查看数据的端口,ip为安装es的ip
启动项目后,访问http://ip:9200 ip是安装elasticsearch服务的机器ip,如果出现以下信息即代表安装成功
1 { 2 "name": "kSs9lbx", 3 "cluster_name": "elasticsearch", 4 "cluster_uuid": "Wu6n-WzvQuecDEMWspm_aA", 5 "version": { 6 "number": "5.6.9", 7 "build_hash": "877a590", 8 "build_date": "2018-04-12T16:25:14.838Z", 9 "build_snapshot": false, 10 "lucene_version": "6.6.1" 11 }, 12 "tagline": "You Know, for Search" 13 }
2.创建java的springboot工程
2.1pom.xml文件依赖
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.2.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> <fastjson.version>1.2.31</fastjson.version> <jackson.version>2.8.7</jackson.version> </properties> <dependencies> <!-- set jetty server --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-configuration-processor</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jetty</artifactId> </dependency> <!-- aop --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency> <!-- json处理 --> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>${fastjson.version}</version> </dependency> <!-- https://mvnrepository.com/artifact/net.sourceforge.javacsv/javacsv --> <dependency> <groupId>net.sourceforge.javacsv</groupId> <artifactId>javacsv</artifactId> <version>2.0</version> </dependency> <!-- jackson json begin --> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-core</artifactId> <version>${jackson.version}</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>${jackson.version}</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-annotations</artifactId> <version>${jackson.version}</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.module</groupId> <artifactId>jackson-module-jaxb-annotations</artifactId> <version>${jackson.version}</version> </dependency> <!-- jackson json end --> <!-- https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 --> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> <version>3.3.2</version> </dependency> <!-- druid datasource --> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.0.27</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId> </dependency> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.4</version> </dependency> <dependency> <groupId>com.github.theborakompanioni</groupId> <artifactId>thymeleaf-extras-shiro</artifactId> <version>${thymeleaf-shiro.version}</version> </dependency> <!-- mysql驱动 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> <!-- spring boot 开发工具 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <optional>true</optional> </dependency> <!-- 测试 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <!--elasticsearrch--> <dependency> <groupId>org.elasticsearch</groupId> <artifactId>elasticsearch</artifactId> <version>5.6.9</version> </dependency> <dependency> <groupId>org.elasticsearch.client</groupId> <artifactId>transport</artifactId> <version>5.6.9</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> </dependencies> <repositories> <repository> <id>aliyun</id> <name>aliyun</name> <url>http://maven.aliyun.com/nexus/content/groups/public</url> </repository> </repositories> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <includeSystemScope>true</includeSystemScope> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>2.18.1</version> <configuration> <skipTests>true</skipTests> </configuration> </plugin> </plugins> </build>
2.2application.yml文件配置
server: port: 9999 es: host: 127.0.0.1 port: 9300 spring: datasource: initialize: false #false时不进行数据库表结构和数据初始化 username: root #password: root password: root url: jdbc:mysql://localhost:3306/estest?createDatabaseIfNotExist=true&autoReconnect=true&useSSL=false&useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true type: com.alibaba.druid.pool.DruidDataSource #连接池配置 driverClassName: com.mysql.jdbc.Driver # 初始化大小,最小,最大 initialSize: 5 minIdle: 5 maxActive: 50 # 配置获取连接等待超时的时间 maxWait: 60000 # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 timeBetweenEvictionRunsMillis: 60000 # 配置一个连接在池中最小生存的时间,单位是毫秒 minEvictableIdleTimeMillis: 300000 validationQuery: SELECT 1 FROM DUAL testWhileIdle: true testOnBorrow: false testOnReturn: false # 打开PSCache,并且指定每个连接上PSCache的大小 poolPreparedStatements: true maxPoolPreparedStatementPerConnectionSize: 20 # 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙 filters: stat,log4j # 通过connectProperties属性来打开mergeSql功能;慢SQL记录 connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
2.3 创建elasticsearch的配置类
1 package spakt.demo.config; 2 3 import org.elasticsearch.client.transport.TransportClient; 4 import org.elasticsearch.common.settings.Settings; 5 import org.elasticsearch.common.transport.InetSocketTransportAddress; 6 import org.elasticsearch.transport.client.PreBuiltTransportClient; 7 import org.springframework.beans.factory.annotation.Value; 8 import org.springframework.context.annotation.Bean; 9 import org.springframework.context.annotation.Configuration; 10 11 import java.net.InetAddress; 12 import java.net.UnknownHostException; 13 14 @Configuration 15 public class EsConfiguration { 16 17 18 private String clusterName = "elasticsearch"; 19 @Value("${es.host}") 20 private String esHost; 21 22 @Value("${es.port}") 23 private String esPort; 24 25 @Bean 26 public TransportClient getTransportClient() throws UnknownHostException { 27 28 Settings sets = Settings.builder().put("cluster.name", clusterName) //集群名字 29 .put("client.transport.sniff", true) 30 .build(); 31 InetSocketTransportAddress inet = new InetSocketTransportAddress(InetAddress.getByName(esHost), Integer.parseInt(esPort)); 32 TransportClient transportClient = new PreBuiltTransportClient(sets).addTransportAddress(inet); 33 return transportClient; 34 } 35 }
这儿注意 如果是es6.x以后的版本 ,在引入es包之后,还要引入netty插件包,这儿以6.7.2为例
1 <!-- https://mvnrepository.com/artifact/org.elasticsearch.plugin/transport-netty4-client --> 2 <dependency> 3 <groupId>org.elasticsearch.plugin</groupId> 4 <artifactId>transport-netty4-client</artifactId> 5 <version>6.7.2</version> 6 </dependency>
并且上面的配置中InetSocketTransportAddress 修改为TransportAddress即可 具体如下
1 @Bean 2 public TransportClient initTransportClient() throws UnknownHostException { 3 Settings build = Settings.builder().put("cluster.name", clusterName).put("client.transport.sniff", true).build(); 4 TransportAddress transportAddress = new TransportAddress(InetAddress.getByName(address),port); 5 TransportClient transportClient = new PreBuiltTransportClient(build).addTransportAddress(transportAddress); 6 return transportClient; 7 }
2.4 创建测试的controller类 包含添加,查询,删除方法
1 package spakt.demo.elasticsearch; 2 3 import org.apache.commons.lang3.StringUtils; 4 import org.elasticsearch.action.bulk.BulkRequestBuilder; 5 import org.elasticsearch.action.bulk.BulkResponse; 6 import org.elasticsearch.action.delete.DeleteRequestBuilder; 7 import org.elasticsearch.action.index.IndexRequestBuilder; 8 import org.elasticsearch.action.index.IndexResponse; 9 import org.elasticsearch.action.search.SearchRequestBuilder; 10 import org.elasticsearch.action.search.SearchResponse; 11 import org.elasticsearch.client.transport.TransportClient; 12 import org.elasticsearch.common.text.Text; 13 import org.elasticsearch.index.query.BoolQueryBuilder; 14 import org.elasticsearch.index.query.QueryBuilders; 15 import org.elasticsearch.rest.RestStatus; 16 import org.elasticsearch.search.SearchHit; 17 import org.elasticsearch.search.SearchHits; 18 import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder; 19 import org.elasticsearch.search.fetch.subphase.highlight.HighlightField; 20 import org.springframework.beans.factory.annotation.Autowired; 21 import org.springframework.jdbc.core.JdbcTemplate; 22 import org.springframework.stereotype.Controller; 23 import org.springframework.web.bind.annotation.RequestMapping; 24 import org.springframework.web.bind.annotation.ResponseBody; 25 import spakt.demo.bean.Prisoner; 26 27 import javax.annotation.Resource; 28 import java.text.DecimalFormat; 29 import java.util.*; 30 31 /** 32 * 33 */ 34 @Controller 35 public class EsController { 36 37 // @Resource(name = "jdbc2") 38 @Autowired 39 private JdbcTemplate jdbcTemplate; 40 41 @Autowired 42 private TransportClient transportClient; 43 44 /** 45 * 插入数据方法 46 * 47 * @return 48 */ 49 @RequestMapping("/es") 50 @ResponseBody 51 public Object addEs() { 52 53 //要插入的数据 54 List<Map<String, Object>> prisonerListList = jdbcTemplate. 55 queryForList("select id,name,fact,family_address as address from da_prisoner "); 56 //批处理类 57 BulkRequestBuilder bulkRequestBuilder = transportClient.prepareBulk(); 58 int count = 0; 59 for (Map<String, Object> prisoner : prisonerListList) { 60 61 //插入方法 62 //jyplatform 代表index 理解为数据库中的库 63 //prisoner 代表type 理解为数据库总的表 64 //UUID 个人理解是为数据库中的主键 65 String uuid = UUID.randomUUID().toString().replace("-", ""); 66 IndexRequestBuilder indexRequestBuilder = transportClient. 67 prepareIndex("jyplatform", "prisoner",uuid) 68 .setSource(prisoner); 69 //单个执行 70 //IndexResponse indexResponse = indexRequestBuilder.get(); 71 72 //批量执行 将添加器加入批处理中 73 bulkRequestBuilder.add(indexRequestBuilder); 74 if (count % 5000 == 0) { 75 //每隔5000条执行一次批量插入的操作 76 BulkResponse bulkItemResponses = bulkRequestBuilder.execute().actionGet(); 77 System.err.println(bulkItemResponses.getTook()); 78 float num = (float) count / prisonerListList.size(); 79 DecimalFormat df = new DecimalFormat("0.00"); 80 String s = df.format(num * 100); 81 System.err.println("================================" + s + "%"); 82 } 83 count++; 84 } 85 return prisonerListList; 86 } 87 88 /** 89 * 查询数据 90 * 91 * @return 92 */ 93 @RequestMapping("/get") 94 @ResponseBody 95 public Object getMap(String content) { 96 List<Prisoner> prisonerList = new ArrayList<>(); 97 // 构造搜索条件 98 BoolQueryBuilder query = QueryBuilders.boolQuery(); 99 //fact 即是field 理解为表中的字段 100 query.filter(QueryBuilders.matchPhraseQuery("fact", content)); 101 //开始查询 102 SearchRequestBuilder searchRequestBuilder = transportClient 103 .prepareSearch("jyplatform") //确定index 104 .setTypes("prisoner") //确定type 105 .setFrom(0) //从多少条开始 分页使用 106 .setSize(10000) //查多少条 分页使用 size-from>10000会报异常 107 .setQuery(query); //加入查询条件 108 //结果高亮显示 109 HighlightBuilder highlightBuilder = new HighlightBuilder(); 110 highlightBuilder.field("fact"); 111 highlightBuilder.preTags("<span style="color:red">"); 112 highlightBuilder.postTags("</span>"); 113 searchRequestBuilder.highlighter(highlightBuilder); 114 //获取查询结果 115 SearchResponse searchResponse = searchRequestBuilder.get(); 116 if (searchResponse.status() != RestStatus.OK) { 117 System.err.println("查询结果错误"); 118 return "error"; 119 } 120 //得到查询的结果 121 SearchHits hits = searchResponse.getHits(); 122 for (SearchHit hit : hits) { 123 //进行高亮处理 124 String fact = ""; 125 Map<String, HighlightField> highlightFields = hit.getHighlightFields(); 126 HighlightField field = highlightFields.get("fact"); 127 if(field!=null){ 128 Text[] fragments = field.fragments(); 129 for (Text fragment : fragments) { 130 fact+=fragment.toString(); 131 } 132 } 133 134 prisonerList.add(new Prisoner(hit.getSource().get("id").toString(), 135 hit.getSource().get("name").toString(), 136 StringUtils.isBlank(fact)?hit.getSource().get("fact").toString():fact, 137 hit.getSource().get("address").toString())); 138 } 139 return prisonerList; 140 } 141 142 /** 143 * 删除数据 144 */ 145 @RequestMapping("/delete") 146 @ResponseBody 147 public String delete() { 148 //开始查询 149 SearchRequestBuilder searchRequestBuilder = transportClient 150 .prepareSearch("jyplatform") //确定index 151 .setTypes("prisoner") //确定type 152 .setFrom(0) // begin 153 .setSize(10000); //size size-from>10000会报异常 154 //获取查询结果 155 SearchHits hits = searchRequestBuilder.get().getHits(); 156 //批量操作 157 BulkRequestBuilder bulkRequestBuilder = transportClient.prepareBulk(); 158 for (SearchHit hit : hits) { 159 //删除方法 160 //jyplatform 代表index 理解为数据库中的库 161 //prisoner 代表type 理解为数据库总的表 162 // hit.getId() 这条数据的id 163 DeleteRequestBuilder deleteRequestBuilder = transportClient. 164 prepareDelete("jyplatform", "prisoner", hit.getId()); 165 //批量删除 166 // bulkRequestBuilder.add(deleteRequestBuilder); 167 // if(i%5000 ==0){ 168 // bulkRequestBuilder.execute(); 169 // } 170 //单个操作 171 deleteRequestBuilder.get(); 172 } 173 return "OK"; 174 } 175 176 177 }
2.5 创建启动类启动测试
1 package spakt.demo; 2 3 import org.springframework.boot.SpringApplication; 4 import org.springframework.boot.autoconfigure.SpringBootApplication; 5 import org.springframework.context.annotation.ImportResource; 6 7 @SpringBootApplication 8 @ImportResource(value = "classpath:spring-*.xml") 9 public class DemoApplication { 10 11 public static void main(String[] args) { 12 SpringApplication.run(DemoApplication.class, args); 13 } 14 }
总结
目前只学习了下初步的使用,复杂的应用待后面继续挖掘。集群也,还有分词器一大堆东西待待填坑