ElasticSearch安装和使用

  ElasticSearch是开源搜索平台的新成员,实时数据分析的神器。可以理解为作为搜索的数据库,可以提供搜索功能。对比关系型数据库,具有以下的相似关系:

关系型数据库 数据库
ElasticSearch 索引 类型 文档 字段

  一个ES集群可以包含多个索引(数据库),每个索引又包含了很多类型(表),类型中包含了很多文档(行),每个文档又包含了很多字段(列)。

  如果要实现对关系型数据库数据的搜索功能,需要将关系型数据库中的数据导入到ElasticSearch中,网上有解决方案。但是好像不支持最新的ElasticSearch5,可以使用我下面的Java代码实现数据的导入。

Ubuntu系统安装 Elasticsearch5

升级系统后安装 Oracle Java 7,既然 Elasticsearch 官方推荐使用 Oracle JDK 7 就不要尝试 JDK 8 和 OpenJDK 了:

1 $ sudo apt-get update
2 $ sudo apt-get upgrade
3
4 $ sudo apt-get install software-properties-common
5 $ sudo add-apt-repository ppa:webupd8team/java
6 $ sudo apt-get update
7
8 $ sudo apt-get install oracle-java7-installer

加入 Elasticsearch 官方源后安装 elasticsearch:

1 $ wget -O - http://packages.elasticsearch.org/GPG-KEY-elasticsearch | apt-key add -
2 $ sudo echo "deb http://packages.elasticsearch.org/elasticsearch/1.1/debian stable main" >> /etc/apt/sources.list
3
4 $ sudo apt-get update
5 $ sudo apt-get install elasticsearch

加入到系统启动文件并启动 elasticsearch 服务,用 curl 测试一下安装是否成功:

 1 $ sudo update-rc.d elasticsearch defaults 95 1
 2
 3 $ sudo /etc/init.d/elasticsearch start
 4
 5 $ curl -X GET ‘http://localhost:9200‘
 6 {
 7   "status" : 200,
 8   "name" : "Fer-de-Lance",
 9   "version" : {
10     "number" : "1.1.1",
11     "build_hash" : "f1585f096d3f3985e73456debdc1a0745f512bbc",
12     "build_timestamp" : "2014-04-16T14:27:12Z",
13     "build_snapshot" : false,
14     "lucene_version" : "4.7"
15   },
16   "tagline" : "You Know, for Search"
17 }

Elasticsearch 的集群和数据管理界面 Marvel 非常赞,可惜只对开发环境免费,安装很简单,完成后重启服务访问 http://192.168.2.172:9200/_plugin/marvel/ 就可以看到界面:

1 $ sudo /usr/share/elasticsearch/bin/plugin -i elasticsearch/marvel/latest
2
3 $ sudo /etc/init.d/elasticsearch restart
4  * Stopping Elasticsearch Server                                           [ OK ]
5  * Starting Elasticsearch Server                                           [ OK ]

另外可以安装elasticsearch-head作为管理Elasticsearch的web前端插件。

安装教程:Elasticsearch5中安装Elasticsearch-head插件

ElasticSearch Java调用

  命令调用的方式不再讲述了,网上很多。ElasticSearch最终是要在项目中使用的。官方的API文档:https://www.elastic.co/guide/en/elasticsearch/reference/current/index.html

自己写了助手类,方便大家调用。可以实现索引的增删改查,查询提供多种方法,包括or、and查询,多个关键词查询,关键词高亮等,适用于不同场合。

首先是引用需要的jar包。使用maven管理jar包,需要的jar包有:

 1         <dependency>
 2             <groupId>org.elasticsearch</groupId>
 3             <artifactId>elasticsearch</artifactId>
 4             <version>5.3.1</version>
 5         </dependency>
 6         <dependency>
 7             <groupId>org.elasticsearch.client</groupId>
 8             <artifactId>transport</artifactId>
 9             <version>5.3.1</version>
10         </dependency>
11         <dependency>
12             <groupId>org.apache.logging.log4j</groupId>
13             <artifactId>log4j-api</artifactId>
14             <version>2.7</version>
15         </dependency>
16         <dependency>
17             <groupId>org.apache.logging.log4j</groupId>
18             <artifactId>log4j-core</artifactId>
19             <version>2.7</version>
20         </dependency>

然后是ElasticSearch配置文件,存储集群名称、集群IP、索引名称。配置文件命名为:elasticsearch.properties

cluster_name=elasticsearch
cluster_serverip=127.0.0.1
indexname=blogsystem

还需要配置日志配置文件,命名为:log4j2.properties

