ElasticSearch實戰之JAVA操作(六)

Java操作ES

1.1 引入maven依賴

 	<dependency>
      <groupId>org.elasticsearch</groupId>
      <artifactId>elasticsearch</artifactId>
      <version>6.2.4</version>
    </dependency>


    <dependency>
      <groupId>org.elasticsearch.client</groupId>
      <artifactId>transport</artifactId>
      <version>6.2.4</version>
    </dependency>

1.2 創建索引和類型


1.2.1 Rest的創建方式

// 1.在restful的創建方式

PUT /dangdang
{
  "mappings": {
    "book":{
      "properties": {
        "name":{
          "type":"text",
          "analyzer": "ik_max_word"
        },
        "age":{
          "type":"integer"
        },
        "sex":{
          "type":"keyword"
        },
        "content":{
          "type":"text",
          "analyzer": "ik_max_word"
        }
      }
    }
  }
}

1.2.2 Java中創建方式

/**
 * 創建索引並創建類型同時指定映射
 */
@Test
public void testCreateIndexAndTypeAndMapping() throws IOException, ExecutionException, InterruptedException {
    TransportClient transportClient = new PreBuiltTransportClient(Settings.EMPTY).addTransportAddress(new TransportAddress(InetAddress.getByName("172.16.251.142"), 9300));
    System.out.println("=======創建索引=======");
    CreateIndexResponse indexResponse = transportClient.admin().indices().prepareCreate("dangdang").execute().get();
    System.out.println(indexResponse.index());

    System.out.println("=======創建類型指定映射=======");
    XContentBuilder mappingBuilder = XContentFactory.jsonBuilder();
    mappingBuilder.startObject()
                    .startObject("properties")
                        .startObject("name")
                            .field("type", "text")
                            .field("analyzer", "ik_max_word")
                        .endObject()
                        .startObject("age")
                            .field("type", "integer")
                        .endObject()
                        .startObject("sex")
                            .field("type", "keyword")
                        .endObject()
                        .startObject("content")
                            .field("type", "text")
                            .field("analyzer", "ik_max_word")
                        .endObject()
                    .endObject()
                .endObject();

    PutMappingRequest putMappingRequest = new PutMappingRequest("dangdang").type("book").source(mappingBuilder);
    transportClient.admin().indices().putMapping(putMappingRequest).get();
}

1.3 索引一條記錄


	/**
     * 創建索引(自動生成文檔id)
     * @throws IOException
     */
    @Test
    public void testCreate() throws IOException {
        TransportClient transportClient = new PreBuiltTransportClient(Settings.EMPTY).addTransportAddress(new TransportAddress(InetAddress.getByName("172.16.251.142"), 9300));
        XContentBuilder xContentBuilder = XContentFactory.jsonBuilder().startObject()
                .field("name","中國人")
                .field("age",23)
                .field("sex","男")
                .field("content","他是一箇中國人,這個中國人怎麼樣,挺好的").endObject();
        IndexResponse indexResponse = transportClient.prepareIndex("dangdang", "book").setSource(xContentBuilder).get();
        System.out.println(indexResponse.status());
    }

	/**
     * 創建索引(指定生成文檔id)
     *
     * @throws IOException
     */
    @Test
    public void testCreate() throws IOException {
        TransportClient transportClient = new PreBuiltTransportClient(Settings.EMPTY).addTransportAddress(new TransportAddress(InetAddress.getByName("172.16.251.142"), 9300));
        XContentBuilder xContentBuilder = XContentFactory.jsonBuilder().startObject()
                .field("name", "中國人")
                .field("age", 23)
                .field("sex", "男")
                .field("content", "他是一箇中國人,這個中國人怎麼樣,挺好的").endObject();
        IndexResponse indexResponse = transportClient.prepareIndex("dangdang", "book","1").setSource(xContentBuilder).get();
        System.out.println(indexResponse.status());
    }

1.4 更新一條索引

	/**
	 * 更新一條記錄
	 *
	 */
	@Test
    public void testUpdate() throws IOException {
        TransportClient transportClient = new PreBuiltTransportClient(Settings.EMPTY).addTransportAddress(new TransportAddress(InetAddress.getByName("172.16.251.142"), 9300));
        XContentBuilder source = XContentFactory.jsonBuilder();
        source.startObject().field("name","小黑是中國人").endObject();
        UpdateResponse updateResponse = transportClient.prepareUpdate("dangdang", "book", "1")
                .setDoc(source).get();
        System.out.println(updateResponse.status());
    }

