目錄
??1.簡單介紹
??2.安裝與下載
??3.安裝啟動es
??4.安裝啟動kibana?
??5.初步檢索?
??6.進(jìn)階檢索
??7.Elasticsearch整合?
1.簡單介紹??????
Elaticsearch,簡稱為ES, ES是一個開源的高擴展的分布式全文搜索引擎,是整個ElasticStack技術(shù)棧的核心。它可以近乎實時的存儲、檢索數(shù)據(jù);本身擴展性很好,可以擴展到上百臺服務(wù)器,處理PB級別的數(shù)據(jù)。
官方地址:來這哈
2.安裝與下載??????
- 1.docker pull elasticsearch:7.4.2
在docker中使用命令拉取鏡像,安裝到docker
- 2.docker pull kibana:7.4.2
安裝es可視化工具
安裝需要時間,莫著急哦~?
3.安裝啟動es??????
- ?1.創(chuàng)建掛載目錄
mkdir -p /mydata/elasticsearch/config
mkdir -p /mydata/elasticssearch/data
- 2.設(shè)置允許遠(yuǎn)程訪問?
echo "http.host: 0.0.0.0" >> /mydata/elasticsearch/config/elasticsearch.yml
- 3.給文件賦權(quán)限?
給elasticsearch下全部文件賦可讀可寫可執(zhí)行的權(quán)限
chomd -R 777 /mydata/elasticsearch/
- 4..啟動elasticsearch?
docker run --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms64m -Xmx128m" -v /mydata/elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/elasticsearch.yml -v /mydata/elasticsearch/data:/usr/share/elasticsearch/data -v /mydata/elasticsearch/plugins:/usr/share/elasticsearch/plugins -d elasticsearch:7.4.2
- --name : 容器名字
- -p: 暴露端口、9200:訪問端口,9300:做集群時內(nèi)部暴露端口
- -e "discovery.type=single-node" : 單機啟動
- -e ES_JAVA_OPTS="-Xms64m -Xmx128m" : 初始64m,最大128m
- -v: 將容器中的文件掛在到自己的機器上
- -d: 啟動鏡像的名稱?
?5.訪問
端口
4.安裝啟動kibana???????
- 1.查看docker對外暴露的ip
docker inspect elasticsearch | grep IPAddress
- 2.啟動kibana?
docker run --name kibana -e ELASTICSEARCH_HOSTS=http://剛剛查出來的docker暴露的ip:9200 -p 5610:5610 -d kibana:7.4.2
ELASTICSEARCH_HOSTS= “不是自己的Linux上的ip地址,而是步驟一查出來docker地址”
- 3.訪問
5.初步檢索???????
5.1_cat
使用postman發(fā)送請求~,使用自己虛擬機的IP地址?。。?/strong>全部為GET請求
- 1.查看所有節(jié)點信息??/_cat/nodes
http://192.168.20.130:9200/_cat/nodes
- 2.查看es健康狀況??/_cat/health
http://192.168.20.130:9200/_cat/health
- 3.查看主頁節(jié)點??/_cat/master
http://192.168.20.130:9200/_cat/master
- 4.查看所有索引???/_cat/indices
http://192.168.20.130:9200/_cat/indices
5.2索引一個文檔(保存)
保存一個數(shù)據(jù),保存在哪個索引的那個類型下指定用哪個唯一標(biāo)識?
- 1.使用命令保存一條記錄(put/post請求、發(fā)送json)
http://192.168.20.130:9200/customer/external/1
注:
- 1.同一個請求,發(fā)送多次,就變?yōu)樾薷膥
- 2.POST新增。如果不指定id,會自動生成id。指定id 就會修改這個數(shù)據(jù),并新增版本號
- 3.PUT可以新增可以修改。PUT必須指定id;由于PUT需要指定id,我們一般都用來做修操作,不指定id會報錯。
5.3查詢文檔?
- 1.發(fā)送get請求查詢??customer/external/
http://192.168.20.130:9200/customer/external/1
5.4更新一個文檔?
發(fā)送PSOT請求,指定哪個索引下,哪個類型下,id的是多少
- 1.post攜帶update
會對比原來的數(shù)據(jù),如果更新前后一致,則不做改變。
http://192.168.20.130:9200/customer/external/1/_update
- 2.post不攜帶update?
不會對比原來的數(shù)據(jù),直接疊加版本
http://192.168.20.130:9200/customer/external/1
- 3.put?
和post不懈怠update一樣,put可以新增也可以修改,但必須指定id
http://192.168.20.130:9200/customer/external/1
5.5刪除
發(fā)送delete請求,刪除那個索引、那個類型下的id
- 1.刪除某一條數(shù)據(jù)
http://192.168.20.130:9200/customer/external/1
- 2.刪除整個索引?
http://192.168.20.130:9200/customer
5.6bulk批量api?
- 1.使用kibana批量發(fā)送
- 2.es測試數(shù)據(jù)?
測試數(shù)據(jù)放到資源那里了,自行下載
6.進(jìn)階檢索??????
6.1基本檢索方式
- ?1.第一種檢索:檢索條件直接寫在路徑后面
GET bank/_search?q=*&sort=account_number:asc
- 2.第二種檢索:使用請求體
使用Query DSL,提供一個可執(zhí)行的Json風(fēng)格的DSL
GET bank/_search
{
"query": {
"match_all": {}
},
"sort": [
{
"balance": {
"order": "desc"
}
}
],
"from": 0,
"size": 5,
"_source": [
"balance",
"firstname"
]
}
query:代表查詢條件?
sort:代表排序條件
from: 從第幾條數(shù)據(jù)開始查
size:每次查出多少條數(shù)據(jù)
_source:指定命中的字段
?6.2基本語法
- 1.match【模糊查詢】
模糊檢索
GET bank/_search
{
"query": {
"match": {
"address": "kings"
}
}
}
- 2.match_phrase【字段查詢】
指定上相應(yīng)的字段和對應(yīng)的值,進(jìn)行精確查詢
GET bank/_search
{
"query": {
"match_phrase": {
"address": "kings"
}
}
}
- 3.multi_match【多字段查詢】
多字段匹配,fileds里的字段,只要有一個匹配query的值即可,而且還是分詞查
GET bank/_search
{
"query": {
"multi_match": {
"query": "mill",
"fields": ["address","city"]
}
}
}
- 4.bool 【復(fù)合查詢】
?must: 必須匹配
must_not: 不能匹配
should:匹不匹配都可以
GET bank/_search
{
"query": {
"bool": {
"must": [
{
"match": {
"gender": "M"
}
},
{
"match": {
"address": "mill"
}
}
],
"must_not": [
{
"match": {
"age": "28"
}
}
],
"should": [
{"match": {
"lastname": "wallace"
}}
]
}
}
}
- 4.filter【結(jié)果過濾】
不計算相關(guān)性得分
GET bank/_search
{
"query": {
"bool": {
"filter": {
"range": {
"age": {
"gte": 18,
"lte": 30
}
}
}
}
}
}
- 5.term
term是代表完全匹配,也就是精確查詢,搜索前不會再對搜索詞進(jìn)行分詞拆解。
GET bank/_search
{
"query": {
"term": {
"age":28
}
}
}
- 6.aggregations【執(zhí)行聚合】
- 聚合提供了從數(shù)據(jù)中分組和提取數(shù)據(jù)的能力。
- 最簡單的聚合方法大致等于SQLGROUPBY和SQL聚合函數(shù)。
- 在Elasticsearch中,您有執(zhí)行搜索返回hits (命中結(jié)果) ,并且同時返回聚合結(jié)果,把一個響應(yīng)中的所有hits (命中結(jié)果)分隔開的能力。這是非常強大且有效的,您可以執(zhí)行查詢和多個聚合,并且在一次使用中得到各自的(任何一個的)返回結(jié)果,使用一次簡潔和簡化的API來避免網(wǎng)絡(luò)往返。
GET bank/_search
{
"query": {
"match": {
"address": "mill"
}
},
"aggs": {
"ageAgg": {
"terms": {
"field": "age",
"size": 10
}
},
"ageAvg":{
"avg": {
"field": "age"
}
},
"balanceAvg":{
"sum": {
"field": "balance"
}
}
},
"size": 0
}
aggs:使用聚合函數(shù),名稱要見名知意?
avg:表示平均值
sum:表示求和
查出所有年齡分布,并且這些年齡段中M的平均薪資和F的平均薪資以及這個年齡段總體平均薪資
GET bank/_search
{
"query": {
"match_all": {}
},
"aggs": {
"ageAgg": {
"terms": {
"field": "age",
"size": 100
},
"aggs": {
"genderAgg": {
"terms": {
"field": "gender.keyword",
"size": 10
},"aggs": {
"balanceAvg": {
"avg": {
"field": "balance"
}
}
}
},
"ageBalance": {
"avg": {
"field": "balance"
}
}
}
}
}
}
子聚合,在一個聚合函數(shù)名稱下,在使用aggs聚合?
6.3Mapping
- 1.創(chuàng)建映射
在創(chuàng)建索引時,規(guī)定字段的類型
PUT /my_index
{
"mappings": {
"properties": {
"age": {"type": "integer"},
"email": {"type": "keyword"},
"name": {"type": "text"}
}
}
}
- 2.添加新的字段映射?
PUT /my_index/_mapping
{
"properties":{
"employee-id":{
"type": "keyword",
"index": false
}
}
}
- 3.更新映射
對于已經(jīng)存在的映射字段,我們不能更新。更新必須創(chuàng)建新的索引進(jìn)行數(shù)據(jù)遷移
- 4.數(shù)據(jù)遷移
先創(chuàng)建出新的正確映射,然后再遷移
POST _reindex
{
"source": {
"index": "bank",
"type": "account"
},
"dest": {
"index": "newbank"
}
}
source:原數(shù)據(jù)
dest:要遷移的數(shù)據(jù)
index:要遷移數(shù)據(jù)的名稱
type:遷移數(shù)據(jù)的類型
6.4分詞
- 一個tokenizer (分詞器)接收一個字符流,將之分割為獨立的tokens (詞元,通常是獨立的單詞),然后輸出 tokens 流。
- 例如, whitespace tokenizer 遇到空白字符時分割文本。它會將文本"Quick brown fox!" 分割為[Ouick, brown, fox]
- 1.安裝ik分詞器
官網(wǎng):ik分詞器
解壓到elasticsearch的plugins下~ ,記得重啟elasticsearch??!
- 2.測試分詞效果?
- 3.自定義分詞?
3.1使用nginx配置分詞,再nginx的html下創(chuàng)建文件夾es,并配置location
?3.2配置分詞器地址
在ik分詞器的配置文件中,添加分詞器地址
重啟elastic search~?
7.Elasticsearch整合???????
7.1創(chuàng)建服務(wù)
在父工程下創(chuàng)建新模塊作為檢索服務(wù),并導(dǎo)入依賴
<!--導(dǎo)入es的rest-high-level-client-->
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
<version>7.4.2</version>
</dependency>
但是如果<elasticsearch.version>7.4.2</elasticsearch.version>不生效,jar包沖突,版本不匹配,將版本不匹配的移除,重新引入?。。?
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
<version>7.4.2</version>
<exclusions>
<exclusion>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
</exclusion>
<exclusion>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-client</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-client</artifactId>
<version>7.4.2</version>
</dependency>
<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
<version>7.4.2</version>
</dependency>
7.2寫配置
編寫配置類,被容器中注入RestHighLevelClient,并寫入預(yù)檢請求文章來源:http://www.zghlxwxcb.cn/news/detail-829620.html
@Configuration
public class ElasticSearchConfig {
public static final RequestOptions COMMON_OPTIONS;
static {
RequestOptions.Builder builder = RequestOptions.DEFAULT.toBuilder();
COMMON_OPTIONS = builder.build();
}
@Bean
public RestHighLevelClient esRestClient() {
RestHighLevelClient client = new RestHighLevelClient(
RestClient.builder(
new HttpHost("192.168.20.130", 9200, "http")
)
);
return client;
}
}
7.3測試
- 1.測試保存請求,也可修改
@Test
public void indexData() throws IOException {
IndexRequest indexRequest = new IndexRequest("users");
indexRequest.id("1");
//推薦方式,將對象轉(zhuǎn)換為json
User user = new User();
user.setUserName("會敲代碼的小張");
user.setAge(18);
user.setGender("男");
String jsonString = JSON.toJSONString(user);
indexRequest.source(jsonString, XContentType.JSON);
//執(zhí)行保存
IndexResponse index = restHighLevelClient.index(indexRequest, ElasticSearchConfig.COMMON_OPTIONS);
//提取有用的數(shù)據(jù)
System.out.println(index);
}
@Data
class User{
private String userName;
private String gender;
private Integer age;
}
- 2.復(fù)查檢索
@Test
public void select() throws IOException {
//1.創(chuàng)建檢索請求
SearchRequest searchRequest = new SearchRequest();
//2.指定索引
searchRequest.indices("bank");
//3.指定DSL檢索條件
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
//3.1構(gòu)造query條件
sourceBuilder.query(QueryBuilders.matchQuery("address", "mill"));
//3.2構(gòu)造聚合條件
//3.2.1-按照你啊年齡聚合
TermsAggregationBuilder ageAgg = AggregationBuilders.terms("ageAgg").field("age").size(10);
sourceBuilder.aggregation(ageAgg);
//3.2.2-計算平均薪資
AvgAggregationBuilder balanceAvg = AggregationBuilders.avg("balanceAvg").field("balance");
sourceBuilder.aggregation(balanceAvg);
System.out.println("檢索條件" + sourceBuilder.toString());
searchRequest.source(sourceBuilder);
//4.執(zhí)行檢索
SearchResponse searchResponse = restHighLevelClient.search(searchRequest, ElasticSearchConfig.COMMON_OPTIONS);
//5.分析結(jié)果
System.out.println("查詢結(jié)果" + searchResponse.toString());
//5.1獲取查到的所有數(shù)據(jù)
SearchHits hits = searchResponse.getHits();
//5.2查詢真正的命中記錄
SearchHit[] searchHits = hits.getHits();
for (SearchHit hit : searchHits) {
String sourceAsString = hit.getSourceAsString();
Account account = JSON.parseObject(sourceAsString, Account.class);
System.out.println("值:" + account);
}
//5.3獲取分析信息
Aggregations aggregations = searchResponse.getAggregations();
Terms ageAgg1 = aggregations.get("ageAgg");
for (Terms.Bucket bucket : ageAgg1.getBuckets()) {
String keyAsString = bucket.getKeyAsString();
System.out.println("年齡:"+keyAsString+"===>"+bucket.getDocCount());
}
Avg balanceAvg1 = aggregations.get("balanceAvg");
System.out.println("平均薪資:"+balanceAvg1.getValue());
}
文章來源地址http://www.zghlxwxcb.cn/news/detail-829620.html
到了這里,關(guān)于Elasticsearch從入門到精通的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!