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");
}
}