《ElasticSearch入門》一篇管夠,持續更新

1、顧名思義:

Elastic:靈活的;Search:搜索引擎java

2、官方簡介:

Elasticsearch是一個基於Lucene的搜索服務器。它提供了一個分佈式多用戶能力的全文搜索引擎,基於RESTful web接口。mysql

3、優點:

自然分片,自然集羣,自然索引--->正如他的名字同樣,查詢速度快,是他最大的優點。web

4、業務場景:

在大數據場景下,面對千萬級數據,咱們通常都會在mysql上進行分庫分表。sql

好比咱們根據公司名稱查詢公司詳細信息,數據庫已經被分紅若干個,表分紅若干個,數據庫

咱們是不知道具體在哪一個庫,哪一個表。分庫分表後,每一個表都有一個惟一標識id,api

這個id能夠解析出庫表的後綴。那怎麼根據名稱獲取這個id呢,有一種思路就是公司名稱的md5,服務器

而後解析到指定的索引庫表,而後咱們就能夠查詢到id,再根據id獲取其餘信息。elasticsearch

按照傳統模式,咱們須要從mysql查詢兩次,第一次從索引庫查詢id,分佈式

而後根據id獲取其餘信息。面對億級數據,每過一次數據庫,效率都要打折扣。工具

因而es攜帶其天生的全文高速檢索優點正式亮相:有如下3種方案:

  一、將索引庫整合導入es,咱們優先從es中進行精確或者模糊匹配,而後再去mysql查詢具體數據。

  二、將全部數據庫整合導入es,直接從es查詢。

  三、每次先從es查詢,es沒有從mysql查詢,而後更新到es。

大概分析下各自的優缺點。

  一、能夠大大提升檢索效率,但須要消耗巨大存儲與內存空間。

  二、能夠高效的支持精確與模糊查詢,空間與效率折中。中庸之道。

  三、業務環節變多,風險多,查詢速度較低。

5、掀起蓋頭來(探索底層的奧祕)

很遺憾,這篇文章是掀不起來了,屢次提筆,卻發現本身仍是沒真正領悟,

沒法用本身語言通俗的寫出來,後續專門寫一篇《掀起ElasticSearch的蓋頭》

6、重要知識點:

6.一、核心數據類型:

text:文本,默認會採用指定分詞器進行分詞,而後按照分詞進行倒排索引。

keyword:一個串就是一個總體,直接按照keyword進行倒排索引。

6.二、分詞:

分詞是模糊匹配的基礎,好比「中華人民共和國」,不一樣的分詞器拆分不一樣,假設會將其拆分紅「中華」,「人民」,「共和國」。

因而當咱們利用「中華「進行模糊查詢時,中華人民共和國就會被咱們檢索到。

6.三、經常使用工具:

Kibana(ELK中的K):功能強大,酷炫。使用起來沒有eshead的」德福感「(絲滑)

es_head:小而精悍,你要的他都有。

7、事上煉:

SpringBoot+ElasticSearch

7.一、es數據來源:

  7.1.一、利用logstash導入

  7.1.二、利用java api導入

7.二、es操做:

ES 7.0版本中將棄用TransportClient客戶端,已證實存在性能問題

目前大都採用:ElasticsearchTemplate

7.三、例子

7.3.一、es中的結構

"name": {
  "type": "text",     #支持text,用於模糊匹配
  "fields": {
     "keyword": {
        "ignore_above": 256,
        "type": "keyword"     #支持keyword,用戶精確匹配
    }
  }
}

7.3.二、模糊匹配

  一、將要查詢的詞,先進行分詞,再進行匹配(MatchQuery)

  二、將要查詢的詞,做爲一個總體,進行匹配(MatchPraseQuery),主要用這種

/** * 模糊匹配*/
public List getEidsFromEs(String name) { QueryBuilder queryBuilder = QueryBuilders.matchPhraseQuery(name, "name"); Pageable pageable =  PageRequest.of(0, 10);  //分頁
    NativeSearchQuery searchQuery = new NativeSearchQueryBuilder() .withQuery(queryBuilder) .withIndices("index") .withTypes("_doc") .withPageable(pageable) .build(); AggregatedPage<doc> docs = template.queryForPage(searchQuery, doc.class); List<doc> eids = docs.getContent(); return eids; } 

 

7.3.3精確匹配場景

  一、單條件,單字段(條件:」中華「,查詢es中name字段)->termQuery

  二、單條件,多字段(條件:」中華「,查詢es中name,ename,com_name字段)->termQuery+boolQuery

  三、多條件,單字段(條件:」中華「,」中國「,查詢es中name)->termsQuery

  四、多條件,多字段(條件:」中華「,」中國「,查詢es中name,ename,com_name字段)->termQuery+boolQuery

 

/** * <單條件,單字段>模糊匹配*/
public List getEidsFromEs(String name) { name = name + ".keyword";   //這很關鍵,增長後綴,啓用keyword精確匹配
    QueryBuilder queryBuilder = QueryBuilders.termQuery(name, "name"); Pageable pageable =  PageRequest.of(0, 10);  //分頁
    NativeSearchQuery searchQuery = new NativeSearchQueryBuilder() .withQuery(queryBuilder) .withIndices("index") .withTypes("_doc") .withPageable(pageable) .build(); AggregatedPage<doc> docs = template.queryForPage(searchQuery, doc.class); List<doc> eids = docs.getContent(); return eids; }

 

  

/** * <單條件,多字段>模糊匹配*/ Map<String, Object> boolQueryMap = new HashMap<>(); Map<String, Object> boolQuery = new HashMap<>(); for (String key : keys) { boolQueryMap.put(key+".keyword", name); boolQuery.put(key+".keyword", Constants.SHOULD); } SearchQueryBean searchQueryBean = new SearchQueryBean() .setIndex(Constants.CBI_COMMON_INDEX).setType(Constants.CBI_COMMON_DOC) .setBoolQuery(boolQuery).setBoolQueryMap(boolQueryMap) .setPageNum(0).setPageSize(10) .setClazz(EsIndexDocument.class); BoolQueryBuilder booleanBoolQuery = QueryBuilders.boolQuery(); Iterator var3 = searchQueryBean.boolQueryMap.keySet().iterator(); while(var3.hasNext()) { Object key = var3.next(); if (searchQueryBean.getBoolQuery().containsKey(key)) { QueryBuilder queryBuilder = QueryBuilders.termQuery(key.toString(), searchQueryBean.boolQueryMap.get(key)); Method method = booleanBoolQuery.getClass().getMethod(searchQueryBean.getBoolQuery().get(key).toString(), QueryBuilder.class); method.invoke(booleanBoolQuery, queryBuilder); } } NativeSearchQuery searchQuery = this.buildNativeSearchQuery(searchQueryBean, booleanBoolQuery); return this.elasticsearchTemplate.queryForPage(searchQuery, searchQueryBean.getClazz());

 

寫到這裏,文章已經到了尾聲,此篇文章,主要講述了es的入門步驟,也僅僅是入門,學習仍是在我的。

對文中有任何異議,可隨時留言或者郵箱反饋:wpt191@163.com,您的反饋是咱們共同進步的催化劑。

仍是那句話:學一門,愛一門,精一門,從知道到作到,還須要不停的努力與付出。

相關文章
相關標籤/搜索