ES基本語法的Java客戶端操作


導包

<!-- fastjson 對象和json轉換 -->
<dependency>
       <groupId>com.alibaba</groupId>
       <artifactId>fastjson</artifactId>
       <version>1.2.58</version>
</dependency>
<!--es 高級版本操作坐標-->
<dependency>
       <groupId>org.elasticsearch.client</groupId>
       <artifactId>elasticsearch-rest-high-level-client</artifactId>
       <version>6.8.3</version>
</dependency>
<!--es依賴-->
<dependency>
       <groupId>org.elasticsearch</groupId>
       <artifactId>elasticsearch</artifactId>
       <version>6.8.3</version>
</dependency>

先准備一份數據庫和表

PUT /root02
{
  "mappings": {
    "product": {
      "properties": {
        "id": {
          "type": "keyword"
        },
        "title": {
          "type": "text",
          "analyzer": "ik_max_word"
        },
        "category": {
          "type": "keyword"
        },
        "brand": {
          "type": "keyword"
        },
        "images": {
          "type": "keyword",
          "index": false
        },
        "price": {
          "type": "double"
        }
      }
    }
  }
}

創建一個對應的實體類

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Product {

    private Long id;

    /**
     * 標題
     */
    private String title;

    /**
     * 分類
     */
    private String category;

    /**
     *    品牌
     */
    private String brand;

    /**
     *  價格
     */
    private Double price;

    /**
     * 圖片地址
     */
    private String images;
   
}

這里的案例使用測試類進行

1.增刪改和簡單查

API

java連接至es

RestHighLevelClient client = new RestHighLevelClient(RestClient.builder(new HttpHost("x.x.x.x", 9200, "http")));

增刪改和簡單查

//新增
IndexRequest indexRequest = new IndexRequest("root02", "product", "1");

//根據id查詢
GetRequest getRequest = new GetRequest("root02", "product", "1");

//修改數據
final UpdateRequest updateRequest = new UpdateRequest("root02", "product", "1");

//刪除根據id
DeleteRequest deleteRequest = new DeleteRequest("root02", "product", "1");

//批量添加
BulkRequest bulkRequest = new BulkRequest();

使用

public class TestClass {
    RestHighLevelClient client;

    @BeforeEach
    public void before() {
        client = new RestHighLevelClient(
                RestClient.builder(
                        new HttpHost("62.234.118.219", 9902, "http")));
    }

    /*
        文檔新增
     */
    @Test
    public void add() throws IOException {
        //1.創建請求對象
        /*
            第一個參數: 索引庫名稱
            第二個參數: 類型名稱
            第三個參數: 可選項,id
         */
        IndexRequest indexRequest = new IndexRequest("root02", "product", "1");
        //2.准備數據---》json
        Product product = new Product(1L, "小米手機", "手機", "小米", 2699.00, "http://www.baidu.com");
        String jsonString = JSON.toJSONString(product);
        //3.將數據封裝到請求對象
        indexRequest.source(jsonString, XContentType.JSON);
        //4.發送請求
        IndexResponse indexResponse = client.index(indexRequest, RequestOptions.DEFAULT);
        //5.打印結果
        System.out.println("結果: " + indexResponse);
    }

    /*
    根據id查詢文檔
    */
    @Test
    public void getById() throws IOException {
        //1.創建查詢對象並且設置查詢id
        GetRequest getRequest = new GetRequest("root02", "product", "1");
        //2.發送請求
        final GetResponse documentFields = client.get(getRequest, RequestOptions.DEFAULT);
        System.out.println(documentFields);
    }

    /*
    修改文檔
   */
    @Test
    public void updateDocById() throws IOException {
        final UpdateRequest updateRequest = new UpdateRequest("root02", "product", "1");
        //2.組裝修改內容---》json
        Product product = new Product(1L, "大米手機", "手機", "大米", 19999.00, "http://www.baidu.com");
        String jsonString = JSON.toJSONString(product);
        //3.將修改內容封裝到修改對象
        updateRequest.doc(jsonString, XContentType.JSON);
        final UpdateResponse update = client.update(updateRequest, RequestOptions.DEFAULT);
        System.out.println(update);
    }

    //刪除文檔
    @Test
    public void delById() throws IOException {
        //1.創建刪除對象
        DeleteRequest deleteRequest = new DeleteRequest("root02", "product", "1");
        //2.發送請求
        DeleteResponse deleteResponse = client.delete(deleteRequest, RequestOptions.DEFAULT);
        System.out.println("結果: " + deleteResponse);
    }