1.5 刪除一條索引

	/**
     * 刪除一條索引記錄
     * @throws UnknownHostException
     */
    @Test
    public void  testDelete() throws UnknownHostException {
        TransportClient transportClient = new PreBuiltTransportClient(Settings.EMPTY).addTransportAddress(new TransportAddress(InetAddress.getByName("172.16.251.142"), 9300));
        DeleteResponse deleteResponse = transportClient.prepareDelete("dangdang", "book", "1").get();
        System.out.println(deleteResponse.status());
    }

1.6 批量更新

	/**
     * 批量更新
     */
    @Test
    public void testBulk() throws IOException {
        TransportClient transportClient = new PreBuiltTransportClient(Settings.EMPTY).addTransportAddress(new TransportAddress(InetAddress.getByName("172.16.251.142"), 9300));

        //添加第一條記錄
        IndexRequest request1 = new IndexRequest("dangdang","book","1");
        request1.source(XContentFactory.jsonBuilder().startObject().field("name","中國科技").field("age",23).field("sex","男").field("content","這是個好人").endObject());


        //添加第二條記錄
        IndexRequest request2 = new IndexRequest("dangdang","book","2");
        request2.source(XContentFactory.jsonBuilder().startObject().field("name","中國之聲").field("age",23).field("sex","男").field("content","這是一個好的聲音").endObject());

        //更新記錄
        UpdateRequest updateRequest = new UpdateRequest("dangdang","book","1");
        updateRequest.doc(XContentFactory.jsonBuilder().startObject().field("name","中國力量").endObject());

        //刪除一條記錄
        DeleteRequest deleteRequest = new DeleteRequest("dangdang","book","1");

        BulkResponse bulkItemResponses = transportClient.prepareBulk().add(request1).add(request2).add(updateRequest).add(deleteRequest).get();
        BulkItemResponse[] items = bulkItemResponses.getItems();
        for (BulkItemResponse item : items) {
            System.out.println(item.status());
        }

    }

1.7 檢索記錄

查詢所有並排序

/**
     * 查詢所有並排序
     *  ASC 升序  DESC 降序
     *  addSort("age", SortOrder.ASC)  指定排序字段以及使用哪種方式排序
     *  addSort("age", SortOrder.DESC) 指定排序字段以及使用哪種方式排序
     */
    @Test
    public void testMatchAllQuery() throws UnknownHostException {
        TransportClient transportClient = new PreBuiltTransportClient(Settings.EMPTY).addTransportAddress(new TransportAddress(InetAddress.getByName("172.16.251.142"), 9300));
        SearchResponse searchResponse = transportClient.prepareSearch("dangdang").setTypes("book").setQuery(QueryBuilders.matchAllQuery()).addSort("age", SortOrder.DESC).get();
        SearchHits hits = searchResponse.getHits();
        System.out.println("符合條件的記錄數: "+hits.totalHits);
        for (SearchHit hit : hits) {
            System.out.print("當前索引的分數: "+hit.getScore());
            System.out.print(", 對應結果:=====>"+hit.getSourceAsString());
            System.out.println(", 指定字段結果:"+hit.getSourceAsMap().get("name"));
            System.out.println("=================================================");
        }
    }

分頁查詢

	/**
     * 分頁查詢
     *  From 從那條記錄開始 默認從0 開始  form = (pageNow-1)*size
     *  Size 每次返回多少條符合條件的結果  默認10
     */
    @Test
    public void testMatchAllQueryFormAndSize() throws UnknownHostException {
        TransportClient transportClient = new PreBuiltTransportClient(Settings.EMPTY).addTransportAddress(new TransportAddress(InetAddress.getByName("172.16.251.142"), 9300));
        SearchResponse searchResponse = transportClient.prepareSearch("dangdang").setTypes("book").setQuery(QueryBuilders.matchAllQuery()).setFrom(0).setSize(2).get();
        SearchHits hits = searchResponse.getHits();
        System.out.println("符合條件的記錄數: "+hits.totalHits);
        for (SearchHit hit : hits) {
            System.out.print("當前索引的分數: "+hit.getScore());
            System.out.print(", 對應結果:=====>"+hit.getSourceAsString());
            System.out.println(", 指定字段結果:"+hit.getSourceAsMap().get("name"));
            System.out.println("=================================================");
        }
    }

