基本使用注意事項

1.put和post都是提交數(shù)據(jù)轩勘,兩者的區(qū)別:put必須帶ID如果不帶ID直接報錯栈雳,如果ID已存在則是更新,ID不存在則是新增,POST可以不帶ID唱较,不帶ID則是新增扎唾。如果帶了ID,ID已存在則是修改南缓,ID不存在則是新增

2.get是查詢數(shù)據(jù)胸遇,在返回的結(jié)果中有_seq_no,并發(fā)控制字段汉形,每次更新都會+1纸镊,用來做樂觀鎖;_primary_term:同上概疆,主分片重新分配逗威,每次重啟都會分配新的數(shù)值,怎么使用呢岔冀,就是在url后面拼接上著兩個參數(shù)凯旭,例?if_seq_no=1&id_primary_term=1 如果這兩個數(shù)值都正確那么就會進(jìn)行更新,不正確就不會更新

3.更新操作post帶_update使套,如果和原來的數(shù)據(jù)一模一樣這樣就不進(jìn)行更新操作罐呼,seq_no,version_id都不會改變侦高,而且請求體中要在更新的內(nèi)容外面加一層"doc": {}嫉柴;put和post更新都不會檢查元素直接更新

4.批量操作post請求 url后面添加_bulk 請求體格式:

{action:{metadata}}

{requestbody};action指的是操作矫膨,metadata是指的是元數(shù)據(jù)(_index,_id等)requestbody是數(shù)據(jù)體差凹;批量操作沒有事物的說法,每個操作都是獨立的

4.查詢侧馅,可以在url中直接添加要查詢的參數(shù)危尿,也可將要查詢的條件寫到請求體中

get bank/_search

{

"query":{

"match_all": {}

},

"sort":[

{

"account_number": "asc"

},

{

"balance": "desc"

}

],

"from": 10,

"size": 10

"_source":["balance","firstname"] ###指定要查詢的列

}

根據(jù)某個字段進(jìn)行查詢,支持模糊查詢

"query": {

? ? "match": {

? ? ? "address": "kings"

? ? }

? }

進(jìn)行短語匹配馁痴,把后面的當(dāng)做一個短語一塊匹配

GET /bank/_search

{

? "query": {

? ? "match_phrase": {

? ? ? "address": "mill road"

? ? }

? }

}

多字段匹配谊娇,類似于數(shù)據(jù)庫中or,多字段中也是進(jìn)行分詞的

GET /bank/_search

{

? "query": {

? ? "multi_match": {

? ? ? "query": "mill",

? ? ? "fields": ["address","city"]

? ? }

? }

}

聯(lián)合查詢罗晕,這里面的should之后影響搜索的得分济欢,并不會影響結(jié)果。而must_not不會影響得分小渊,這個相當(dāng)于一個過濾器法褥,只會對結(jié)果有影響

GET /bank/_search

{

? "query": {

? ? "bool": {

? ? ? "must": [

? ? ? ? {"match": {

? ? ? ? ? "gender": "M"

? ? ? ? }},

? ? ? ? {

? ? ? ? ? "match": {

? ? ? ? ? ? "address": "mill"

? ? ? ? ? }

? ? ? ? }

? ? ? ],

? ? ? "must_not": [

? ? ? ? {"match": {

? ? ? ? ? "lastname": "wa"

? ? ? ? }}

? ? ? ],

? ? ? "should": [

? ? ? ? {"match": {

? ? ? ? ? "address": "1"

? ? ? ? }}

? ? ? ]

? ? }

? }

}

找出某個字段在某個范圍內(nèi)的記錄,這個結(jié)果是有得分的酬屉,當(dāng)把must換成filter時是沒有得分的

GET bank/_search

{

? "query": {

? ? "bool": {

? ? ? "must": [

? ? ? ? {

? ? ? ? ? "range": {

? ? ? ? ? ? "age": {

? ? ? ? ? ? ? "gte": 10,

? ? ? ? ? ? ? "lte": 20

? ? ? ? ? ? }

? ? ? ? ? }

? ? ? ? }

? ? ? ]

? ? }

? }

}

如果是精準(zhǔn)的值的話半等,就用term(像年齡等)如果是文本的全文搜索的話用match揍愁,某個字段.keywords也是精確匹配的

聚合查詢,即對結(jié)果進(jìn)行一些分析比如求平均值杀饵,獲取數(shù)據(jù)分布等

格式:

? "aggs": {

? ? "agg_name": {

? ? ? "agg_類型(term:獲取數(shù)據(jù)的分布莽囤,avg平均值等)": {

? ? ? ? "field": "age",

? ? ? ? "size": 100

? ? ? }

}

可以agg可以多個同級,也可以作為下屬切距,將結(jié)果作為兩一個agg的入?yún)?/p>

例:獲取每個年齡的人數(shù)和工資的平均值