appender.console.type = Console
appender.console.name = console
appender.console.layout.type = PatternLayout

rootLogger.level = info
rootLogger.appenderRef.console.ref = console

最后是java的实现ElasticSearch助手类。为了方便使用,助手类分为具体实现和调用两个类。

ElasticSearch具体实现类:ElasticSearchUtilsImp.java

  1 package com.blog.utils;
  2
  3 import java.io.IOException;
  4 import java.io.InputStream;
  5 import java.lang.reflect.Method;
  6 import java.net.InetAddress;
  7 import java.net.UnknownHostException;
  8 import java.util.ArrayList;
  9 import java.util.HashMap;
 10 import java.util.List;
 11 import java.util.Map;
 12 import java.util.Properties;
 13 import java.util.concurrent.ExecutionException;
 14
 15 import org.elasticsearch.action.delete.DeleteResponse;
 16 import org.elasticsearch.action.index.IndexResponse;
 17 import org.elasticsearch.action.search.SearchRequestBuilder;
 18 import org.elasticsearch.action.search.SearchResponse;
 19 import org.elasticsearch.action.update.UpdateRequest;
 20 import org.elasticsearch.client.transport.TransportClient;
 21 import org.elasticsearch.common.settings.Settings;
 22 import org.elasticsearch.common.text.Text;
 23 import org.elasticsearch.common.transport.InetSocketTransportAddress;
 24 import org.elasticsearch.common.xcontent.XContentBuilder;
 25 import org.elasticsearch.common.xcontent.XContentFactory;
 26 import org.elasticsearch.index.query.BoolQueryBuilder;
 27 import org.elasticsearch.index.query.QueryBuilder;
 28 import org.elasticsearch.index.query.QueryBuilders;
 29 import org.elasticsearch.rest.RestStatus;
 30 import org.elasticsearch.search.SearchHits;
 31 import org.elasticsearch.search.aggregations.AggregationBuilders;
 32 import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder;
 33 import org.elasticsearch.search.fetch.subphase.highlight.HighlightField;
 34 import org.elasticsearch.transport.client.PreBuiltTransportClient;
 35
 36 /**
 37  * @author:Tim
 38  * @date:2017年5月3日 下午8:24:22
 39  * @description:ElasticSearch助手类具体实现
 40  */
 41 public class ElasticSearchUtilsImp {
 42
 43     private static String cluster_name = null;// 实例名称
 44     private static String cluster_serverip = null;// elasticSearch服务器ip
 45     private static String indexname = null;// 索引名称
 46
 47     static {
 48         try {
 49             // 读取db.properties文件
 50             Properties props = new Properties();
 51             InputStream in = ElasticSearchUtilsImp.class.getResourceAsStream("/elasticsearch.properties");
 52             props.load(in);// 加载文件
 53
 54             // 读取信息
 55             cluster_name = props.getProperty("cluster_name");
 56             cluster_serverip = props.getProperty("cluster_serverip");
 57             indexname = props.getProperty("indexname");
 58         } catch (IOException e) {
 59             e.printStackTrace();
 60             System.out.println("加载数据库配置文件出错!");
 61         }
 62     }
 63
 64     /**
 65      * 返回一个到ElasticSearch的连接客户端
 66      *
 67      * @return
 68      */
 69     private static TransportClient getClient() {
 70         Settings settings = Settings.builder().put("cluster.name", cluster_name).build();// 设置集群名称
 71         @SuppressWarnings("unchecked")
 72         TransportClient client = new PreBuiltTransportClient(settings);// 创建client
 73         try {
 74             client.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName(cluster_serverip), 9300));// 增加地址和端口
 75         } catch (UnknownHostException e) {
 76             e.printStackTrace();
 77             System.out.println("ElasticSearch连接失败!");
 78         }
 79
 80         return client;
 81     }
 82
 83     /**
 84      * 将Map转换成builder
 85      *
 86      * @param mapParam
 87      * @return
 88      * @throws Exception
 89      */
 90     private static XContentBuilder createMapJson(Map<String, String> mapParam) throws Exception {
 91         XContentBuilder source = XContentFactory.jsonBuilder().startObject();
 92
 93         for (Map.Entry<String, String> entry : mapParam.entrySet()) {
 94             source.field(entry.getKey(), entry.getValue());
 95         }
 96
 97         source.endObject();
 98
 99         return source;
100     }
101
102     /**
103      * 将实体转换成json
104      *
105      * @param entity 实体
106      * @param fieldNameParm 实体中待转换成json的字段
107      * @return 返回json
108      * @throws Exception
109      */
110     private static XContentBuilder createEntityJson(Object entity, String... methodNameParm) throws Exception {
111         // 创建json对象, 其中一个创建json的方式
112         XContentBuilder source = XContentFactory.jsonBuilder().startObject();
113
114         try {
115             for (String methodName : methodNameParm) {
116
117                 if (!methodName.startsWith("get")) {
118                     throw new Exception("不是有效的属性!");
119                 }
120
121                 Method method = entity.getClass().getMethod(methodName, null);
122                 String fieldValue = (String) method.invoke(entity, null);
123                 String fieldName = StringUtils.toLowerCaseFirstOne(methodName.replace("get", ""));// 去掉“get”,并将首字母小写
124
125                 // 避免和elasticSearch中id字段重复
126                 if (fieldName == "_id") {
127                     fieldName = "id";
128                 }
129
130                 source.field(fieldName, fieldValue);
131             }
132         } catch (NoSuchMethodException e) {
133             e.printStackTrace();
134             System.out.println("未找到方法!");
135         }
136
137         source.endObject();
138
139         return source;
140     }
141
142     /**
143      * 将一个Map格式的数据(key,value)插入索引 (私有方法)
144      *
145      * @param type 类型(对应数据库表)
146      * @param docId id,对应elasticSearch中的_id字段
147      * @param mapParam Map格式的数据
148      * @return
149      */
150     public static boolean addMapDocToIndex(String type, String docId, Map<String, String> mapParam) {
151         boolean result = false;
152
153         TransportClient client = getClient();
154         XContentBuilder source = null;
155         try {
156             source = createMapJson(mapParam);
157         } catch (Exception e) {
158             e.printStackTrace();
159         }
160
161         // 存json入索引中
162         IndexResponse response = null;
163         if (docId == null) {
164             // 使用默认的id
165             response = client.prepareIndex(indexname, type).setSource(source).get();
166         } else {
167             response = client.prepareIndex(indexname, type, docId).setSource(source).get();
168         }
169
170         // 插入结果获取
171         String index = response.getIndex();
172         String gettype = response.getType();
173         String id = response.getId();
174         long version = response.getVersion();
175         RestStatus status = response.status();
176
177         String strResult = "新增文档成功:" + index + " : " + gettype + ": " + id + ": " + version + ": " + status.getStatus();
178         System.out.println(strResult);
179
180         if (status.getStatus() == 201) {
181             result = true;
182         }
183
184         // 关闭client
185         client.close();
186
187         return result;
188     }
189
190     /**
191      * 将一个实体存入到默认索引的类型中(指定_id,一般是业务数据的id,及elasticSearch和关系型数据使用同一个id,方便同关系型数据库互动)
192      * (私有方法)
193      *
194      * @param type 类型(对应数据库表)
195      * @param docId id,对应elasticSearch中的_id字段
196      * @param entity 要插入的实体
197      * @param methodNameParm 需要将实体中哪些属性作为字段
198      * @return
199      */
200     public static boolean addEntityDoc(String type, String docId, Object entity, String... methodNameParm) {
201         boolean result = false;
202
203         TransportClient client = getClient();
204         XContentBuilder source = null;
205         try {
206             source = createEntityJson(entity, methodNameParm);
207         } catch (Exception e) {
208             e.printStackTrace();
209         }
210
211         // 存json入索引中
212         IndexResponse response = null;
213         if (docId == null) {
214             // 使用默认的id
215             response = client.prepareIndex(indexname, type).setSource(source).get();
216         } else {
217             response = client.prepareIndex(indexname, type, docId).setSource(source).get();
218         }
219
220         // 插入结果获取
221         String index = response.getIndex();
222         String gettype = response.getType();
223         String id = response.getId();
224         long version = response.getVersion();
225         RestStatus status = response.status();
226
227         String strResult = "新增文档成功:" + index + " : " + gettype + ": " + id + ": " + version + ": " + status.getStatus();
228         System.out.println(strResult);
229
230         if (status.getStatus() == 201) {
231             result = true;
232         }
233
234         // 关闭client
235         client.close();
236
237         return result;
238     }
239
240     /**
241      * 删除文档
242      *
243      * @param type 类型(对应数据库表)
244      * @param docId 类型中id
245      * @return
246      */
247     public static boolean deleteDoc(String type, String docId) {
248         boolean result = false;
249
250         TransportClient client = getClient();
251         DeleteResponse deleteresponse = client.prepareDelete(indexname, type, docId).get();
252
253         System.out.println("删除结果:" + deleteresponse.getResult().toString());
254         if (deleteresponse.getResult().toString() == "DELETED") {
255             result = true;
256         }
257
258         // 关闭client
259         client.close();
260
261         return result;
262     }
263
264     /**
265      * 修改文档
266      *
267      * @param type 类型
268      * @param docId 文档id
269      * @param updateParam 需要修改的字段和值
270      * @return
271      */
272     public static boolean updateDoc(String type, String docId, Map<String, String> updateParam) {
273         String strResult = "";
274         boolean result = false;
275
276         TransportClient client = getClient();
277
278         UpdateRequest updateRequest = new UpdateRequest();
279         updateRequest.index(indexname);
280         updateRequest.type(type);
281         updateRequest.id(docId);
282         try {
283             updateRequest.doc(createMapJson(updateParam));
284         } catch (Exception e) {
285             e.printStackTrace();
286         }
287         try {
288             strResult = client.update(updateRequest).get().getResult().toString();
289         } catch (InterruptedException e) {
290             e.printStackTrace();
291         } catch (ExecutionException e) {
292             e.printStackTrace();
293         }
294         System.out.println(strResult);
295
296         if (strResult == "UPDATED") {
297             result = true;
298         }
299
300         return result;
301     }
302
303     /**
304      * TODO or查询命中条数
305      * @param type 类型
306      * @param shouldMap 查询条件
307      * @return
308      */
309     public static int multiOrSearchDocCount(String type, Map<String, String> shouldMap) {
310         TransportClient client = getClient();
311
312         return 0;
313     }
314
315     /**
316      * 高亮搜索
317      *
318      * @param type 类型
319      * @param fieldName 段
320      * @param keyword 关键词
321      * @param from 开始行数
322      * @param size 每页大小
323      * @return
324      */
325     public static Map<String, Object> searchDocHighlight(String type, String fieldName, String keyword, int from,
326             int size) {
327         TransportClient client = getClient();
328
329         // 高亮
330         HighlightBuilder hiBuilder = new HighlightBuilder();
331         hiBuilder.preTags("<span style=\"color:red\">");
332         hiBuilder.postTags("</span>");
333         hiBuilder.field(fieldName);
334
335         QueryBuilder queryBuilder = QueryBuilders.matchPhraseQuery(fieldName, keyword);
336
337         SearchRequestBuilder responsebuilder = client.prepareSearch(indexname).setTypes(type);
338         responsebuilder.setQuery(queryBuilder);
339         responsebuilder.highlighter(hiBuilder);
340         responsebuilder.setFrom(from);
341         responsebuilder.setSize(size);
342         responsebuilder.setExplain(true);
343
344         SearchResponse myresponse = responsebuilder.execute().actionGet();
345         SearchHits searchHits = myresponse.getHits();
346
347         // 总命中数
348         long total = searchHits.getTotalHits();
349         Map<String, Object> map = new HashMap<String, Object>();
350         map.put("total", total);
351         List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
352         for (int i = 0; i < searchHits.getHits().length; i++) {
353             Map<String, HighlightField> highlightFields = searchHits.getHits()[i].getHighlightFields();
354
355             // 段高亮
356             HighlightField titleField = highlightFields.get(fieldName);
357             Map<String, Object> source = searchHits.getHits()[i].getSource();
358             if (titleField != null) {
359                 Text[] fragments = titleField.fragments();
360                 String name = "";
361                 for (Text text : fragments) {
362                     name += text;
363                 }
364                 source.put(fieldName, name);
365             }
366
367             list.add(source);
368         }
369         map.put("rows", list);
370
371         return map;
372     }
373
374     /**
375      * or条件查询高亮
376      *
377      * @param type 类型
378      * @param shouldMap or条件和值
379      * @param from 开始行数
380      * @param size 每页大小
381      * @return
382      */
383     public static Map<String, Object> multiOrSearchDocHigh(String type, Map<String, String> shouldMap, int from,
384             int size) {
385         TransportClient client = getClient();
386
387         SearchRequestBuilder responsebuilder = client.prepareSearch(indexname).setTypes(type);
388         responsebuilder.setFrom(from);
389         responsebuilder.setSize(size);
390         responsebuilder.setExplain(true);
391
392         // 高亮
393         HighlightBuilder hiBuilder = new HighlightBuilder();
394         hiBuilder.preTags("<span style=\"color:red\">");
395         hiBuilder.postTags("</span>");
396
397         // 高亮每个字段
398         for (String key : shouldMap.keySet()) {
399             hiBuilder.field(key);
400         }
401
402         responsebuilder.highlighter(hiBuilder);
403
404         if (null != shouldMap && shouldMap.size() > 0) {
405             // 创建一个查询
406             BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery();
407
408             // 这里查询的条件用map传递
409             for (String key : shouldMap.keySet()) {
410                 queryBuilder.should(QueryBuilders.matchPhraseQuery(key, shouldMap.get(key)));// or连接条件
411             }
412             // 查询
413             responsebuilder.setQuery(queryBuilder);
414         }
415
416         SearchResponse myresponse = responsebuilder.execute().actionGet();
417         SearchHits searchHits = myresponse.getHits();
418
419         // 总命中数
420         long total = searchHits.getTotalHits();
421         Map<String, Object> map = new HashMap<String, Object>();
422         map.put("total", total);
423         List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
424         for (int i = 0; i < searchHits.getHits().length; i++) {
425             Map<String, HighlightField> highlightFields = searchHits.getHits()[i].getHighlightFields();
426             Map<String, Object> source = searchHits.getHits()[i].getSource();
427
428             for (String key : shouldMap.keySet()) {
429                 // 各个段进行高亮
430                 HighlightField titleField = highlightFields.get(key);
431                 if (titleField != null) {
432                     Text[] fragments = titleField.fragments();
433                     String name = "";
434                     for (Text text : fragments) {
435                         name += text;
436                     }
437                     source.put(key, name);
438                 }
439             }
440
441             list.add(source);
442         }
443         map.put("rows", list);
444
445         return map;
446     }
447
448     /**
449      * 搜索
450      *
451      * @param type 类型
452      * @param fieldName 待搜索的字段
453      * @param keyword 待搜索的关键词
454      * @param from 开始行数
455      * @param size 每页大小
456      * @return
457      */
458     public static Map<String, Object> searchDoc(String type, String fieldName, String keyword, int from, int size) {
459         List<String> hitResult = new ArrayList<String>();
460
461         TransportClient client = getClient();
462
463         QueryBuilder queryBuilder = QueryBuilders.matchPhraseQuery(fieldName, keyword);
464
465         SearchRequestBuilder responsebuilder = client.prepareSearch(indexname).setTypes(type);
466         responsebuilder.setQuery(queryBuilder);
467         responsebuilder.setFrom(from);
468         responsebuilder.setSize(size);
469         responsebuilder.setExplain(true);
470
471         SearchResponse myresponse = responsebuilder.execute().actionGet();
472         SearchHits hits = myresponse.getHits();
473         for (int i = 0; i < hits.getHits().length; i++) {
474             hitResult.add(hits.getHits()[i].getSourceAsString());
475         }
476
477         // 将命中结果转换成Map输出
478         Map<String, Object> modelMap = new HashMap<String, Object>(2);
479         modelMap.put("total", hitResult.size());
480         modelMap.put("rows", hitResult);
481
482         return modelMap;
483     }
484
485     /**
486      * 多个条件进行or查询
487      *
488      * @param type 类型
489      * @param shouldMap 进行or查询的段和值
490      * @param from 开始行数
491      * @param size 每页大小
492      * @return
493      */
494     public static Map<String, Object> multiOrSearchDoc(String type, Map<String, String> shouldMap, int from, int size) {
495         List<String> hitResult = new ArrayList<String>();
496
497         TransportClient client = getClient();
498
499         SearchRequestBuilder responsebuilder = client.prepareSearch(indexname).setTypes(type);
500         responsebuilder.setFrom(from);
501         responsebuilder.setSize(size);
502         responsebuilder.setExplain(true);
503
504         if (null != shouldMap && shouldMap.size() > 0) {
505             // 创建一个查询
506             BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery();
507
508             // 这里查询的条件用map传递
509             for (String key : shouldMap.keySet()) {
510                 queryBuilder.should(QueryBuilders.matchPhraseQuery(key, shouldMap.get(key)));// or连接条件
511             }
512             // 查询
513             responsebuilder.setQuery(queryBuilder);
514         }
515
516         SearchResponse myresponse = responsebuilder.execute().actionGet();
517         SearchHits hits = myresponse.getHits();
518         for (int i = 0; i < hits.getHits().length; i++) {
519             hitResult.add(hits.getHits()[i].getSourceAsString());
520         }
521
522         // 将命中结果转换成Map输出
523         Map<String, Object> modelMap = new HashMap<String, Object>(2);
524         modelMap.put("total", hitResult.size());
525         modelMap.put("rows", hitResult);
526
527         return modelMap;
528     }
529
530     /**
531      * 多个条件进行and查询
532      *
533      * @param type 类型
534      * @param mustMap 进行and查询的段和值
535      * @param from 开始行数
536      * @param size 每页大小
537      * @return
538      */
539     public static Map<String, Object> multiAndSearchDoc(String type, Map<String, String> mustMap, int from, int size) {
540         List<String> hitResult = new ArrayList<String>();
541
542         TransportClient client = getClient();
543
544         SearchRequestBuilder responsebuilder = client.prepareSearch(indexname).setTypes(type);
545         responsebuilder.setFrom(from);
546         responsebuilder.setSize(size);
547         responsebuilder.setExplain(true);
548
549         if (null != mustMap && mustMap.size() > 0) {
550             // 创建一个查询
551             BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery();
552
553             // 这里查询的条件用map传递
554             for (String key : mustMap.keySet()) {
555                 queryBuilder.must(QueryBuilders.matchPhraseQuery(key, mustMap.get(key)));// and查询
556             }
557             // 查询
558             responsebuilder.setQuery(queryBuilder);
559         }
560
561         SearchResponse myresponse = responsebuilder.execute().actionGet();
562         SearchHits hits = myresponse.getHits();
563         for (int i = 0; i < hits.getHits().length; i++) {
564             hitResult.add(hits.getHits()[i].getSourceAsString());
565         }
566
567         // 将命中结果转换成Map输出
568         Map<String, Object> modelMap = new HashMap<String, Object>(2);
569         modelMap.put("total", hitResult.size());
570         modelMap.put("rows", hitResult);
571
572         return modelMap;
573     }
574 }