查詢返回字段

	/**
     *  查詢返回指定字段(source) 默認返回所有
     *      setFetchSource 參數1:包含哪些字段   參數2:排除哪些字段
     *      setFetchSource("*","age")  返回所有字段中排除age字段
     *      setFetchSource("name","")  只返回name字段
     *      setFetchSource(new String[]{},new String[]{})
     */
    @Test
    public void testMatchAllQuerySource() throws UnknownHostException {
        TransportClient transportClient = new PreBuiltTransportClient(Settings.EMPTY).addTransportAddress(new TransportAddress(InetAddress.getByName("172.16.251.142"), 9300));
        SearchResponse searchResponse = transportClient.prepareSearch("dangdang").setTypes("book").setQuery(QueryBuilders.matchAllQuery()).setFetchSource("*","age").get();
        SearchHits hits = searchResponse.getHits();
        System.out.println("符合條件的記錄數: "+hits.totalHits);
        for (SearchHit hit : hits) {
            System.out.print("當前索引的分數: "+hit.getScore());
            System.out.print(", 對應結果:=====>"+hit.getSourceAsString());
            System.out.println(", 指定字段結果:"+hit.getSourceAsMap().get("name"));
            System.out.println("=================================================");
        }
    }

term查詢

	/**
     *  term查詢
     */
    @Test
    public void testTerm() throws UnknownHostException {
        TransportClient transportClient = new PreBuiltTransportClient(Settings.EMPTY).addTransportAddress(new TransportAddress(InetAddress.getByName("172.16.251.142"), 9300));
        TermQueryBuilder queryBuilder = QueryBuilders.termQuery("name","中國");
        SearchResponse searchResponse = transportClient.prepareSearch("dangdang").setTypes("book").setQuery(queryBuilder).get();
    }

range查詢

	/**
     *  rang查詢
     *     lt    小於
     *     lte   小於等於
     *     gt    大於
     *     gte   大於等於
     */
    @Test
    public void testRange() throws UnknownHostException {
        TransportClient transportClient = new PreBuiltTransportClient(Settings.EMPTY).addTransportAddress(new TransportAddress(InetAddress.getByName("172.16.251.142"), 9300));
        RangeQueryBuilder rangeQueryBuilder = QueryBuilders.rangeQuery("age").lt(45).gte(8);
        SearchResponse searchResponse = transportClient.prepareSearch("dangdang").setTypes("book").setQuery(rangeQueryBuilder).get();
  	}

prefix查詢

 	/**
     *  prefix 前綴查詢
     *
     */
    @Test
    public void testPrefix() throws UnknownHostException {
        TransportClient transportClient = new PreBuiltTransportClient(Settings.EMPTY).addTransportAddress(new TransportAddress(InetAddress.getByName("172.16.251.142"), 9300));
        PrefixQueryBuilder prefixQueryBuilder = QueryBuilders.prefixQuery("name", "中");
        SearchResponse searchResponse = transportClient.prepareSearch("dangdang").setTypes("book").setQuery(prefixQueryBuilder).get();
    }

wildcard查詢

	/**
     *  wildcardQuery 通配符查詢
     *
     */
    @Test
    public void testwildcardQuery() throws UnknownHostException {
        TransportClient transportClient = new PreBuiltTransportClient(Settings.EMPTY).addTransportAddress(new TransportAddress(InetAddress.getByName("172.16.251.142"), 9300));
        WildcardQueryBuilder wildcardQueryBuilder = QueryBuilders.wildcardQuery("name", "中*");
        SearchResponse searchResponse = transportClient.prepareSearch("dangdang").setTypes("book").setQuery(wildcardQueryBuilder).get();
    }

Ids查詢

	/**
     * ids 查詢
     */
    @Test
    public void testIds() throws UnknownHostException {
        TransportClient transportClient = new PreBuiltTransportClient(Settings.EMPTY).addTransportAddress(new TransportAddress(InetAddress.getByName("172.16.251.142"), 9300));
        IdsQueryBuilder idsQueryBuilder = QueryBuilders.idsQuery().addIds("1","2");
        SearchResponse searchResponse = transportClient.prepareSearch("dangdang").setTypes("book").setQuery(idsQueryBuilder).get();
    }

