elasticsearch5x学习2.0

看完这篇文章,你会知道以下内容

环境 es5.6.8 springboot2.0.1

  1. 如何使用java客户端对es进行相关增删改查操作
  • 导入依赖
  • 其中transport是与es发送请求的客户端,还有一些关于日志的,jackson是用来将对象和json互相转换的工具
<dependencies>
        <dependency>
            <groupId>org.elasticsearch</groupId>
            <artifactId>elasticsearch</artifactId>
            <version>5.6.8</version>
        </dependency>
        <dependency>
            <groupId>org.elasticsearch.client</groupId>
            <artifactId>transport</artifactId>
            <version>5.6.8</version>
        </dependency>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-to-slf4j</artifactId>
            <version>2.9.1</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.7.24</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-simple</artifactId>
            <version>1.7.21</version>
        </dependency>
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.12</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-core</artifactId>
            <version>2.8.7</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.8.7</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-annotations</artifactId>
            <version>2.8.1</version>
        </dependency>
    </dependencies>
  • 建立实体
public class Article {
    private Long id;
    private String title;

    public Article() {
    }

    @Override
    public String toString() {
        return "Article{" +
                "id=" + id +
                ", title='" + title + '\'' +
                '}';
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public Article(Long id, String title) {
        this.id = id;
        this.title = title;
    }
}
  • 建立索引
  1. 获取client对象
  2. 创建index
  3. 释放资源
		//获取client对象
        Settings settings = Settings.builder().put("cluster.name","elasticsearch").build();
        TransportClient transportClient = new PreBuiltTransportClient(settings).addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9300));
        //创建index
        CreateIndexResponse response = transportClient.admin().indices().prepareCreate("blog2").get();
        //释放资源
        transportClient.close();
  • 索引建好了,但是没有mapping信息
  1. 我们需要构建mapping json字符串,让client发送给es,这里我们使用XContentFactory构造json字符串,后面我们会使用jackson 以对象的形式转换为json
 //获取client对象
        Settings settings = Settings.builder().put("cluster.name", "elasticsearch").build();
        TransportClient transportClient = new PreBuiltTransportClient(settings).addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9300));
        //构造mapping
        XContentBuilder xContentBuilder = XContentFactory.jsonBuilder()
                .startObject()
                .startObject("article")
                .startObject("properties")
                .startObject("id")
                .field("type", "long").field("store", true).field("index", false)
                .endObject()
                .startObject("title")
                .field("type", "text").field("store", true).field("index", "analyzed").field("analyzer", "ik_max_word")
                .endObject()
                .endObject()
                .endObject()
                .endObject();
        //加入mapping
        PutMappingRequest source = Requests.putMappingRequest("blog2").type("article").source(xContentBuilder);
        transportClient.admin().indices().putMapping(source).get();
        transportClient.close();
  • 创建一个doc
 //获取client
        Settings settings = Settings.builder().put("cluster.name", "elasticsearch").build();
        TransportClient client = new PreBuiltTransportClient(settings).addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9300));
        //构造文档
        XContentBuilder xContentBuilder = XContentFactory.jsonBuilder()
                .startObject()
                .field("id", 1).field("title", "test")
                .endObject();
        client.prepareIndex("blog2","article","1").setSource(xContentBuilder).get();
        //释放资源
        client.close();
  • 使用jackson 创建一个doc
 //获取client
        Settings settings = Settings.builder().put("cluster.name", "elasticsearch").build();
        TransportClient client = new PreBuiltTransportClient(settings).addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9300));
        //构造doc
        Article article = new Article(11L, "test11");
        //ObjectMapper是jackson内部对象
        ObjectMapper objectMapper = new ObjectMapper();
        String source = objectMapper.writeValueAsString(article);
        client.prepareIndex("blog2","article",article.getId().toString()).setSource(source).get();
        //释放资源
        client.close();
  • term查询(关键词)
//获取client
        Settings settings = Settings.builder().put("cluster.name", "elasticsearch").build();
        TransportClient client = new PreBuiltTransportClient(settings).addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9300));
        //构造查询
        SearchResponse searchResponse = client.prepareSearch("blog2").setTypes("article").setQuery(QueryBuilders.termQuery("title", "test")).get();
        SearchHits hits = searchResponse.getHits();
        //获取结果数据
        System.out.println("hits total:"+hits.getTotalHits());
        Iterator<SearchHit> iterator = hits.iterator();
        iterator.forEachRemaining(i -> System.out.println(i.getSourceAsString()+i.getSource().get("title")));
        //释放资源
        client.close();
  • querystring查询
