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

發佈了81 篇原創文章 · 獲贊 10 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章