首页 > 代码库 > ElasticSearch安装和使用

ElasticSearch安装和使用

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

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

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

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

Ubuntu系统安装 Elasticsearch5

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

1 $ sudo apt-get update2 $ sudo apt-get upgrade3  4 $ sudo apt-get install software-properties-common5 $ sudo add-apt-repository ppa:webupd8team/java6 $ sudo apt-get update7  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.list3  4 $ sudo apt-get update5 $ 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/latest2  3 $ sudo /etc/init.d/elasticsearch restart4  * 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=elasticsearchcluster_serverip=127.0.0.1indexname=blogsystem

 

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

appender.console.type = Consoleappender.console.name = consoleappender.console.layout.type = PatternLayoutrootLogger.level = inforootLogger.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      * 将实体转换成json104      * 105      * @param entity 实体106      * @param fieldNameParm 实体中待转换成json的字段107      * @return 返回json108      * @throws Exception109      */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 = http://www.mamicode.com/(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      * @return149      */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             // 使用默认的id165             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         // 关闭client185         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      * @return199      */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             // 使用默认的id215             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         // 关闭client235         client.close();236 237         return result;238     }239 240     /**241      * 删除文档242      * 243      * @param type 类型(对应数据库表)244      * @param docId 类型中id245      * @return246      */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         // 关闭client259         client.close();260 261         return result;262     }263 264     /**265      * 修改文档266      * 267      * @param type 类型268      * @param docId 文档id269      * @param updateParam 需要修改的字段和值270      * @return271      */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      * @return308      */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      * @return324      */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      * @return382      */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      * @return457      */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      * @return493      */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      * @return538      */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      * @return106      */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      * @return118      */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      * @return141      */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      * @return152      */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:3710  * @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      * @return29      */30     public static String toLowerCaseFirstOne(String s) {31         if (Character.isLowerCase(s.charAt(0)))32             return s;33         else34             return (new StringBuilder()).append(Character.toLowerCase(s.charAt(0))).append(s.substring(1)).toString();35     }36 }
StringUtils.java

 

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

ElasticSearch安装和使用