    /*
        批量新增
    */
    @Test
    public void batchAddDoc() throws IOException {
        //1.創建批量請求對象
        BulkRequest bulkRequest = new BulkRequest();
        //2.for循環創建對象----》IndexRequest---》json
        for (long i = 2; i < 10; i++) {
            IndexRequest indexRequest = new IndexRequest("root02", "product", i + "");
            //2.准備數據---》json
            Product product = new Product(i, "小米手機" + i, "手機", "小米", 2699.00 + i, "http://www.baidu.com");
            String jsonString = JSON.toJSONString(product);
            //3.將數據封裝到請求對象
            indexRequest.source(jsonString, XContentType.JSON);
            //4.將IndexRequest封裝到批量請求對象
            bulkRequest.add(indexRequest);
        }
        //4.發送請求
        BulkResponse bulkResponse = null;
        bulkResponse = client.bulk(bulkRequest, RequestOptions.DEFAULT);
        System.out.println("結果: " + bulkResponse);
    }

    @AfterEach
    public void close() throws IOException {
        client.close();
    }
}

2.復雜查詢

//創建searchRequest請求對象
RestHighLevelClient client;

//創建searchRequest請求對象
SearchRequest searchRequest = new SearchRequest("root02");

//創建searchSourceBuilder對象--》封裝查詢對象
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();

核心對象

QueryBuilder queryBuilder = QueryBuilders.matchAllQuery();
//封裝了各種查詢方法

對象關系

  SearchRequest -->封裝 SearchSourceBuilder -->封裝 QueryBuilder

  RestHighLevelClient --> 攜帶封裝好的 SearchRequest 發送請求

使用

public class Test02 {
    RestHighLevelClient client;
    //1.創建searchRequest請求對象
    SearchRequest searchRequest = new SearchRequest("root02");
    //2.創建searchSourceBuilder對象-->封裝查詢對象
    SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();

    @BeforeEach
    public void before() {
        client = new RestHighLevelClient(
                RestClient.builder(
                        new HttpHost("62.234.118.219", 9902, "http")));
    }

    /*
        查詢所有
     */
    @Test
    public void matchAll() throws IOException {
        //創建查詢對象QueryBuilder
        QueryBuilder queryBuilder = QueryBuilders.matchAllQuery();
        //封裝查詢對象
        searchSourceBuilder.query(queryBuilder);
        //searchSourceBuilder封裝到searchRequest對象中
        searchRequest.source(searchSourceBuilder);
        showContext();
    }

    /*
    模糊匹配查詢
 */
    @Test
    public void matchDoc() throws IOException {
        //3.創建查詢對象
        QueryBuilder queryBuilder = QueryBuilders.matchQuery("title", "小米");
        searchSourceBuilder.query(queryBuilder);
        searchRequest.source(searchSourceBuilder);
        //發送請求
        showContext();
    }

    /*
    精確查詢,一般用於查詢不分詞字段
    */
    @Test
    public void term() throws IOException {
        QueryBuilder queryBuilder = QueryBuilders.termQuery("price", 2706);
        searchSourceBuilder.query(queryBuilder);
        searchRequest.source(searchSourceBuilder);
        showContext();
    }

    //排序,高亮,分頁查詢
    @Test
    public void commons() throws IOException {
        QueryBuilder queryBuilder = QueryBuilders.matchQuery("title", "小米");
        searchSourceBuilder.query(queryBuilder);
         /*
            排序
        //默認升序排序
            分頁:
                size: 頁大小
                from: 起始索引位置 int start = (pagenum -1) * pagesize_
            高亮:設置條件
                前置標簽:
                后置標簽:
                高亮字段:
         */
        HighlightBuilder highlightBuilder = new HighlightBuilder();
        highlightBuilder.preTags("<span color='red'>");
        highlightBuilder.postTags("</span>");
        highlightBuilder.field("title");
        searchSourceBuilder.sort("price", SortOrder.ASC).from(4).size(2).highlighter(highlightBuilder);
        searchRequest.source(searchSourceBuilder);

        SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
        //7.解析結果
        SearchHits searchHits = searchResponse.getHits();
        if (null != searchHits) {
            SearchHit[] hits = searchHits.getHits();
            for (SearchHit hit : hits) {
                String sourceAsString = hit.getSourceAsString();
                System.out.println("查詢結果:" + sourceAsString);
                    /*
                        高亮結果解析
                     */
                Map<String, HighlightField> highlightFields = hit.getHighlightFields();
                if (!highlightFields.isEmpty()) {
                    Text title = highlightFields.get("title").getFragments()[0];
                    System.out.println("高亮結果: " + title);
                }
            }
        }
    }

    //封裝請求和打印數據
    public void showContext() throws IOException {
        //發送請求
        SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
        //解析結果
        SearchHits searchHits = searchResponse.getHits();
        if (null != searchHits) {
            SearchHit[] hits = searchHits.getHits();
            for (SearchHit hit : hits) {
                String sourceAsString = hit.getSourceAsString();
                System.out.println("查詢結果:" + sourceAsString);
            }
        }
    }

    @AfterEach
    public void close() throws IOException {
        client.close();
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM