elasticsearch5.3.0 索引创建及查询
来源:互联网 发布:打车软件解决方案 编辑:程序博客网 时间:2024/05/22 08:07
引言
上篇文章介绍了elasticsearch5.3.0服务器搭建,接下来说说elasticsearch的java客户端对数据的索引创建和对数据的查询。虽说现在es的api使用文档不少,但是5.3.0版本的太新了,许多都不兼容老版本,所以有了这篇博文。elasticsearch允许HTTP Restful的方式进行数据访问和操作,也同样允许通过JAVA API来访问服务器,HTTP Restful方式官方网站有很详细的说明在这就不罗嗦了,先看如何使用JAVA API来访问服务器。
准备
本人使用springboot建的项目,本文重点是如何使用es的java api,其他有的没的就先略去。
首先引入elasticsearch客户端maven包,因为是5.3.0的版本,所以客户端包也保持一致。
<dependency> <groupId>org.elasticsearch.client</groupId> <artifactId>transport</artifactId> <version>5.3.0</version> </dependency> <dependency> <groupId>org.elasticsearch</groupId> <artifactId>elasticsearch</artifactId> <version>5.3.0</version> </dependency>
索引创建及查询
Client
@Bean public Client esClient()throws UnknownHostException { Settings settings=Settings.builder() .put("cluster.name",clusterName)//集群名称 .put("client.transport.sniff",true)//是否开启嗅探功能 .build(); InetAddress inetAddress=InetAddress.getByName(ip); TransportAddress transportAddress =new InetSocketTransportAddress(inetAddress,port); return new PreBuiltTransportClient(settings) .addTransportAddress(transportAddress); }
创建索引
首先为要索引的数据创建一个mapping
public boolean getMapping(String index, String type) { try { //为index提供ik分词 XContentBuilder settings = XContentFactory.jsonBuilder(); settings.startObject() .startObject("analysis") .startObject("analyzer") .startObject("ik").field("tokenizer","ik_smart") .endObject() .endObject() .endObject().endObject(); CreateIndexRequest createIndexRequest = new CreateIndexRequest(index).settings(settings); CreateIndexResponse createIndexResponse = esClient.admin().indices().create(createIndexRequest).get(); logger.info("Index:{} created,response:{}", index, JSON.toJSON(createIndexResponse)); XContentBuilder builder = XContentFactory.jsonBuilder(); builder.startObject() .startObject(type) .startObject("properties") .startObject("firstName").field("type", "string") .endObject() .startObject("lastName").field("type", "string") .endObject() .startObject("about").field("type", "string").field("analyzer","ik_smart") .endObject() .startObject("interests").field("type", "string").field("analyzer","ik_smart") .endObject() .endObject() .endObject(); PutMappingRequest putMappingRequest = new PutMappingRequest(index); putMappingRequest.type(type); putMappingRequest.source(builder); PutMappingResponse putMappingResponse = esClient.admin().indices().putMapping(putMappingRequest).get(); logger.info("Mapping for `{}.{}` putted, response:{}", index, type, JSON.toJSON(putMappingResponse)); return true; } catch (Exception e) { logger.error("doCreateIndex", e); return false; } }
测试数据是官网上的一个例子,就是一个公司部门中员工的信息,而mapping的作用就是在es中被索引的数据规定每一个field数据类型。
接下来添加索引数据:
public boolean createIndex(String json) { try { if(esIndexTypes.get(index)==null) { if(getMapping(index, indexType)) esIndexTypes.put(index,true); } IndexRequestBuilder requestBuilder = esClient.prepareIndex(index, indexType); IndexResponse indexResponse = requestBuilder.setSource(json).execute().actionGet(); logger.info("Index:{} created,response:{}", index, JSON.toJSON(indexResponse)); return true; } catch (Exception e) { logger.error("createIndex failed,exception:{}", e.getMessage()); return false; } }
组合查询并高亮显示
public List<String> search(String... queryStr) { BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery(); for (String s : queryStr) {//使用queryStringQuery无法使用高亮 queryBuilder.should(QueryBuilders.matchQuery("about", s)); } HighlightBuilder highlightBuilder = new HighlightBuilder(); highlightBuilder.preTags("<span style=\"color:red\">"); highlightBuilder.postTags("</span>"); highlightBuilder.field("about").field("interests").forceSource(true); SearchResponse searchResponse = esClient.prepareSearch(index) .setTypes(indexType) .setQuery(queryBuilder) .highlighter(highlightBuilder) .execute() .actionGet(); SearchHits hits = searchResponse.getHits(); List<String> list = new ArrayList<String>(); if (hits != null && hits.getHits().length > 0) { for (SearchHit hit : hits) { JSONObject data = new JSONObject(); for(Map.Entry<String, Object> entry : hit.getSource().entrySet()) { data.put(entry.getKey(), entry.getValue()); } hit.getHighlightFields().forEach((title, frag) -> { String str = ""; for (Text text : frag.getFragments()) { str = str + text.string(); } data.put(title, str); }); list.add(JSON.toJSONString(data)); } } return list; }
测试
@org.junit.Test public void testquery(){ List<String> haha = esProxy.search("认真","眼泪","杀猪"); System.out.println(haha.toString()); } //结果 [{"firstName":"王麻子","lastName":"君君","about":"爱的那么<span style=\"color:red\">认真</span>,不让我的<span style=\"color:red\">眼泪</span>陪我过夜","interests":["怼人,我是在等待发呆,笨小孩","杀猪","打豆豆"],"age":18}, {"firstName":"王把","lastName":"君君","about":"中华人民共和国体育总局,不让我的<span style=\"color:red\">眼泪</span>陪我过夜","interests":["怼人,我是在等待发呆,笨小孩","杀猪","打豆豆"],"age":18}]
阅读全文
0 0
- elasticsearch5.3.0 索引创建及查询
- Elasticsearch5.3 用JAVA创建索引
- 2、es索引创建及查询
- Lucene多线程创建索引及多目录下查询索引
- ElasticSearch5.X—模糊查询和获取所有索引字段
- solr入门之lucene创建索引和查询索引及查询的源码读取类确定
- solr创建查询索引
- lucene 索引创建查询
- elasticsearch5 源码 索引过程
- Elasticsearch5.X索引
- elasticsearch5.4.0 查询记录
- 索引概念及创建
- 创建及删除索引
- 创建及删除索引
- MySQL 创建索引、重建索引、查询索引、删除索引
- oracle创建使用索引,查询索引状态
- lucene创建索引,分组查询
- MySql 创建、删除、查询索引
- spring boot 正常启动,访问控制时报404
- windows server 2008/2012 忘记登陆密码
- 垃圾收集器与内存分配策略
- 6735&53lcd parameter
- 使用jsp实现表单与服务器简单交互
- elasticsearch5.3.0 索引创建及查询
- tomcat/log read-Only
- iOS开大
- Python 进程线程之间通信方式(1,基于队列的)
- 应对32位程序在64位系统上访问注册表和文件自动转向问题
- iOS 开发-Xcode中的 workspace, project, target, scheme
- Java反射机制详解
- 最新版本Phpstorm安装-激活-汉化-主题下载和设置(站在巨人的肩膀上)
- FormData+AJAX+SpringMVC跨域异步上传文件