ElasticSearchUtilsImp.java

ElasticSearch调用类,是对实现类的各种组合,供外部调用。调用类名称:ElasticSearchUtils.java

  1 package com.blog.utils;
  2
  3 import java.util.Map;
  4
  5 /**
  6  * @author:Tim
  7  * @date:2017年5月3日 下午8:24:22
  8  * @description:ElasticSearch助手类
  9  */
 10 public class ElasticSearchUtils {
 11
 12     /**
 13      * 将一个Map格式的数据(key,value)插入索引(指定_id,一般是业务数据的id,及elasticSearch和关系型数据使用同一个id,方便同关系型数据库互动)
 14      *
 15      * @param type 类型(对应数据库表)
 16      * @param docId id,对应elasticSearch中的_id字段
 17      * @param mapParam Map格式的数据
 18      * @return
 19      */
 20     public static boolean addDoc(String type, String docId, Map<String, String> mapParam) {
 21         return ElasticSearchUtilsImp.addMapDocToIndex(type, docId, mapParam);
 22     }
 23
 24     /**
 25      * 将一个Map格式的数据(key,value)插入索引 (使用默认_id)
 26      *
 27      * @param type 类型(对应数据库表)
 28      * @param mapParam Map格式的数据
 29      * @return
 30      */
 31     public static boolean addDoc(String type, Map<String, String> mapParam) {
 32         return ElasticSearchUtilsImp.addMapDocToIndex(type, null, mapParam);
 33     }
 34
 35     /**
 36      * 将一个实体存入到默认索引的类型中(默认_id)
 37      *
 38      * @param type 类型(对应数据库表)
 39      * @param entity 要插入的实体
 40      * @param methodNameParm 需要将实体中哪些属性作为字段
 41      * @return
 42      */
 43     public static boolean addDoc(String type, Object entity, String... methodNameParm) {
 44         return ElasticSearchUtilsImp.addEntityDoc(type, null, entity, methodNameParm);
 45     }
 46
 47     /**
 48      * 将一个实体存入到默认索引的类型中(指定_id,一般是业务数据的id,及elasticSearch和关系型数据使用同一个id,方便同关系型数据库互动)
 49      *
 50      * @param type 类型(对应数据库表)
 51      * @param docId id,对应elasticSearch中的_id字段
 52      * @param entity 要插入的实体
 53      * @param methodNameParm 需要将实体中哪些属性作为字段
 54      * @return
 55      */
 56     public static boolean addDoc(String type, String docId, Object entity, String... methodNameParm) {
 57         return ElasticSearchUtilsImp.addEntityDoc(type, docId, entity, methodNameParm);
 58     }
 59
 60     /**
 61      * 删除文档
 62      *
 63      * @param type 类型(对应数据库表)
 64      * @param docId 类型中id
 65      * @return
 66      */
 67     public static boolean deleteDoc(String type, String docId) {
 68         return ElasticSearchUtilsImp.deleteDoc(type, docId);
 69     }
 70
 71     /**
 72      * 修改文档
 73      *
 74      * @param type 类型
 75      * @param docId 文档id
 76      * @param updateParam 需要修改的字段和值
 77      * @return
 78      */
 79     public static boolean updateDoc(String type, String docId, Map<String, String> updateParam) {
 80         return ElasticSearchUtilsImp.updateDoc(type, docId, updateParam);
 81     }
 82
 83     // --------------------以下是各种搜索方法--------------------------
 84
 85     /**
 86      * 高亮搜索
 87      *
 88      * @param type 类型
 89      * @param fieldName 段
 90      * @param keyword 段值
 91      * @return
 92      */
 93     public static Map<String, Object> searchDocHighlight(String type, String fieldName, String keyword) {
 94         return ElasticSearchUtilsImp.searchDocHighlight(type, fieldName, keyword, 0, 10);
 95     }
 96
 97     /**
 98      * 高亮搜索
 99      *
100      * @param type 类型
101      * @param fieldName 段
102      * @param keyword 关键词
103      * @param from 开始行数
104      * @param size 每页大小
105      * @return
106      */
107     public static Map<String, Object> searchDocHighlight(String type, String fieldName, String keyword, int from,
108             int size) {
109         return ElasticSearchUtilsImp.searchDocHighlight(type, fieldName, keyword, from, size);
110     }
111
112     /**
113      * or条件查询高亮
114      *
115      * @param type 类型
116      * @param shouldMap or条件和值
117      * @return
118      */
119     public static Map<String, Object> multiOrSearchDocHigh(String type, Map<String, String> shouldMap, int from,
120             int size) {
121         return ElasticSearchUtilsImp.multiOrSearchDocHigh(type, shouldMap, from, size);
122     }
123
124     /**
125      * 搜索
126      *
127      * @param type 类型
128      * @param fieldName 待搜索的字段
129      * @param keyword 待搜索的关键词
130      */
131     public static Map<String, Object> searchDoc(String type, String fieldName, String keyword) {
132         return ElasticSearchUtilsImp.searchDoc(type, fieldName, keyword, 0, 10);
133     }
134
135     /**
136      * 多个条件进行or查询
137      *
138      * @param type 类型
139      * @param shouldMap 进行or查询的段和值
140      * @return
141      */
142     public static Map<String, Object> multiOrSearchDoc(String type, Map<String, String> shouldMap) {
143         return ElasticSearchUtilsImp.multiOrSearchDoc(type, shouldMap, 0, 10);
144     }
145
146     /**
147      * 多个条件进行and查询
148      *
149      * @param type 类型
150      * @param mustMap 进行and查询的段和值
151      * @return
152      */
153     public static Map<String, Object> multiAndSearchDoc(String type, Map<String, String> mustMap) {
154         return ElasticSearchUtilsImp.multiAndSearchDoc(type, mustMap, 0, 10);
155     }
156 }

