ElasticSearch5在Ubuntu系统下的安装和Java调用
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
package com.blog.utils; import java.io.IOException; import java.io.InputStream; import java.lang.reflect.Method; import java.net.InetAddress; import java.net.UnknownHostException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Properties; import java.util.concurrent.ExecutionException; import org.elasticsearch.action.delete.DeleteResponse; import org.elasticsearch.action.index.IndexResponse; import org.elasticsearch.action.search.SearchRequestBuilder; import org.elasticsearch.action.search.SearchResponse; import org.elasticsearch.action.update.UpdateRequest; import org.elasticsearch.client.transport.TransportClient; import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.text.Text; import org.elasticsearch.common.transport.InetSocketTransportAddress; import org.elasticsearch.common.xcontent.XContentBuilder; import org.elasticsearch.common.xcontent.XContentFactory; import org.elasticsearch.index.query.BoolQueryBuilder; import org.elasticsearch.index.query.QueryBuilder; import org.elasticsearch.index.query.QueryBuilders; import org.elasticsearch.rest.RestStatus; import org.elasticsearch.search.SearchHits; import org.elasticsearch.search.aggregations.AggregationBuilders; import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder; import org.elasticsearch.search.fetch.subphase.highlight.HighlightField; import org.elasticsearch.transport.client.PreBuiltTransportClient; /** * @author:Tim * @date:2017年5月3日 下午8:24:22 * @description:ElasticSearch助手类具体实现 */ public class ElasticSearchUtilsImp { private static String cluster_name = null;// 实例名称 private static String cluster_serverip = null;// elasticSearch服务器ip private static String indexname = null;// 索引名称 static { try { // 读取db.properties文件 Properties props = new Properties(); InputStream in = ElasticSearchUtilsImp.class.getResourceAsStream("/elasticsearch.properties"); props.load(in);// 加载文件 // 读取信息 cluster_name = props.getProperty("cluster_name"); cluster_serverip = props.getProperty("cluster_serverip"); indexname = props.getProperty("indexname"); } catch (IOException e) { e.printStackTrace(); System.out.println("加载数据库配置文件出错!"); } } /** * 返回一个到ElasticSearch的连接客户端 * * @return */ private static TransportClient getClient() { Settings settings = Settings.builder().put("cluster.name", cluster_name).build();// 设置集群名称 @SuppressWarnings("unchecked") TransportClient client = new PreBuiltTransportClient(settings);// 创建client try { client.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName(cluster_serverip), 9300));// 增加地址和端口 } catch (UnknownHostException e) { e.printStackTrace(); System.out.println("ElasticSearch连接失败!"); } return client; } /** * 将Map转换成builder * * @param mapParam * @return * @throws Exception */ private static XContentBuilder createMapJson(Map<String, String> mapParam) throws Exception { XContentBuilder source = XContentFactory.jsonBuilder().startObject(); for (Map.Entry<String, String> entry : mapParam.entrySet()) { source.field(entry.getKey(), entry.getValue()); } source.endObject(); return source; } /** * 将实体转换成json * * @param entity 实体 * @param fieldNameParm 实体中待转换成json的字段 * @return 返回json * @throws Exception */ private static XContentBuilder createEntityJson(Object entity, String... methodNameParm) throws Exception { // 创建json对象, 其中一个创建json的方式 XContentBuilder source = XContentFactory.jsonBuilder().startObject(); try { for (String methodName : methodNameParm) { if (!methodName.startsWith("get")) { throw new Exception("不是有效的属性!"); } Method method = entity.getClass().getMethod(methodName, null); String fieldValue = (String) method.invoke(entity, null); String fieldName = StringUtils.toLowerCaseFirstOne(methodName.replace("get", ""));// 去掉“get”,并将首字母小写 // 避免和elasticSearch中id字段重复 if (fieldName == "_id") { fieldName = "id"; } source.field(fieldName, fieldValue); } } catch (NoSuchMethodException e) { e.printStackTrace(); System.out.println("未找到方法!"); } source.endObject(); return source; } /** * 将一个Map格式的数据(key,value)插入索引 (私有方法) * * @param type 类型(对应数据库表) * @param docId id,对应elasticSearch中的_id字段 * @param mapParam Map格式的数据 * @return */ public static boolean addMapDocToIndex(String type, String docId, Map<String, String> mapParam) { boolean result = false; TransportClient client = getClient(); XContentBuilder source = null; try { source = createMapJson(mapParam); } catch (Exception e) { e.printStackTrace(); } // 存json入索引中 IndexResponse response = null; if (docId == null) { // 使用默认的id response = client.prepareIndex(indexname, type).setSource(source).get(); } else { response = client.prepareIndex(indexname, type, docId).setSource(source).get(); } // 插入结果获取 String index = response.getIndex(); String gettype = response.getType(); String id = response.getId(); long version = response.getVersion(); RestStatus status = response.status(); String strResult = "新增文档成功:" + index + " : " + gettype + ": " + id + ": " + version + ": " + status.getStatus(); System.out.println(strResult); if (status.getStatus() == 201) { result = true; } // 关闭client client.close(); return result; } /** * 将一个实体存入到默认索引的类型中(指定_id,一般是业务数据的id,及elasticSearch和关系型数据使用同一个id,方便同关系型数据库互动) * (私有方法) * * @param type 类型(对应数据库表) * @param docId id,对应elasticSearch中的_id字段 * @param entity 要插入的实体 * @param methodNameParm 需要将实体中哪些属性作为字段 * @return */ public static boolean addEntityDoc(String type, String docId, Object entity, String... methodNameParm) { boolean result = false; TransportClient client = getClient(); XContentBuilder source = null; try { source = createEntityJson(entity, methodNameParm); } catch (Exception e) { e.printStackTrace(); } // 存json入索引中 IndexResponse response = null; if (docId == null) { // 使用默认的id response = client.prepareIndex(indexname, type).setSource(source).get(); } else { response = client.prepareIndex(indexname, type, docId).setSource(source).get(); } // 插入结果获取 String index = response.getIndex(); String gettype = response.getType(); String id = response.getId(); long version = response.getVersion(); RestStatus status = response.status(); String strResult = "新增文档成功:" + index + " : " + gettype + ": " + id + ": " + version + ": " + status.getStatus(); System.out.println(strResult); if (status.getStatus() == 201) { result = true; } // 关闭client client.close(); return result; } /** * 删除文档 * * @param type 类型(对应数据库表) * @param docId 类型中id * @return */ public static boolean deleteDoc(String type, String docId) { boolean result = false; TransportClient client = getClient(); DeleteResponse deleteresponse = client.prepareDelete(indexname, type, docId).get(); System.out.println("删除结果:" + deleteresponse.getResult().toString()); if (deleteresponse.getResult().toString() == "DELETED") { result = true; } // 关闭client client.close(); return result; } /** * 修改文档 * * @param type 类型 * @param docId 文档id * @param updateParam 需要修改的字段和值 * @return */ public static boolean updateDoc(String type, String docId, Map<String, String> updateParam) { String strResult = ""; boolean result = false; TransportClient client = getClient(); UpdateRequest updateRequest = new UpdateRequest(); updateRequest.index(indexname); updateRequest.type(type); updateRequest.id(docId); try { updateRequest.doc(createMapJson(updateParam)); } catch (Exception e) { e.printStackTrace(); } try { strResult = client.update(updateRequest).get().getResult().toString(); } catch (InterruptedException e) { e.printStackTrace(); } catch (ExecutionException e) { e.printStackTrace(); } System.out.println(strResult); if (strResult == "UPDATED") { result = true; } return result; } /** * TODO or查询命中条数 * @param type 类型 * @param shouldMap 查询条件 * @return */ public static int multiOrSearchDocCount(String type, Map<String, String> shouldMap) { TransportClient client = getClient(); return 0; } /** * 高亮搜索 * * @param type 类型 * @param fieldName 段 * @param keyword 关键词 * @param from 开始行数 * @param size 每页大小 * @return */ public static Map<String, Object> searchDocHighlight(String type, String fieldName, String keyword, int from, int size) { TransportClient client = getClient(); // 高亮 HighlightBuilder hiBuilder = new HighlightBuilder(); hiBuilder.preTags("<span style=\"color:red\">"); hiBuilder.postTags("</span>"); hiBuilder.field(fieldName); QueryBuilder queryBuilder = QueryBuilders.matchPhraseQuery(fieldName, keyword); SearchRequestBuilder responsebuilder = client.prepareSearch(indexname).setTypes(type); responsebuilder.setQuery(queryBuilder); responsebuilder.highlighter(hiBuilder); responsebuilder.setFrom(from); responsebuilder.setSize(size); responsebuilder.setExplain(true); SearchResponse myresponse = responsebuilder.execute().actionGet(); SearchHits searchHits = myresponse.getHits(); // 总命中数 long total = searchHits.getTotalHits(); Map<String, Object> map = new HashMap<String, Object>(); map.put("total", total); List<Map<String, Object>> list = new ArrayList<Map<String, Object>>(); for (int i = 0; i < searchHits.getHits().length; i++) { Map<String, HighlightField> highlightFields = searchHits.getHits()[i].getHighlightFields(); // 段高亮 HighlightField titleField = highlightFields.get(fieldName); Map<String, Object> source = searchHits.getHits()[i].getSource(); if (titleField != null) { Text[] fragments = titleField.fragments(); String name = ""; for (Text text : fragments) { name += text; } source.put(fieldName, name); } list.add(source); } map.put("rows", list); return map; } /** * or条件查询高亮 * * @param type 类型 * @param shouldMap or条件和值 * @param from 开始行数 * @param size 每页大小 * @return */ public static Map<String, Object> multiOrSearchDocHigh(String type, Map<String, String> shouldMap, int from, int size) { TransportClient client = getClient(); SearchRequestBuilder responsebuilder = client.prepareSearch(indexname).setTypes(type); responsebuilder.setFrom(from); responsebuilder.setSize(size); responsebuilder.setExplain(true); // 高亮 HighlightBuilder hiBuilder = new HighlightBuilder(); hiBuilder.preTags("<span style=\"color:red\">"); hiBuilder.postTags("</span>"); // 高亮每个字段 for (String key : shouldMap.keySet()) { hiBuilder.field(key); } responsebuilder.highlighter(hiBuilder); if (null != shouldMap && shouldMap.size() > 0) { // 创建一个查询 BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery(); // 这里查询的条件用map传递 for (String key : shouldMap.keySet()) { queryBuilder.should(QueryBuilders.matchPhraseQuery(key, shouldMap.get(key)));// or连接条件 } // 查询 responsebuilder.setQuery(queryBuilder); } SearchResponse myresponse = responsebuilder.execute().actionGet(); SearchHits searchHits = myresponse.getHits(); // 总命中数 long total = searchHits.getTotalHits(); Map<String, Object> map = new HashMap<String, Object>(); map.put("total", total); List<Map<String, Object>> list = new ArrayList<Map<String, Object>>(); for (int i = 0; i < searchHits.getHits().length; i++) { Map<String, HighlightField> highlightFields = searchHits.getHits()[i].getHighlightFields(); Map<String, Object> source = searchHits.getHits()[i].getSource(); for (String key : shouldMap.keySet()) { // 各个段进行高亮 HighlightField titleField = highlightFields.get(key); if (titleField != null) { Text[] fragments = titleField.fragments(); String name = ""; for (Text text : fragments) { name += text; } source.put(key, name); } } list.add(source); } map.put("rows", list); return map; } /** * 搜索 * * @param type 类型 * @param fieldName 待搜索的字段 * @param keyword 待搜索的关键词 * @param from 开始行数 * @param size 每页大小 * @return */ public static Map<String, Object> searchDoc(String type, String fieldName, String keyword, int from, int size) { List<String> hitResult = new ArrayList<String>(); TransportClient client = getClient(); QueryBuilder queryBuilder = QueryBuilders.matchPhraseQuery(fieldName, keyword); SearchRequestBuilder responsebuilder = client.prepareSearch(indexname).setTypes(type); responsebuilder.setQuery(queryBuilder); responsebuilder.setFrom(from); responsebuilder.setSize(size); responsebuilder.setExplain(true); SearchResponse myresponse = responsebuilder.execute().actionGet(); SearchHits hits = myresponse.getHits(); for (int i = 0; i < hits.getHits().length; i++) { hitResult.add(hits.getHits()[i].getSourceAsString()); } // 将命中结果转换成Map输出 Map<String, Object> modelMap = new HashMap<String, Object>(2); modelMap.put("total", hitResult.size()); modelMap.put("rows", hitResult); return modelMap; } /** * 多个条件进行or查询 * * @param type 类型 * @param shouldMap 进行or查询的段和值 * @param from 开始行数 * @param size 每页大小 * @return */ public static Map<String, Object> multiOrSearchDoc(String type, Map<String, String> shouldMap, int from, int size) { List<String> hitResult = new ArrayList<String>(); TransportClient client = getClient(); SearchRequestBuilder responsebuilder = client.prepareSearch(indexname).setTypes(type); responsebuilder.setFrom(from); responsebuilder.setSize(size); responsebuilder.setExplain(true); if (null != shouldMap && shouldMap.size() > 0) { // 创建一个查询 BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery(); // 这里查询的条件用map传递 for (String key : shouldMap.keySet()) { queryBuilder.should(QueryBuilders.matchPhraseQuery(key, shouldMap.get(key)));// or连接条件 } // 查询 responsebuilder.setQuery(queryBuilder); } SearchResponse myresponse = responsebuilder.execute().actionGet(); SearchHits hits = myresponse.getHits(); for (int i = 0; i < hits.getHits().length; i++) { hitResult.add(hits.getHits()[i].getSourceAsString()); } // 将命中结果转换成Map输出 Map<String, Object> modelMap = new HashMap<String, Object>(2); modelMap.put("total", hitResult.size()); modelMap.put("rows", hitResult); return modelMap; } /** * 多个条件进行and查询 * * @param type 类型 * @param mustMap 进行and查询的段和值 * @param from 开始行数 * @param size 每页大小 * @return */ public static Map<String, Object> multiAndSearchDoc(String type, Map<String, String> mustMap, int from, int size) { List<String> hitResult = new ArrayList<String>(); TransportClient client = getClient(); SearchRequestBuilder responsebuilder = client.prepareSearch(indexname).setTypes(type); responsebuilder.setFrom(from); responsebuilder.setSize(size); responsebuilder.setExplain(true); if (null != mustMap && mustMap.size() > 0) { // 创建一个查询 BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery(); // 这里查询的条件用map传递 for (String key : mustMap.keySet()) { queryBuilder.must(QueryBuilders.matchPhraseQuery(key, mustMap.get(key)));// and查询 } // 查询 responsebuilder.setQuery(queryBuilder); } SearchResponse myresponse = responsebuilder.execute().actionGet(); SearchHits hits = myresponse.getHits(); for (int i = 0; i < hits.getHits().length; i++) { hitResult.add(hits.getHits()[i].getSourceAsString()); } // 将命中结果转换成Map输出 Map<String, Object> modelMap = new HashMap<String, Object>(2); modelMap.put("total", hitResult.size()); modelMap.put("rows", hitResult); return modelMap; } }
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
具体的使用在我的另一个项目中有使用实例,该项目使用这个助手类实现了索引的各种操作,以及搜索展现功能。项目位置:https://github.com/yangtzeyufei/EasyBlog
ElasticSearch5在Ubuntu系统下的安装和Java调用的更多相关文章
- Ubuntu系统下环境安装遇到依赖冲突问题
问题场景:在ubuntu系统下使用docker拉了一个python3.6的镜像,要在该容器中安装vim结果总是报已安装某些依赖的版本不满足要求 解决方法: 1.安装aptitude apt-get i ...
- 虚拟机Ubuntu系统下kaldi安装与编译简介
kaldi官网:http://www.kaldi-asr.org/doc/index.html 在http://github.com/kaldi-asr/kaldi中直接下载kaldi的zip包,没有 ...
- Ubuntu 系统下如何安装pip3工具
一.[导读]Ubuntu 系统内置了 Python2 和 Python3 两个版本的开发环境,却没有内置相应的 pip3 管理工具,本文将介绍如何在Ubuntu下如何快速安装 pip3 工具,并升级到 ...
- ubuntu系统下手动安装autoconf安装包
首先简单介绍一下autoconf.Autoconf是一个可以适应多种unix类系统的shell脚本的工具. 我在往虚拟机中安装应用时,需要用到该工具,于是想下载一个.但是由于系统内核版本低,已不能用a ...
- Ubuntu 系统下 mongodb 安装和配置
安装 MongoDB sudo apt-get install mongodb sudo apt-get install mongodb 关闭/启动 sudo service mongodb stop ...
- ubuntu系统下怎么安装gcc编译器
你安装一个名字叫做build-essential的软件包,就可以一次将编译器.make工具.所有的编程头文件.函数库等东东全部安装上,其中也包括gcc编译器,这是非常稳妥的安装方式,安装命令是用roo ...
- Ubuntu系统下,pip3安装python3的pymysql包 报错的问题
sudo pip3 --version 查看pip3的版本 sudo pip3 install --upgrade pip 更新pip3 sudo pip3 list 查看安装的包列表 如上图, p ...
- Python 基础之在ubuntu系统下安装双版本python
前言:随着python升级更新,新版本较于老版本功能点也有不同地方,作为一个初学者应该了解旧版本的规则,也要继续学习新版本的知识.为了能更好去学习python,我在ubuntu安装python2和py ...
- Tex_安装_在Ubuntu系统下
$\LaTeX$是一个强大的排版软件,在数学公式.表格.甚至是科学绘图方面有着独特优势.本文在Ubuntu系统下,整理Tex安装相关的操作,以为备忘.所引链接都未同作者商量,如有不妥望及时告知. 命令 ...
随机推荐
- yii2.0使用之缓存
1.片段缓存(针对于视图中的某部分进行缓存): <?php 设置有效时间 $time=15; 缓存依赖,存入文件.当文件内容发生改变是才会刷新新内容 $dependecy=[ 'class'=& ...
- Linux云自动化运维第五课
Linux云自动化运维第五课 一.进程定义 进程就是cpu未完成的工作 二.ps命令 ps a ###关于当前环境的所有进程 x ###与当前环境无关的所有进程 f ###显示进程从属关系 e ### ...
- 串的模式匹配和KMP算法
在对字符串的操作中,我们经常要用到子串的查找功能,我们称子串为模式串,模式串在主串中的查找过程我们成为模式匹配,KMP算法就是一个高效的模式匹配算法.KMP算法是蛮力算法的一种改进,下面我们先来介绍蛮 ...
- 2017-3-28 javaScript DOM 操作
一.DOM的基本概念:DOM是文档对象模型,这种模型为树模型:文档是指标签文档:对象是指文档中每个元素:模型是指抽象化得东西. 二.Windows 对象操作:1.属性和方法:属性(值或者子对象):o ...
- Linux环境下的IDE,极大提升编程效率
"一个真正的程序员是不用IDE(译者注:集成开发环境)的,他们都是用带着某某插件的文本编辑器来写代码."我们总能在某些地方听到此类观点.然 而,尽管越来越多的人同意这样的观点,但是 ...
- 青客宝redis内部分享ppt
Redis:最好的缓存数据库 说Redis是缓存服务,估计有些人会不开心,因为Redis也可以把数据库持久化,但是在大多数情况Redis的竞争力是提供缓存服务.说到缓存服务必然会想到Memcached ...
- 性能测试培训:分布式测试之jmeter
性能测试培训:分布式测试之jmeter 在使用Jmeter进行性能测试时,如果并发数比较大(比如最近项目需要支持1000并发),单台电脑的配置(CPU和内存)可能无法支持,这时可以使用Jmeter ...
- JSP的学习
JSP的学习 1. (1).服务器的名字:Tomcat (2).服务器浏览器访问的地址为: http://localhost:8080 http://127.0.0.1:8080 2.简单的知识 (1 ...
- ORA-00918: 未明确定义列
ORA-00918: 未明确定义列 出现问题原因及解决办法. --正常写,结果带上表名的字段在处理后表头名称相同,在进行下一次嵌套时就会出现问题 select au.userxm,au01.user ...
- Service详解
/** * 后台执行的定时任务 */ public class LongRunningService extends Service { @Override public IBinder onBind ...