fuzzy模糊查詢

  	/**
     * fuzzy 查詢
     */
    @Test
    public void testFuzzy() throws UnknownHostException {
        TransportClient transportClient = new PreBuiltTransportClient(Settings.EMPTY).addTransportAddress(new TransportAddress(InetAddress.getByName("172.16.251.142"), 9300));
        FuzzyQueryBuilder fuzzyQueryBuilder = QueryBuilders.fuzzyQuery("content", "國人");
        SearchResponse searchResponse = transportClient.prepareSearch("dangdang").setTypes("book").setQuery(fuzzyQueryBuilder).get();
    }

bool查詢

  	/**
     * bool 查詢
     */
    @Test
    public void testBool() throws UnknownHostException {
        TransportClient transportClient = new PreBuiltTransportClient(Settings.EMPTY).addTransportAddress(new TransportAddress(InetAddress.getByName("172.16.251.142"), 9300));
        BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
            boolQueryBuilder.should(QueryBuilders.matchAllQuery());
            boolQueryBuilder.mustNot(QueryBuilders.rangeQuery("age").lte(8));
            boolQueryBuilder.must(QueryBuilders.termQuery("name","中國"));
        SearchResponse searchResponse = transportClient.prepareSearch("dangdang").setTypes("book").setQuery(boolQueryBuilder).get();
    }

multiMatch多字段查詢

	/**
     * Multimatch 查詢
     */
    @Test
    public void testMultiMatch() throws UnknownHostException {
        TransportClient transportClient = new PreBuiltTransportClient(Settings.EMPTY).addTransportAddress(new TransportAddress(InetAddress.getByName("172.16.251.142"), 9300));
        MultiMatchQueryBuilder multiMatchQueryBuilder = QueryBuilders.multiMatchQuery("中國", "name", "content");
        SearchResponse searchResponse = transportClient.prepareSearch("dangdang").setTypes("book").setQuery(multiMatchQueryBuilder).get();
    }

queryString 多字段分詞查詢

   /**
     * queryString 查詢
     */
    @Test
    public void testQueryString() throws UnknownHostException {
        TransportClient transportClient = new PreBuiltTransportClient(Settings.EMPTY).addTransportAddress(new TransportAddress(InetAddress.getByName("172.16.251.142"), 9300));
        QueryStringQueryBuilder queryStringQueryBuilder = QueryBuilders.queryStringQuery("中華人民共和國").field("name").field("content").analyzer("ik_max_word");
        SearchResponse searchResponse = transportClient.prepareSearch("dangdang").setTypes("book").setQuery(queryStringQueryBuilder).get();
        testResult(searchResponse);
    }

高亮查詢

/**
     * 高亮查詢
     *  .highlighter(highlightBuilder) 用來指定高亮設置
     *  requireFieldMatch(false) 開啓多個字段高亮
     *  field 用來定義高亮字段
     *  preTags("<span style='color:red'>")  用來指定高亮前綴
     *  postTags("</span>") 用來指定高亮後綴
     */
    @Test
    public void testHighlight() throws UnknownHostException {
        TransportClient transportClient = new PreBuiltTransportClient(Settings.EMPTY).addTransportAddress(new TransportAddress(InetAddress.getByName("172.16.251.142"), 9300));
        TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("name", "中國");

        HighlightBuilder highlightBuilder = new HighlightBuilder();

        highlightBuilder.requireFieldMatch(false).field("name").field("content").preTags("<span style='color:red'>").postTags("</span>");

        SearchResponse searchResponse = transportClient.prepareSearch("dangdang").setTypes("book").highlighter(highlightBuilder).highlighter(highlightBuilder).setQuery(termQueryBuilder).get();
        SearchHits hits = searchResponse.getHits();
        System.out.println("符合條件的記錄數: "+hits.totalHits);
        for (SearchHit hit : hits) {
            Map<String, Object> sourceAsMap = hit.getSourceAsMap();
            Map<String, HighlightField> highlightFields = hit.getHighlightFields();
            System.out.println("================高亮之前==========");
            for(Map.Entry<String,Object> entry:sourceAsMap.entrySet()){
                System.out.println("key: "+entry.getKey() +"   value: "+entry.getValue());
            }
            System.out.println("================高亮之後==========");
            for (Map.Entry<String,Object> entry:sourceAsMap.entrySet()){
                HighlightField highlightField = highlightFields.get(entry.getKey());
                if (highlightField!=null){
                    System.out.println("key: "+entry.getKey() +"   value: "+ highlightField.fragments()[0]);

                }else{
                    System.out.println("key: "+entry.getKey() +"   value: "+entry.getValue());
                }
            }

        }
    }

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章