会使用到的其他助手类:StringUtils.java

 1 package com.blog.utils;
 2
 3 import java.util.Map;
 4
 5 import net.sf.json.JSONObject;
 6
 7 /**
 8  * @author:Tim
 9  * @date:2017年5月6日 上午11:56:37
10  * @description:字符串助手类
11  */
12 public class StringUtils {
13
14     /**
15      * 将Map转换成json字符串
16      *
17      * @param map Map<String, Object>格式数据
18      * @return json数据
19      */
20     public static String map2String(Map<String, Object> map) {
21         return JSONObject.fromObject(map).toString();
22     }
23
24     /**
25      * 首字母转小写
26      *
27      * @param s 待转换的字符串
28      * @return
29      */
30     public static String toLowerCaseFirstOne(String s) {
31         if (Character.isLowerCase(s.charAt(0)))
32             return s;
33         else
34             return (new StringBuilder()).append(Character.toLowerCase(s.charAt(0))).append(s.substring(1)).toString();
35     }
36 }

StringUtils.java

具体的使用在我的另一个项目中有使用实例,该项目使用这个助手类实现了索引的各种操作,以及搜索展现功能。项目位置:https://github.com/yangtzeyufei/EasyBlog

时间: 2024-11-03 03:35:10

ElasticSearch安装和使用的相关文章