GET bank/_search

{

? "query": {

? ? "match_all": {}

? },

? "aggs": {

? ? "ageAgg": {

? ? ? "terms": {

? ? ? ? "field": "age",

? ? ? ? "size": 100

? ? ? },

? ? ? "aggs": {

? ? ? ? "ageAvg": {

? ? ? ? ? "avg": {

? ? ? ? ? ? "field": "balance"

? ? ? ? ? }

? ? ? ? }

? ? ? }

? ? }

? }

}

映射:指的是索引中的數(shù)據(jù)的類型

GET bank/_mapping

創(chuàng)建一個索引的映射(keyword只能精確匹配朽缎,text可以全局索引,integer只能用term查詢)

PUT /my_index

{

? "mappings": {

? ? "properties": {

? ? ? "age":{"type": "integer"},

? ? ? "email":{"type": "keyword"},

? ? ? "name":{"type": "text"}

? ? }

? }

}

給一個index添加一個映射谜悟,index如果為false則是不讓根據(jù)這個字段進(jìn)行檢索

PUT /my_index/_mapping

{

? "properties": {

? ? ? "employee_id":{

? ? ? ? "type": "integer",

? ? ? ? "index": false

? ? ? }

? ? }

}

想要修改映射话肖,只能進(jìn)行數(shù)據(jù)遷移,先創(chuàng)建一個新的索引赌躺,然后進(jìn)行數(shù)據(jù)遷移

數(shù)據(jù)遷移(type在his中有):

POST _reindex

{

? "source": {

? ? "index": "bank",

? ? "type": "account"

? },

? "dest": {

? ? "index": "newbank"

? }

}


springboot 整合 elasticsearch client

引入依賴

<dependency>

<groupId>org.elasticsearch.client</groupId>

<artifactId>elasticsearch-rest-high-level-client</artifactId>

<version>7.4.2</version>

</dependency>

這里要記得修改elasticsearch的依賴狼牺,因為這個依賴springboot本身就有這個依賴,必須要替換成和客戶端相同的才行

<parent>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-parent</artifactId>

<version>2.1.8.RELEASE</version>

<relativePath></relativePath>

</parent>

<properties>

<elasticsearch.version>7.4.2</elasticsearch.version>

</properties>

進(jìn)行相關(guān)的配置

package com.yuchen.mailsearch.config;

import org.apache.http.HttpHost;

import org.elasticsearch.client.RequestOptions;

import org.elasticsearch.client.RestClient;

import org.elasticsearch.client.RestHighLevelClient;

import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.Configuration;

@Configuration

public class MailElasticsearchConfig {

public static final RequestOptionsCOMMON_OPTIONS;

static {

RequestOptions.Builder builder = RequestOptions.DEFAULT.toBuilder();

//? ? ? ? builder.addHeader("Authorization", "Bearer " + TOKEN);

//? ? ? ? builder.setHttpAsyncResponseConsumerFactory(

//? ? ? ? ? ? ? ? new HttpAsyncResponseConsumerFactory

//? ? ? ? ? ? ? ? ? ? ? ? .HeapBufferedResponseConsumerFactory(30 * 1024 * 1024 * 1024));

? ? ? ? COMMON_OPTIONS = builder.build();

}

@Bean

? ? public RestHighLevelClient esRestClient(){

RestHighLevelClient restHighLevelClient =new RestHighLevelClient(

RestClient.builder(

new HttpHost("192.168.56.10",9200,"http")

)

);

return restHighLevelClient;

}

}

進(jìn)行操作

package com.yuchen.mailsearch;

import com.alibaba.fastjson.JSON;

import com.yuchen.mailsearch.config.MailElasticsearchConfig;

import org.elasticsearch.action.search.SearchRequest;

import org.elasticsearch.action.search.SearchResponse;

import org.elasticsearch.client.RestHighLevelClient;

import org.elasticsearch.index.query.QueryBuilder;

import org.elasticsearch.index.query.QueryBuilders;

import org.elasticsearch.search.SearchHit;

import org.elasticsearch.search.SearchHits;

import org.elasticsearch.search.aggregations.Aggregation;

import org.elasticsearch.search.aggregations.AggregationBuilders;

import org.elasticsearch.search.aggregations.Aggregations;

import org.elasticsearch.search.aggregations.bucket.terms.Terms;

import org.elasticsearch.search.aggregations.bucket.terms.TermsAggregationBuilder;

import org.elasticsearch.search.aggregations.metrics.Avg;

import org.elasticsearch.search.aggregations.metrics.AvgAggregationBuilder;

import org.elasticsearch.search.builder.SearchSourceBuilder;

import org.hibernate.validator.resourceloading.AggregateResourceBundleLocator;

import org.junit.Test;

import org.junit.runner.RunWith;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.boot.test.context.SpringBootTest;