//获取client
        Settings settings = Settings.builder().put("cluster.name", "elasticsearch").build();
        TransportClient client = new PreBuiltTransportClient(settings).addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9300));
        //构造条件
        SearchResponse searchResponse = client.prepareSearch("blog2").setTypes("article").setQuery(QueryBuilders.queryStringQuery("test").defaultField("title")).get();
        //获取结果集
        SearchHits hits = searchResponse.getHits();
        System.out.println(hits.getTotalHits());
        hits.iterator().forEachRemaining(i -> System.out.println(i.getSourceAsString()+"\n"+i.getSource().get("title")));
        //释放资源
        client.close();
  • 根据id查询
 		//获取client
        Settings settings = Settings.builder().put("cluster.name", "elasticsearch").build();
        TransportClient client = new PreBuiltTransportClient(settings).addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9300));
        //构造条件
        SearchResponse searchResponse = client.prepareSearch("blog2").setTypes("article").setQuery(QueryBuilders.idsQuery().addIds("1", "2")).get();
        //获取数据
        SearchHits hits = searchResponse.getHits();
        System.out.println(hits.getTotalHits());
        hits.iterator().forEachRemaining(i -> System.out.println(i.getSourceAsString()+"\n"+i.getSource().get("id")));
        //释放资源
        client.close();
  • 批量插入 删除
 Settings settings = Settings.builder().put("cluster.name", "elasticsearch").build();
        TransportClient client = new PreBuiltTransportClient(settings).addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9300));
        for (int i = 11; i <= 100; i++) {
            Article article = new Article();
            long id = Integer.valueOf(i).longValue();
//            System.out.println(id);
            article.setId(id);
            article.setTitle(i+" 搜索工作其实很快乐");
            ObjectMapper objectMapper = new ObjectMapper();
            String content = objectMapper.writeValueAsString(article);
            client.prepareIndex("blog2", "article", String.valueOf(i)).setSource(content.getBytes(),XContentType.JSON).get();
//            client.prepareDelete("blog2","article",String.valueOf(i)).get();
        }
        client.close();
  • 有数据了我们就可以测试分页查询了
		Settings settings = Settings.builder().put("cluster.name", "elasticsearch").build();
        TransportClient client = new PreBuiltTransportClient(settings).addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9300));
        SearchResponse searchResponse = client.prepareSearch().setIndices("blog2").setTypes("article").setQuery(QueryBuilders.matchAllQuery()).setFrom(0).setSize(5).get();
        SearchHits hits = searchResponse.getHits();
        hits.iterator().forEachRemaining(i -> System.out.println(i.getSourceAsString()));
        client.close();
  • 测试高亮
		Settings settings = Settings.builder().put("cluster.name", "elasticsearch").build();
        TransportClient client = new PreBuiltTransportClient(settings).addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9300));
        SearchRequestBuilder searchRequestBuilder = client.prepareSearch().setIndices("blog2").setTypes("article").setQuery(QueryBuilders.termQuery("title", "搜索"));
        HighlightBuilder highlightBuilder = new HighlightBuilder();
        highlightBuilder.preTags("<em>");
        highlightBuilder.postTags("</em>");
        highlightBuilder.field("title");
        searchRequestBuilder.highlighter(highlightBuilder);
        SearchResponse searchResponse = searchRequestBuilder.get();
        SearchHits hits = searchResponse.getHits();
        hits.iterator().forEachRemaining(i -> {
            System.out.println(i.getSourceAsString()+"\n"+i.getHighlightFields());
            Text[] texts = i.getHighlightFields().get("title").getFragments();
            for(Text text:texts){
                System.out.println(text);
            }
        });
        client.close();

当然在与实际项目结合的时候,我们不会用原生的方式进行操作,spring data es会帮我们封装好常用的crud方法,在第三讲,我们会将如何用springboot整合es

发布了84 篇原创文章 · 获赞 10 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/yidou120/article/details/103719866