ElasticSearch安装

1.ElasticSearch安装的准备工作 Linux:CentOS Elasticsearc:elasticsearch-2.2.0 JDK:jdk-7u79-linux-x64 IK:1.8.0 MAVEN:apache-maven-3.3.3-bin 2.配置网络静态文件 虚拟机设置桥接模式 配置:vim /etc/sysconfig/network-scripts/ifcfg-eth0 DEVICE :网卡代号,需要ifcfg-eth0相对应 HWADDR:网卡地址 即MAC地址 BO

elk中elasticsearch安装启动报错

elasticsearch安装之后.启动报错.elasticsearch版本为5.4.1 下载安装: wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-5.4.1.tar.gz tar zxf elasticsearch-5.4.1.tar.gz mv elasticsearch-5.4.1 /usr/local/elasticsearch cd /usr/local/elasticsearch/ ./

ELK部署之ElasticSearch 安装

ElasticSearch 个基于Lucene的搜索服务器:可以使用多节点的备份:集群设置: (类似是个数据库型.有索引有什么的).(lucene apache 基金的全文检索引擎的架构) 1. ElasticSearch 安装使用: 软件 架构  安装时第一步: 检测JDK环境在8版以上:如果已经有了可以安装卸载掉 yum remove jdk 如果还没卸载干净 就直接 # yum groupremove java 2. 安装JDK 解压源码 配置环境变量: # tar -xf jdk-8u9

