Java elasticsearch 7+ 版本 High Level REST Client 使用實例(史上es最全講解)

 elastic search理解(以下 簡稱es)
    ES(ElasticSearch)是一款分佈式全文檢索框架,底層基於基於Lucene實現。ES相當於一個數據庫,有 index type 屬性,index 是索引,相當於數據庫的一張表 ,type 是文檔,相當於數據庫中的行,包含很多字段。與數據庫相比更加智能,有很多全文檢索方式。

es相關插件

    1.kibana  這是一個es數據展示的圖形化界面,可以在官網下載。在 https://blog.csdn.net/Meetyouhere/article/details/103188730      這篇博客我中將詳細講解如何使用

    2.logstash  這是一個可以將MySQL數據導入到elasticsearch,十萬條數據大概1分鐘左右,速度還是很快的。不過需要有很多配置。在     這篇博客中我將詳細講解如何配置及使用。

可以在https://www.elastic.co/cn/downloads/past-releases下載所有版本的es,kibana和logstash

ES全文本搜索

      可以用es的 Java API 直接進行搜索,對字段進行分割 (漢語和英文使用不同的分詞器,在logstash中進行配置)不需要寫sql 語句。

      搜索種類 (可以參考https://blog.csdn.net/sugesi/article/details/80031151

     一、 簡單查詢

       1.對多個字段進行匹配 是否包含某個單詞

       2.對某個字段進行模糊搜索可以設置 相似度。

      3.範圍查詢

  二、  聚合查詢

  三、嵌套查詢

  es 直接在官網下載 解壓 ,雙擊bin 目錄下的 elasticsearch.bat即可,訪問 http://localhost:9200/  出現一下類似信息即表示安裝成功

可以添加到服務,這樣每次電腦啓動,此服務也會啓動。

  下面我將介紹簡單查詢中的前兩個(親測 實例)

1.獲取es 的客戶端 即 連接es

private static int port = 9200;                 
private static String host = "localhost";   //可以寫 ip  但是 logstash 配置要修改 



public RestHighLevelClient getClient() throws UnknownHostException {

		RestClientBuilder restClient = RestClient.builder(new HttpHost(host, port,  
     "http"));


// 定義監聽器,節點出現故障會收到通知。
		restClient.setFailureListener(new RestClient.FailureListener() {
			@Override
			public void onFailure(Node node) {
				super.onFailure(node);
			}
		});
		// 定義節點選擇器 這個是跳過data=false,ingest爲false的節點
		restClient.setNodeSelector(NodeSelector.SKIP_DEDICATED_MASTERS);
		// 定義默認請求配置回調
		restClient.setRequestConfigCallback(new RestClientBuilder.RequestConfigCallback() {
			@Override
			public RequestConfig.Builder customizeRequestConfig(RequestConfig.Builder requestConfigBuilder) {
				return requestConfigBuilder.setConnectTimeout(90000) // 連接超時(默認爲1秒)
						.setSocketTimeout(30000); // 套接字超時(默認爲30秒)
			}
		});


    RestHighLevelClient client = new RestHighLevelClient(restClient);

    return client;
}

2.簡單匹配搜索

public void testMatchSearch(RestHighLevelClient client) throws IOException {
		// 基礎設置   new SearchRequest("patent"); "patent" 爲索引名稱
		SearchRequest searchRequest = new SearchRequest("patent");
		// 搜索源構建對象
		SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
		// 匹配關鍵字

		searchSourceBuilder.query(
				QueryBuilders.matchQuery("relation_ship", "one integrated can not replace").minimumShouldMatch("1%"));   //minimumShouldMatch 最小匹配度
		searchRequest.source(searchSourceBuilder);
		// 發起請求,獲取結果
		SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);    //注意默認返回10條數據  解決辦法可以用分頁查詢,具體實現 下面第一快代碼有
		SearchHits hits1 = searchResponse.getHits();
		SearchHit[] searchHits1 = hits1.getHits();

}

3.對某個字段進行模糊搜索

public static void testMultiMatchSearch(RestHighLevelClient client) throws IOException {
		// 基礎設置
		SearchRequest searchRequest = new SearchRequest("caselist");
		// 搜索源構建對象
		SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();

    BoolQueryBuilder queryBuilder = 
   QueryBuilders.boolQuery().should(QueryBuilders.wildcardQuery("case_number",                
      ("*201910*").toLowerCase()));   //一定要轉成小寫 toLowerCase() 否則搜索不到,加上以後大小寫都可搜索到
      // 注意 searchSourceBuilder 默認返回10 條數據,如果需要返回實級條數需要設置                 //可以使用分頁查找 比如設置 searchSourceBuilder.from(1);就是從第二頁進行查找,類似於MySQL中的limit 


        searchSourceBuilder.from(0);  //意思是從第一頁開始查找 
		searchSourceBuilder.size(10);//每頁大小
		searchSourceBuilder.query(queryBuilder);

        searchRequest.source(searchSourceBuilder);
		// 發起請求,獲取結果
		SearchResponse searchResponse;

		searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);

		SearchHits hits = searchResponse.getHits();
		// 得到匹配度高的文檔
		SearchHit[] searchHits = hits.getHits();
		// 打印結果集
		System.out.println(searchHits.length);
		for (SearchHit searchHit : searchHits) {
			System.out.println(searchHit.toString());
			System.out.println("=============1");
		}
}

可以參考 https://github.com/bigseaa/elasticsearch-demo/blob/master/src/test/java/com/bigsea/search/TestSearch.java 這個代碼

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