誰在使用ELK
維基百科, github都使用 ELK (ElasticSearch es book)
es安裝
Elasticsearch 7.x 最詳細安裝及配置==>https://www.cnblogs.com/Alandre/p/11386178.html
遇見異常
max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
在 /etc/sysctl.conf檔案最後添加一行 vm.max_map_count=262144
ElasticSearch入門
Elasticsearch入門,這一篇就夠了==>https://www.cnblogs.com/sunsky303/p/9438737.html
docker下載下傳并啟動ElasticSearch
# 下載下傳
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用戶端調用的端口.
在啟動時遇到異常: max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144] , 意為ElasticSearch使用者虛拟機能使用的虛拟記憶體區域太小,需要調大到262144以上 , 按如下操作:
# 修改配置檔案
vi /etc/sysctl.conf
# 最後一行添加
vm.max_map_count=655300
# 重載該配置檔案
sysctl -p
附非docker, 純linux版啟停指令
注意: 純linux版啟動不能以root身份啟動
#停止Elasticsearch程序
$kill `ps -ef | grep Elasticsearch | grep -v grep | awk \'{print $2}\'`
#啟動Elasticsearch程序
$/elasticsearch-5.4.3/bin/elasticsearch -d
通路
http://ip:9200/ 傳回如下資訊表示成功啟動
{
"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 為查詢指定id
http://ip:9200/index/type/_search 為查詢所有
ElasticSearch 各元件概念
索引 = mysql資料庫
類型 = mysql資料表
文檔 = mysql表字段内容 ( ES中使用json資料儲存 )
processon位址: https://www.processon.com/diagraming/5ceb8caee4b0899ed43db40e
ElasticSearch和Mysql對應關系
技術 | 庫名 | 表 | 行 | 列 |
mysql | Databases | Tables | Rows | Columns |
ElasticSearch | Indices | Types | Documents | Fields |
java連接配接ELK有兩種方式
方式一: jest
jest是用于直聯ElasticSearch服務的, 就好像redisClient 直聯redis服務一樣.
預設jest是不生效的, 需要導入jest的工具包(io.searchbox.client.JestClient) , 注意jest的大版本号和ES的大版本号要一緻.
該模式的自動配置類為: JestAutoConfiguration
pom.xml導依賴
導入之後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無法正常互動.
方式二: SpringData ElasticSearch
通過使用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的版本(建議)
3. Elasticsearch報 NoNodeAvailableException 的解決辦法==>https://blog.csdn.net/adsl624153/article/details/78935796 (未親測)
方式三 RestHighLevelClient
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 (field1包含text OR 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
}
}
}
rivate IndexRequest upsertRequest:使用該 字段進行更新操作,如果原索引不存在,則更新,類似于saveOrUpdate操作,該操作需要與腳步執行,詳細将在後續章節中描述. 該小段引用自 Elasticsearch Document Update API詳解、原理與示例==>https://www.jianshu.com/p/8be5dcf450da
BoolQueryBuilder聯合查詢
//模糊查詢
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指定目錄的jdk (未親測)
即修改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
elk使用like查詢
使用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
用戶端工具
ElasticHD windows桌面用戶端
chrome插件 ElasticSearch Head
官方的模拟工具是控制台的curl,不是很直覺,可以在chrome浏覽器中安裝head插件來作為請求的工具:head插件的位址:https://chrome.google.com/webstore/detail/elasticsearch-head/ffmkiejjmecolpfloofpjologoblkegm/
Dejavu (使用中)
版本問題
随着 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}/{type}/{id}
PUT {index}/_doc/{id}需要修改成
- Mapping 操作:
則變成PUT {index}/{type}/_mapping
PUT {index}/_mapping
- 所有增删改查搜尋操作傳回結果裡面的關鍵字
都将被移除_type
- 父子關系使用
字段來建構join
RESTFUL請求
$$$$$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": "[email protected]"
}
#搜尋
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
異常
elasticsearch exception
es無法啟動,配置記憶體大小(好像無用)
修改 /data/elasticsearch/bin/elasticsearch export ES_HEAP_SIZE=512m
The Java High Level REST Client
使用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
ElasticSearchRepository和ElasticSearchTemplate的使用==>https://blog.csdn.net/trusause/article/details/79583873
RestHighLevelClient
springboot使用RestHighLevelClient7簡單操作ElasticSearch7增删查改/索引建立==>https://www.cnblogs.com/java-spring/p/11721615.html
$$$Elasticsearch Java API的基本使用==>https://www.jianshu.com/p/5cb91ed22956
$$$$$Elasticsearch筆記(八):用戶端連接配接==>https://blog.csdn.net/alex_xfboy/article/details/85332370
查詢知識點
es---elasticsearch7.1.1 QueryBuilders簡單查詢==>https://blog.csdn.net/VIP_1205169154/article/details/100539811
[Elasticsearch] 多字段搜尋 (三) - multi_match查詢和多數字段==>https://blog.csdn.net/dm_vincent/article/details/41842691
【轉載】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/remainsu/p/elasticsearch-711-ji-qun-huan-jing-da-jian.html
自己轉載的備份
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 Query DSL 整理總結(四)—— Multi Match Query==>https://www.cnblogs.com/reycg-blog/p/10055039.html
優化
【ElasticSearch系列(三)】性能優化之==》https://blog.csdn.net/zhanyu1/article/details/88927194
我的項目git位址
https://gitee.com/KingBoBo/springboot-04-elastic-search