分布式搜索引擎Elasticsearch安装配置

分布式搜索引擎Elasticsearch 介绍 Elasticsearch是一个基于Lucene的开源分布式搜索引擎,具有分布式多用户能力.Elasticsearch是用java开发,提供Restful接口,能够达到实时搜索.高性能计算:同时Elasticsearch的横向扩展能力非常强,不需要重启服务,基本上达到了零配置.但是目前来说相关资料很少,同时版本更新很快,bug存在,API繁多并且变化. 概念和设计 索引 索引(index)是Elasticsearch存放数据的地方.如果你熟悉关系型

Elasticsearch笔记(一)—Elasticsearch安装配置

原文链接:https://my.oschina.net/jhao104/blog/644909 摘要: ElasticSearch是一个基于Lucene的搜索服务器.它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口.Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布,是当前流行的企业级搜索引擎.设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便. 一.安装Elasticsearch ·安装Elasticsearch唯

Elasticsearch 安装的时候,Unsupported major.minor version 51.0问题的解决

Elasticsearch安装的时候报错 bootstrap/Elasticsearch : Unsupported major.minor version 51.0 网上一般说的方法是,升级或者降级jdk版本,我用了还是没有解决(我jdk原来是1.6 后来升级到1.8). 其实增加环境变量ES_HEAP_SIZE,值为:256m(或者512m),要带m,不是纯数字.这是分配最大和最小的存储容量. 主要是网上的安装文章通常是告诉你配置jdk 然后直接运行,但是没有设置这个变量导致的. 具体可以参