import org.springframework.test.context.junit4.SpringRunner;

import java.io.IOException;

import java.util.Map;

@RunWith(SpringRunner.class)

@SpringBootTest

public class MailSearchApplicationTests {

@Autowired

? ? RestHighLevelClientrestHighLevelClient;

@Test

? ? public void searchData()throws IOException {

SearchRequest searchRequest =new SearchRequest();

searchRequest.indices("bank");

SearchSourceBuilder searchSourceBuilder =new SearchSourceBuilder();

searchSourceBuilder.query(QueryBuilders.matchQuery("address","mill"));

//求年齡的值分布

? ? ? ? TermsAggregationBuilder ageAgg = AggregationBuilders.terms("ageAgg").field("age").size(10);

searchSourceBuilder.aggregation(ageAgg);

//求平均工資

? ? ? ? AvgAggregationBuilder balanceAvg = AggregationBuilders.avg("balanceAvg").field("balance");

searchSourceBuilder.aggregation(balanceAvg);

System.out.println(searchSourceBuilder.toString());

searchRequest.source(searchSourceBuilder);

SearchResponse search =restHighLevelClient.search(searchRequest, MailElasticsearchConfig.COMMON_OPTIONS);

System.out.println(search.toString());

//分析結(jié)果

? ? ? ? SearchHits hits = search.getHits();

SearchHit[] searchHits = hits.getHits();

for (SearchHit searchHit : searchHits){

String index = searchHit.getIndex();

String id = searchHit.getId();

float score = searchHit.getScore();

String sourceAsString = searchHit.getSourceAsString();

System.out.println("index"+index+"id"+id+"score"+score+"sourceAsString"+sourceAsString);

}

Aggregations aggregations = search.getAggregations();

Terms aggregation = aggregations.get("ageAgg");

for (Terms.Bucket bucket : aggregation.getBuckets()){

String keyAsString = bucket.getKeyAsString();

System.out.println("年齡" + keyAsString);

}

Avg aggregation1 = aggregations.get("balanceAvg");

System.out.println("平均薪資" + aggregation1.getValueAsString());

}

}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末礼患,一起剝皮案震驚了整個濱河市是钥,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌缅叠,老刑警劉巖悄泥,帶你破解...
    沈念sama閱讀 217,657評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異肤粱,居然都是意外死亡弹囚,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評論 3 394
  • 文/潘曉璐 我一進(jìn)店門领曼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來鸥鹉,“玉大人,你說我怎么就攤上這事庶骄』偕” “怎么了?”我有些...
    開封第一講書人閱讀 164,057評論 0 354
  • 文/不壞的土叔 我叫張陵单刁,是天一觀的道長灸异。 經(jīng)常有香客問我,道長羔飞,這世上最難降的妖魔是什么肺樟? 我笑而不...
    開封第一講書人閱讀 58,509評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮逻淌,結(jié)果婚禮上么伯,老公的妹妹穿的比我還像新娘。我一直安慰自己卡儒,他們只是感情好蹦狂,可當(dāng)我...
    茶點故事閱讀 67,562評論 6 392
  • 文/花漫 我一把揭開白布誓篱。 她就那樣靜靜地躺著,像睡著了一般凯楔。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上锦募,一...
    開封第一講書人閱讀 51,443評論 1 302
  • 那天摆屯,我揣著相機與錄音,去河邊找鬼糠亩。 笑死虐骑,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的赎线。 我是一名探鬼主播廷没,決...
    沈念sama閱讀 40,251評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼垂寥!你這毒婦竟也來了颠黎?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,129評論 0 276
  • 序言:老撾萬榮一對情侶失蹤滞项,失蹤者是張志新(化名)和其女友劉穎狭归,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體文判,經(jīng)...
    沈念sama閱讀 45,561評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡过椎,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,779評論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了戏仓。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片疚宇。...
    茶點故事閱讀 39,902評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖赏殃,靈堂內(nèi)的尸體忽然破棺而出敷待,到底是詐尸還是另有隱情,我是刑警寧澤嗓奢,帶...
    沈念sama閱讀 35,621評論 5 345
  • 正文 年R本政府宣布讼撒,位于F島的核電站,受9級特大地震影響股耽,放射性物質(zhì)發(fā)生泄漏根盒。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,220評論 3 328
  • 文/蒙蒙 一物蝙、第九天 我趴在偏房一處隱蔽的房頂上張望炎滞。 院中可真熱鬧,春花似錦诬乞、人聲如沸册赛。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽森瘪。三九已至牡属,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間扼睬,已是汗流浹背逮栅。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留窗宇,地道東北人措伐。 一個月前我還...
    沈念sama閱讀 48,025評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像军俊,于是被迫代替她去往敵國和親侥加。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,843評論 2 354

推薦閱讀更多精彩內(nèi)容