1.安裝elasticsearch
這兒用的是5.6.9的版本,下載安裝過程較為簡單,在官網上下載好后解壓到文件夾。需要注意的是在elasticsearch-5.6.9\config下的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 }
總結
目前只學習了下初步的使用,復雜的應用待后面繼續挖掘。集群也,還有分詞器一大堆東西待待填坑