維基百科, github都使用 ELK (ElasticSearch es book)html
Elasticsearch入門,這一篇就夠了==>https://www.cnblogs.com/sunsky303/p/9438737.htmljava
# 下載 docker pull docker.io/elasticsearch:6.5.1 # 安裝 docker run -e ES_JAVA_OPTS="-Xms512m -Xmx512m" -d -p 9200:9200 -p 9300:9300 --name myELK elkImageId
ElasticSearch默認2個G堆內存, 爲了防止虛擬機內存不夠,要手動指定elk啓動參數 -e ES_JAVA_OPTS="-Xms256m -Xmx256m" , 9200是elk暴露的RestFUL HTTP服務端口, 9300是java客戶端調用的端口.node
在啓動時遇到異常: max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144] , 意爲ElasticSearch用戶虛擬機能使用的虛擬內存區域過小,須要調大到262144以上 , 按以下操做:mysql
# 修改配置文件 vi /etc/sysctl.conf # 最後一行添加 vm.max_map_count=655300 # 重載該配置文件 sysctl -p
注意: 純linux版啓動不能以root身份啓動 linux
#中止Elasticsearch進程 $kill `ps -ef | grep Elasticsearch | grep -v grep | awk '{print $2}'` #啓動Elasticsearch進程 $/elasticsearch-5.4.3/bin/elasticsearch -d
http://ip:9200/ 返回以下信息表示成功啓動git
{ "name" : "vcabSCo", "cluster_name" : "docker-cluster", "cluster_uuid" : "LPiwCqIYQACz5Eir5P1qBQ", "version" : { "number" : "6.5.1", "build_flavor" : "default", "build_type" : "tar", "build_hash" : "8c58350", "build_date" : "2018-11-16T02:22:42.182257Z", "build_snapshot" : false, "lucene_version" : "7.5.0", "minimum_wire_compatibility_version" : "5.6.0", "minimum_index_compatibility_version" : "5.0.0" }, "tagline" : "You Know, for Search" }
http://ip:9200/index/type/id 爲查詢指定ides6
http://ip:9200/index/type/_search 爲查詢全部github
索引 = mysql數據庫web
類型 = mysql數據表redis
文檔 = mysql表字段內容 ( ES中使用json數據保存 )
processon地址: https://www.processon.com/diagraming/5ceb8caee4b0899ed43db40e
ElasticSearch和Mysql對應關係
技術 | 庫名 | 表 | 行 | 列 | |
mysql | Databases | Tables | Rows | Columns | |
ElasticSearch | Indices | Types | Documents | Fields |
jest是用於直聯ElasticSearch服務的, 就好像redisClient 直聯redis服務同樣.
默認jest是不生效的, 須要導入jest的工具包(io.searchbox.client.JestClient) , 注意jest的大版本號和ES的大版本號要一致.
該模式的自動配置類爲: JestAutoConfiguration
導入以後JestAutoConfiguration裏的內容就不會報紅色錯誤了, 可是發現高版本springboot好像不導也正常.
<!--取消spring-boot-starter-data-elasticsearch依賴--> <!--<dependency>--> <!--<groupId>org.springframework.boot</groupId>--> <!--<artifactId>spring-boot-starter-data-elasticsearch</artifactId>--> <!--</dependency>--> <dependency> <groupId>io.searchbox</groupId> <artifactId>jest</artifactId> <version>5.3.3</version> </dependency>
遇到錯誤,Jest沒法存數據到ElasticSearch中, java後臺不報錯, ElasticSearch也不報錯, 也沒有日誌顯示錯誤 ,
目前jest5.3.3對ElasticSearch5.6.12 能夠正常交互 , 但jest5.3.3對ElasticSearch6 或jest6對ElasticSearch6沒法正常交互.
經過使用Spring工具類轉發,步驟以下
1. pom.xml導入spring-boot-starter-data-elasticsearch依賴
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-elasticsearch</artifactId> </dependency>
2. 須要在application.properties中配置clusterNodes;clusterName
#使用springData鏈接ES #集羣名,訪問 http://centos:9200/ 後返回的cluster_name便是節點名 spring.data.elasticsearch.cluster-name=elasticsearch #IP:9300, 用的是9300通訊 spring.data.elasticsearch.cluster-nodes=centos:9300
3. 編寫ElasticsearchRepository子接口來操做ES (就好像hibernateTemplate同樣, 和JPA用法一致)
4. ElasticSearchTemplate 操做ES , 就好像(jdbcTemplate, 同樣, 未實驗, 只作了Repository的實驗)
另外特別注意在使用SpringData elasticSearch 和 elasticSearch對接時的要注意版本問題 , 如何找版本匹配參考下圖流程 , 懶人直接打開 https://github.com/spring-projects/spring-data-elasticsearch
趕上版本不匹配的機率較高, 會發生異常"NoNodeAvailableException[None of the configured nodes are available: [{#transport#-1}{3mA3x7OSSjustRG1_ZytWg}{centos}{192.168.2.106:9300}]" 通常有兩種處理方式
1. 調整springboot的版本(不建議)
2. 調整ElasticSearch的版本(建議)
RestHighLevelClient 建立索引:
public String createDocument() throws Exception { RestHighLevelClient client = new RestHighLevelClient(RestClient.builder(new HttpHost("nexus.isoftstones.com", 9201, "http"))); // 3. 增長文檔(若是類註釋推薦使用org.elasticsearch.client.Requests來建立類,最好用他推薦的方式) IndexRequest request = Requests.indexRequest("person"); request.id("docid2");// 指定ID request.source("personid", "2", "name", "jack", "birthday","2012-02-16");// 支持多種方式 IndexResponse indexResponse = client.index(request, RequestOptions.DEFAULT); System.out.println(indexResponse); return "建立成功"; }
RestHighLevelClient 查詢索引:
@RequestMapping({"/searchSomePerson"}) public List<Person> searchSomePerson() throws Exception { List<Person> personList = new ArrayList<>(); SearchRequest searchRequest = new SearchRequest("person");//qqq SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();//aaa // int newFrom = PaginationTool.firstResult(1 , PaginationTool.PAGE_SIZE); // sourceBuilder.from(newFrom); // sourceBuilder.size(PaginationTool.PAGE_SIZE); //他們之間默認是 or 的關係, name 包含 xxx or address 包含 xxx , 另注意multiMatchQuery()和matchQuery()兩個方法中的參數位置是互反的 QueryBuilder queryBuilder = QueryBuilders.multiMatchQuery("jack", "name", "address"); sourceBuilder.query(queryBuilder);//傳入QueryBuilder System.out.println("實際請求elastic search的json報文" + sourceBuilder.toString()); searchRequest.source(sourceBuilder); SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);//bbb searchResponse.getHits().forEach(hit -> { System.out.println(hit.getSourceAsString()); Person person = JSONObject.parseObject(hit.getSourceAsString(), Person.class); personList.add(person); }); System.out.println(personList); return personList; }
以上代碼位於https://gitee.com/KingBoBo/springboot-04-elastic-search.git
筆記1 : QueryBuilders.multiMatchQuery ------- 相對於matchQuery,multiMatchQuery針對的是多個field,也就是說,當multiMatchQuery中,fieldNames參數只有一個時,其做用與matchQuery至關;而當fieldNames有多個參數時,如field1和field2,那查詢的結果中,要麼field1中包含text,要麼field2中包含text。(本句話引用自: 分佈式搜索Elasticsearch——QueryBuilders.multiMatchQuery==>https://blog.csdn.net/geloin/article/details/8934951 )
public static MultiMatchQueryBuilder multiMatchQuery(Object text, String... fieldNames) { return new MultiMatchQueryBuilder(text, fieldNames); // BOOLEAN is the default }
筆記2: boolQueryBuilder.should(qb1).must(qb2);//若是直接使用should().must()組合,那麼should()會無效化 , 由於就算把should(qb1)前置 , 最終仍是會被must搶先,固然這並不是主要緣由 , 根據json報文實測發現 , 只要must和shoud同級別共存, should就會失效, 其它文章也有說起: elasticsearch6.6版本 es填坑之路 解決:QueryBuilder同時使用should must時,會影響should的篩選結果!==>https://blog.csdn.net/q18810146167/article/details/89404901
如下爲實際RESTFUL發送的報文:
{ "query": { "bool": { "must": [{ "wildcard": { "name": { "wildcard": "rose", "boost": 1.0 } } }], "should": [{ "wildcard": { "name": { "wildcard": "jack", "boost": 1.0 } } }], "adjust_pure_negative": true, "boost": 1.0 } } }
//模糊查詢 WildcardQueryBuilder queryBuilder1 = QueryBuilders.wildcardQuery("name", "*jack*");//搜索名字中含有jack的文檔 WildcardQueryBuilder queryBuilder2 = QueryBuilders.wildcardQuery("name", "*rose*");//搜索名字中含有rose的文檔 BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery(); //name中必須含有jack,name中必須含有rose,至關於and boolQueryBuilder.must(queryBuilder1); boolQueryBuilder.must(queryBuilder2);
//模糊查詢 WildcardQueryBuilder queryBuilder1 = QueryBuilders.wildcardQuery("name", "*jack*");//搜索名字中含有jack的文檔 WildcardQueryBuilder queryBuilder2 = QueryBuilders.wildcardQuery("name", "*rose*");//搜索名字中含有rose的文檔 BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery(); //name中必須含有jack,name中必須含有rose,至關於and boolQueryBuilder.should(queryBuilder1); boolQueryBuilder.should(queryBuilder2);
Elasticsearch——QueryBuilder簡單查詢==>https://www.cnblogs.com/sbj-dawn/p/8891419.html
即修改elasticsearch的啓動腳本(elasticsearch_HOME/bin/elasticsearch)
[root@master01 elasticsearch-6.0.0]# vim bin/elasticsearch # 添加如下代碼 export JAVA_HOME=/home/elsearch/jdk1.8.0_121/ (此處配置的爲剛下的1.8的配置目錄) export PATH=$JAVA_HOME/bin:$PATH if [ -x "$JAVA_HOME/bin/java" ]; then JAVA="/home/elsearch/jdk1.8.0_121/bin/java" else JAVA=`which java` fi
使用wildcard進行查詢
dsl語法
{
"query": { "wildcard": { "intf": "*measure*" } } }
java 客戶端語法
wildcardQuery("description", "*"+searchStr.toLowerCase()+"*")
須要注意的是wildcard不識別大寫,須要將查詢的詞轉爲小寫。
安裝插件時也不能以root身份安裝, 否則涉及權限問題,如下爲安裝圖型化界面elasticsearch-sql命令
[root]#su es [es]$ ./bin/elasticsearch-plugin install https://github.com/NLPchina/elasticsearch-sql/releases/download/7.1.1.0/elasticsearch-sql-7.1.1.0.zip
es6.3+開始 , 在elasticsearch/bin
目錄下調用./elasticsearch-sql-cli
進入命令行 (https://www.jianshu.com/p/66ba200520ed)
默認狀況下elasticsearch-sql-cli會嘗試鏈接localhost:9200, 若是你修改了ES的端口,須要指定新的ES訪問地址,好比 你的ES端口設置成 8888
, 那麼須要輸入下列命令來打開./elasticsearch-sql-cli http://localhost:8888
若是生產環境沒法鏈接外網, 須要在windows上下載好zip文件後, 上傳到生產服務器, 再在命令中的install後追加file:以執行安裝
./bin/elasticsearch-plugin install file:/opt/elasticsearch-7.1.1.0/elasticsearch-sql-7.1.1.0.zip
官方的模擬工具是控制檯的curl,不是很直觀,能夠在chrome瀏覽器中安裝head插件來做爲請求的工具:head插件的地址:https://chrome.google.com/webstore/detail/elasticsearch-head/ffmkiejjmecolpfloofpjologoblkegm/
隨着 7.0 版本的即將發佈,type
的移除也是愈來愈近了,在 6.0 的時候,已經默認只能支持一個索引一個 type 了,7.0 版本新增了一個參數 include_type_name
,即讓全部的 API 是 type 相關的,這個參數在 7.0 默認是 true
,不過在 8.0 的時候,會默認改爲 false
,也就是不包含 type 信息了,這個是 type 用於移除的一個開關。
讓咱們看看最新的使用姿式吧,當 include_type_name
參數設置成 false
後:
須要修改爲
PUT {index}/_doc/{id}PUT {index}/{type}/_mapping
則變成 PUT {index}/_mapping
_type
都將被移除join
字段來構建
$$$$$ElasticSearch入門3: 高級查詢==>https://www.cnblogs.com/liuxiaoming123/p/8124969.html
#建立索引 PUT twitter { "mappings": { "_doc": { "properties": { "type": { "type": "keyword" }, "name": { "type": "text" }, "user_name": { "type": "keyword" }, "email": { "type": "keyword" }, "content": { "type": "text" }, "tweeted_at": { "type": "date" } } } } } #修改索引 PUT twitter/_doc/user-kimchy { "type": "user", "name": "Shay Banon", "user_name": "kimchy", "email": "shay@kimchy.com" } #搜索 GET twitter/_search { "query": { "bool": { "must": { "match": { "user_name": "kimchy" } }, "filter": { "match": { "type": "tweet" } } } } } #重建索引 POST _reindex { "source": { "index": "twitter" }, "dest": { "index": "new_twitter" } }
本小節引用自: Elasticsearch 移除 type 以後的新姿式==>https://elasticsearch.cn/article/601
使用Java High Level REST Client操做elasticsearch==>https://www.cnblogs.com/ginb/p/8716485.html
Elasticsearch技術解析與實戰(四)shard&replica機制==>https://www.cnblogs.com/cnki/p/7497222.html
SpringBoot整合ElasticSearch實現多版本的兼容==>https://www.cnblogs.com/xuwujing/p/8998168.html
elasticsearch安裝之各類坑==>https://www.cnblogs.com/gudulijia/p/6761231.html
【轉載】Elasticsearch--java操做之QueryBuilders構建搜索Query==>https://www.cnblogs.com/wbl001/p/11645044.html
使用Java High Level REST Client操做elasticsearch==>https://www.cnblogs.com/ginb/p/8716485.html
ES 自帶了不少默認的分詞器,好比Standard、Keyword、Whitespace等等,默認是Standard
ElasticSearch入門 第七篇:分詞==>https://www.cnblogs.com/ljhdo/p/5012510.html
掌握 analyze API,一舉搞定 Elasticsearch 分詞難題==>https://baijiahao.baidu.com/s?id=1609869808965712860&wfr=spider&for=pc
ElasticSearch 7.1.1 集羣環境搭建【轉】==>https://www.cnblogs.com/whatlonelytear/p/11623882.html
Elasticsearch入門,這一篇就夠了【純轉】==>https://www.cnblogs.com/whatlonelytear/p/11811827.html
Elasticsearch Pipeline 詳解==>https://blog.csdn.net/chunqiqian1285/article/details/100977188
ElasticSearch11:_version和external version進行樂觀鎖併發控制==>https://blog.csdn.net/m0_37557582/article/details/78922713 (默認自帶INTERNAL內部版本鎖, 也可使用EXTERNAL外部版本鎖)
Removal of mapping types映射類型mapping==>https://www.cnblogs.com/Neeo/articles/10393961.html#important
【ElasticSearch系列(三)】性能優化之==》https://blog.csdn.net/zhanyu1/article/details/88927194