ElasticSearch安装ik分词插件

一.IK简介 IK Analyzer是一个开源的,基于java语言开发的轻量级的中文分词工具包.最初,它是以开源项目Luence为应用主体的,结合词典分词和文法分析算法的中文分词组件.从3.0版本开 始,IK发展为面向Java的公用分词组件,独立于Lucene项目,同时提供了对Lucene的默认优化实现.在2012版本中,IK实现了简单的分词 歧义排除算法,标志着IK分词器从单纯的词典分词向模拟语义分词衍化. 二.安装IK分词插件 1.获取分词的依赖包 通过git clone https://g

Elasticsearch安装IK中文分词插件

一,从github上下载最新的Ik分词源码到本地 git clone https://github.com/medcl/elasticsearch-analysis-ik clone到本地后,将elasticsearch-analysis-ik目录中的 config/ik/ 整个目录拷贝到Elasticsearch安装目录的config目录下. 二,将elasticsearch-analysis-ik目录下的config中的elasticsearch.yml文件覆盖Elasticsearch安装

ELK笔记(一)elasticsearch安装

未来一段时间,可能会学习ELK日志处理的框架.在学习的过程中,会通过<实战ELK--分布式大数据搜索与日志挖掘及可视化解决方案>.<Elasticsearch中文指南>及各大论坛相关技术贴完成自己的学习过程.在学习的过程中,我会通过笔记的形式将一些技术点或知识记录在此,不仅希望以后自己需要的时候直接来查阅,更是希望能够帮助更多的人.该系列笔记仅仅是个人学习中的点滴记录,如果存在什么知识点错误等,欢迎广大同仁批评指导. 一.Elasticsearch安装 项目网站:https://w

ELK-5.4.1搭建日志管理系统(一)Elasticsearch安装

Elasticsearch 安装 安装环境 操作系统:CentOS 6.6 IP地址:192.168.5.81 软件包:系统自带yum源 关闭防火墙 关闭SELinux 安装前准备 elasticsearch基于java环境运行,使用前需要在服务器中安装jdk.elasticsearch5.4需要jdk8以上版本.(本文不介绍如何安装jdk) 下载安装elasticsearch # cd /software# curl -L -O https://artifacts.elastic.co/dow