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}]
原创粉丝点击