安裝部署
先前部署項目部署es的流程
下載elasticsearch
https://www.elastic.co/cn/downloads/elasticsearch
解壓安裝elasticsearch
修改配置文件,配置為單個節(jié)點
config/elasticsearch.yml
discovery,seed_hosts:[“127.0.0.1:9200”]
cluster.initial_master_nodes:[“node-1”]
因為部分elasticsearch支持的jdk版本不一樣,所以可以自己再給elasticsearch配置一個jdk版本
啟動elasticsearch
因為elasticsearch不能以root用戶啟動,所以 要新建一個用戶用來啟動elasticsearch
adduser 新用戶名
passwd 初始化新用戶的密碼
使用root用戶找到sudoers文件,賦予可讀寫權限
whereis sudoers
修改權限
chomd -v u+w sudoers的路徑
進入sudoers文件,在root下添加
新用戶用戶名 ALL=(ALL) ALL
切換到新用戶
su 新用戶名
之后進入elasticsearch目錄下,進入bin目錄,后臺運行elasticsearch
./elasticsearch -d
部署問題(使用版本為7.16)
啟動配置
- es的安裝目錄下的config/elasticsearch.yml
集群名設置
cluster.name: 集群名
節(jié)點名設置
node.name: 當前節(jié)點名
任何ip都能訪問
network.host: 0.0.0.0
啟動端口
http.port: 9200
jdk版本不對
一般使用的jdk為8版本,但是es版本不支持jdk8,所以要給es專門配置一套jdk
es要求的版本最低為11版本
所以,下載11版本的jdk,并在環(huán)境變量中配置ES_JAVA_HOME即可
啟動權限問題
按照上述的方式配好用戶后,可能還是會提示沒有權限啟動
啟動的時候不能使用sudo方式,不然依舊是“不能以root用戶啟動es”的報錯
最直接的方式就是新建一個用戶后,把es的安裝目錄的權限分給新用戶
例如(root用戶下)
adduser es
chown -R es es安裝目錄
jvm警告
Java HotSpot? 64-Bit Server VM warning: Option UseConcMarkSweepGC was deprecated in version 9.0 and will likely be removed in a future release.
這個錯誤需要修改es安裝目錄下的config/jvm.optionsn
將
-XX:+UseConcMarkSweepGC
修改為
-XX:+UseG1GC
無法使用問題
部署完之后不僅要訪問ip:端口
查看啟動狀態(tài)
也需要ip:端口/_cat/nodes?pretty
檢查是否正常
如果顯示
{
"error": {
"root_cause": [
{
"type": "master_not_discovered_exception",
"reason": null
}
],
"type": "master_not_discovered_exception",
"reason": null
},
"status": 503
}
則還是沒有準備,去安裝目錄下的conf/elasticsearch.yml
中檢查配置
查看兩個內容,這兩個節(jié)點的內容一定要一致
cluster.initial_master_nodes: ["node1"]
node.name: node1
文件權限與存儲大小問題
報錯內容
ERROR: [2] bootstrap checks failed. You must address the points described in the following [2] lines before starting Elasticsearch.
bootstrap check failure [1] of [2]: max file descriptors [4096] for elasticsearch process is too low, increase to at least [65535]
bootstrap check failure [2] of [2]: max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
ERROR: Elasticsearch did not exit normally - check the logs at /usr/local/elasticsearch/elasticsearch/logs/my-application.log
解決方案
切換到root用戶修改一些內容
elasticsearch用戶擁有的可創(chuàng)建文件描述的權限太低,至少需要65536,
vim /etc/security/limits.conf # 在最后面追加下面內容
es啟動用戶 hard nofile 65536
es啟動用戶 soft nofile 65536
max_map_count文件包含限制一個進程可以擁有的VMA(虛擬內存區(qū)域)的數(shù)量
vim /etc/sysctl.conf # 在最后面追加下面內容
vm.max_map_count=655360
執(zhí)行 sysctl -p
介紹
es是一個分布式,高擴展,高實時的搜索與數(shù)據(jù)分析引擎,通過簡單的RESTful API來隱藏Lucene的復雜性,從而讓全文搜索變的簡單,本身擴展性很好,可以擴展到上百臺服務器,處理PB級別的數(shù)據(jù)
核心概念
es是面向文檔的搜索引擎
es和數(shù)據(jù)庫的比對
數(shù)據(jù)庫 | es |
---|---|
數(shù)據(jù)庫 | 索引 |
表 | types |
行 | documents |
字段 | fields |
文檔
es的數(shù)據(jù)存儲格式相當于索引下的類型里面的json格式的數(shù)據(jù)
因為es是面向文檔的搜索,所以一個文檔就是es中可搜索的最小的單元
類比于mysql中,就是把mysql中的一行數(shù)據(jù)以json的格式保存在es中
類型
相當于數(shù)據(jù)庫的表,一個索引下可以有很對類型,但是在es6.0開始,type就已經(jīng)主鍵廢棄了,但是依舊可以設置多個類型,但是在7.0開始,一個索引只能有一種類型了(_doc)
索引
不同特性的文檔存放在不同的索引里
索引名稱必去全部都是小寫
單個集群中可以定義任意多個索引
索引具有mapping和setting的概念,mapping用來定義文檔字段的類型,setting用來定義不同數(shù)據(jù)的分布
基本操作
創(chuàng)建一個空的索引
創(chuàng)建一個0副本2分片的repledata索引
PUT /ropledata
{
"settings": {
"number_of_shards": "2",
"number_of_replicas": "0"
}
}
修改副本數(shù)量(分片數(shù)量無法修改)
PUT ropledata/_settings
{
"number_of_replicas" : "2"
}
刪除索引
DELETE /ropledata
插入數(shù)據(jù)
插入數(shù)據(jù)的時候可以指定ID,不指定的話es會幫我們生成
id是101而不是數(shù)據(jù)中的"id":1
//指定id
POST /ropledata/_doc/101
{
"id":1,
"name":"且聽_風吟",
"page":"https://ropledata.blog.csdn.net",
"say":"歡迎點贊,收藏,關注,一起學習"
}
修改數(shù)據(jù)
es的文檔是不可以修改的,但是可以覆蓋,es的數(shù)據(jù)修改本質上就是對文檔的覆蓋
es對數(shù)據(jù)的修改分為全局更新和局部更新
全局更新是替換操作,就算是數(shù)據(jù)一樣也會執(zhí)行替換操作
局部更新是只有遇到新得內容的時候才會去更新
所以局部更新會比全局更新效率高
全局更新
PUT /ropledata/_doc/101
{
"id":1,
"name":"且聽_風吟",
"page":"https://ropledata.blog.csdn.net",
"say":"再次歡迎點贊,收藏,關注,一起學習"
}
局部更新
POST /ropledata/_update/101
{
"doc":
{
"say":"奧力給"
}
}
查詢數(shù)據(jù)
GET /ropledata/_doc/101
刪除數(shù)據(jù)
DELETE /ropledata/_doc/101
查詢語句
查詢當前索引下全部的內容,并返回指定屬性值的數(shù)據(jù)內容
(因為7.0之后是沒有type的概念了,所以使用了_doc,如果還有type的概念的話,可以把_doc替換為相對應的type名即可查詢)
GET /topledata/_doc/_search
{
"query":{
"match_all":{
}
},
"_source":["屬性值","屬性值"]
}
查詢指定字符查找內容,并按照倒序排列,從第0條數(shù)據(jù)開始,查找10條數(shù)據(jù)(也就是分頁查詢)
GET /topledata/_doc/_search
{
"query":{
"mathc":{
"屬性值":"關鍵字"
}
},
"sort":[
{
"屬性字段":{
"order":"desc"
}
}
],
"from":0,
"size":10
}
match
對于match而言,是根據(jù)分詞來查詢的,如果match中存在兩個分詞,那個他會一個一個查詢,之后取他們的一個并集
可以使用match_phrase來指定精準查詢不需要分詞查
多條件查詢
bool過濾可以用來合并多個過濾條件查詢結果的布爾邏輯
must多個查詢條件的完全匹配,相當于and
must_not多個查詢條件的相反匹配,相當于not
should至少有一個查詢條件匹配,相當于or
這些參數(shù)分別可以繼承一個過濾條件或者一個過濾條件的數(shù)組
GET /topledata/_doc/_search
{
"query":{
"bool":{
"must":[
{
"match":{
"屬性值":"關鍵詞"
}
}
]
},
"filter":{
"range":{
"關鍵詞":{
"判斷符":內容
}
}
}
}
}
聚合分析
es5之后fielddata默認是false,需要開啟這個才能進行聚合
GET /topledata/_mapping/product
{
"properties":{
"tags":{
"type":"text",
"fielddata":true
}
}
}
獲取某一列以不同分組的總和,并以某個條件做排序操作,并使用range過濾指定范圍的數(shù)據(jù)
terms和term類似,單terms允許指定多個匹配條件,如果某個字段指定了多個值,那么需要文檔一起做匹配
GET /topledata/_doc/_search
{
"query":{
"match":{
"屬性值":"關鍵詞"
}
},
"aggs":{
"聚合名稱":{
"terms":{
"field":"屬性值",
"range":[
{
"from":值,
"to":值
},
{
"from":值,
"to":值
}
],
"order":{
"下面的那個aggs的名稱":"desc"
}
}
},
"aggs":{
"自定義名稱":{
"avg":{
"field":"屬性值"
}
}
}
}
}
整合springboot
引入elasticsearch啟動包
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
配置yml文件
spring:
elasticsearch:
uris: http://ip:端口
#當前部署的es并沒有賬號和密碼
#username:
#password:
測試內容
實體類
新建一個實體類來標識一個索引
@Data
@Document(indexName = "testdemo")
public class EsDemoModel {
@Id
private String id;
@Field(type = FieldType.Text)
private String name;
@Field(type = FieldType.Text)
private String team;
}
方法
和redis類似,擁有一個ElasticsearchRestTemplate可以引用文章來源:http://www.zghlxwxcb.cn/news/detail-406968.html
保存
@Test
void EsSaveTest(){
EsDemoModel esDemoModel = new EsDemoModel();
esDemoModel.setName("panther");
esDemoModel.setTeam("marvel");
elasticsearchRestTemplate.save(esDemoModel);
}
查詢
@Test
void EsSearchTest(){
Query query = new NativeSearchQueryBuilder().withQuery(QueryBuilders.queryStringQuery("man").defaultField("name")).build();
SearchHits<EsDemoModel> search = elasticsearchRestTemplate.search(query, EsDemoModel.class);
List<EsDemoModel> collect = search.getSearchHits().stream().map(SearchHit::getContent).collect(Collectors.toList());
System.out.println(collect);
}
修改
es的操作和redis類似,如果遇到有相同_id的內容,就會覆蓋,所以查出來之后再保存可以保證對一條數(shù)據(jù)的修改文章來源地址http://www.zghlxwxcb.cn/news/detail-406968.html
刪除
@Test
void EsDelete(){
Query query = new NativeSearchQueryBuilder().withQuery(QueryBuilders.queryStringQuery("super man").defaultField("name")).build();
elasticsearchRestTemplate.delete(query,EsDemoModel.class);
}
到了這里,關于ES 部署,問題及整合spring boot 簡單使用的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!