ElasticSearch學(xué)習(xí)與使用(SpringBoot整合ElasticSearch)

Elasticsearch 和 Solr 比較

  • 當(dāng)單純的對已有數(shù)據(jù)進行搜索時郑趁,Solr更快齐饮。
  • 當(dāng)實時建立索引時,Solr會產(chǎn)生io阻塞福贞,查詢性能較差撩嚼,Elasticsearch具有明顯的優(yōu)勢。
  • 隨著數(shù)據(jù)量的增加挖帘,Solr的搜索效率會變得更低完丽,而Elasticsearch卻沒有明顯的變化。
    • 此時如果轉(zhuǎn)變我們的搜索基礎(chǔ)設(shè)施后拇舀,從Solr到Elasticsearch逻族,我們看見一個即時,50倍提高搜索性能骄崩。

ElasticSearch vs Solr 總結(jié)

  • es基本是開箱即用(解壓就可以用F噶邸)薄辅,非常簡單,Solr安裝略微復(fù)雜一丟丟抠璃!
  • Solr 利用 Zookeeper 進行分布式管理长搀,而Elasticsearch 自身帶有分布式協(xié)調(diào)管理功能。
    • Solr 支持更多格式的數(shù)據(jù)鸡典,比如JSON源请、XML、CSV彻况,而Elasticsearch 僅支持json文件格式谁尸。
  • Solr 官方提供的功能更多,而Elasticsearch本身更注重核心功能纽甘,高級功能多由第三方插件提供良蛮,例如圖形化界面需要kibana友好支撐
  • Solr 查詢快,但更新索引時慢(即插入刪除慢)悍赢,用于電商等查詢多的應(yīng)用决瞳;
    • ES 建立索引快(即查詢慢),==即實時性查詢快==左权,用于facebook新浪等搜索皮胡。
    • Solr 是傳統(tǒng)搜索應(yīng)用的有力解決方案,但 Elasticsearch 更適用于新興的實時搜索應(yīng)用赏迟。
  • Solr比較成熟屡贺,有一個更大,更成熟的用戶锌杀、開發(fā)和貢獻者社區(qū)甩栈,而 Elasticsearch 相對開發(fā)維護者較少,更新太快糕再,學(xué)習(xí)使用成本較高量没。(es 大趨勢!)

ElasticSearch 安裝

聲明:JDK1.8,最低要求突想!ElasticSearch 客戶端殴蹄,界面工具!

Java開發(fā)蒿柳,ElasticSearch 的版本和我們之后對應(yīng)的Java 的核心jar包饶套!版本對應(yīng)!JDK 環(huán)境是正常的垒探。

下載

官網(wǎng):https://www.elastic.co/

image-20201209213216467.png
image-20201209213910696.png

下載地址:https://www.elastic.co/cn/downloads/elasticsearch

官網(wǎng)下載巨慢妓蛮,翻墻,或從網(wǎng)上找已下載好的資源

==這里在Window下學(xué)習(xí)圾叼!==

ELK三劍客蛤克,解壓即用捺癞!

window 下安裝!

1.解壓就可以使用了

image-20201210202916024.png

2.熟悉目錄

bin 啟動文件
config 配置文件
    log4j2 日志配置文件
    jvm.options java虛擬機相關(guān)的配置
    elasticsearch.yml elasticsearch的配置文件构挤,默認 9200 端口髓介,跨域問題!
lib 相關(guān)jar包
logs 日志
modules 功能模塊
plugins 插件 ik分詞器

3.啟動筋现,訪問 9200(注意唐础,第一次在本機上嘗試啟動報錯,需要在yaml文件中加一行配置:xpack.ml.enabled: false)

image-20201210204317760.png

4.訪問測試矾飞!

image-20201210204527886.png

安裝可視化界面 es head的插件

此處必須要有 VUE 基礎(chǔ)一膨,并且需要有 node.js 的基本環(huán)境已安裝

1.下載地址:https://github.com/mobz/elasticsearch-head/

2.啟動

npm install
npm run start

3.連接測試發(fā)現(xiàn),存在跨域問題洒沦,配置es的yaml配置文件

# 解決跨域
http.cors.enabled: true
http.cors.allow-origin: "*" 

4.重啟es服務(wù)器豹绪,然后再次連接

image-20201215210742269.png

我們初學(xué)時,就把es當(dāng)做一個數(shù)據(jù)庫~(可以建立索引(庫)申眼,文檔(庫中的數(shù)據(jù)B鹘颉))

這個head我們就把它當(dāng)做數(shù)據(jù)展示工具,我們后面所有的查詢括尸,Kibana

了解ELK

ELK是Elasticsearch巷蚪、Logstash、Kibana三大開源框架首字母大寫簡稱姻氨。市面上也被稱為Elastic Stack钓辆。其中Elasticsearch 是一個基于Luncene、分布式肴焊、通過Restful方式進行交互的近實時搜索平臺框架。像類似百度功戚,谷歌這種大數(shù)據(jù)全文搜索引擎的場景都可以使用Elasticsearch作為底層支持框架娶眷,可見Elasticsearch提供的搜索能力確實強大,市面上很多時候我們簡稱Elasticsearch為es啸臀。Logstash是ELK的中央數(shù)據(jù)流引擎届宠,用于從不同目標(biāo)(文件/數(shù)據(jù)存儲/MQ)收集不同格式數(shù)據(jù),經(jīng)過過濾后支持輸出到不同目的地(文件/MQ/redis/elasticsearch/kafka等)乘粒。Kibana可以將elasticsearch的數(shù)據(jù)通過友好的頁面展示出來豌注,提供實時分析功能。

收集清洗數(shù)據(jù) -- 》 搜索灯萍,存儲 --》 展示Kibana

市面上很多開發(fā)只要提到ELK能夠一致說出他是一個日志分析架構(gòu)技術(shù)總稱轧铁,但實際上ELK不僅僅適用于日志分析,它還可以支持其它任何數(shù)據(jù)分析和收集的場景旦棉,日志分析和收集只是更具有代表性齿风。并非唯一性药薯。

image-20201215212613105.png

安裝 Kibana

Kibana 是一個針對Elasticsearch的開源分析及可視化平臺,用來搜索救斑、查看交互存儲在Elasticsearch索引中的數(shù)據(jù)童本。使用Kibana,可以通過各種圖表進行高級數(shù)據(jù)分析及展示脸候。Kibana讓海量數(shù)據(jù)更容易理解穷娱。它操作簡單,基于瀏覽器的用戶界面可以快速創(chuàng)建儀表板(dashboard)實時顯示Elasticsearch查詢動態(tài)运沦。設(shè)置Kibana非常簡單鄙煤。無需編碼或者額外的基礎(chǔ)架構(gòu),幾分鐘內(nèi)就可以完成Kibana安裝并啟動Elasticsearch索引監(jiān)測茶袒。

官網(wǎng):https://www.elastic.co/cn/kibana

Kibana版本要和es版本一致梯刚!

下載完畢后,解壓需要一些時間薪寓。

好處:ELK基本上都是拆箱即用亡资!

啟動測試

1.解壓后的目錄

image-20201215213625726.png

2.啟動

image-20201215213842202.png

3.訪問測試

image-20201215214028735.png

4.開發(fā)工具(Post,curl向叉,head锥腻,谷歌瀏覽器插件測試)

image-20201215214323111.png

我們之后的所有操作都在這里進行編寫

5.漢化,修改Kibana的配置文件yaml即可母谎,修改完成后重啟項目

image-20201215214850564.png

ES 核心概念

1.索引

2.字段類型(mapping)

3.文檔(documents)

概述

在前面的學(xué)習(xí)中瘦黑,我們已經(jīng)掌握了es是什么,同時也把es的服務(wù)已經(jīng)安裝啟動了奇唤,那么es是如何去存儲數(shù)據(jù)幸斥,數(shù)據(jù)結(jié)構(gòu)是什么,又是如何實現(xiàn)搜索的呢咬扇?我們先來聊聊Elasticsearch的相關(guān)概念吧甲葬!

==集群,節(jié)點懈贺,索引经窖,類型,文檔梭灿,分片画侣,映射是什么?==

elasticsearch 是面向文檔堡妒,關(guān)系型數(shù)據(jù)庫 和 elasticsearch 客觀的對比配乱!

Relational DB Elasticsearch
數(shù)據(jù)庫(database) 索引(indices)
表(tables) types
行(rows) documents
字段(columns) fields

elasticsearch(集群)中可以包含多個索引(數(shù)據(jù)庫),每個索引中可以包含多個類型(表),每個類型下又包含多個文檔(行)宪卿,每個文檔中又包含多個字段(列)的诵。

物理設(shè)計:

elasticsearch 在后臺把每個索引劃分成多個分片,每分分片可以在集群中的不同服務(wù)器間遷移

一個人就是一個集群佑钾!默認的集群名字就是 elasticsearch

IK分詞器插件

什么是IK分詞器西疤?

分詞:即把一段中文或別的劃分成一個個的關(guān)鍵字,我們在搜索時候會把自己的信息進行分詞休溶,會把數(shù)據(jù)庫中或者索引庫中的數(shù)據(jù)進行分詞代赁,然后進行一個匹配操作,默認的中文分詞是將每個字看成一個詞兽掰,比如“大程子”會被分為“大”芭碍,“程”,“子”孽尽,這顯然是不符合要求的窖壕,所以我們需要安裝中文分詞器ik來解決這個問題。

如果要使用中文杉女,建議選擇使用ik分詞器瞻讽!

IK提供了兩個分詞算法:ik_smart 和 ik_max_word , 其中 ik_smart 為最少切分,ik_max_word 為最細粒度劃分熏挎,后面進行測試速勇。

安裝

1.https://github.com/medcl/elasticsearch-analysis-ik

2.下載完畢之后,放入到我們的elasticsearch插件中即可

image-20201219115615988.png

3.重啟觀察ES,可以看到ik分詞器被加載了坎拐!

image-20201219115758398.png

4.elasticsearch-plugin 可以通過這個命令來查看加載進來的插件

image-20201219115952052.png

5.使用kibana測試烦磁!

查看不同的分詞器效果

ik_smart 為最少切分

image-20201219120729001.png

ik_max_word 為最細粒度劃分,窮盡詞庫的可能哼勇,字典

image-20201219120917616.png

我們輸入“超級喜歡大程子學(xué)Java”

image-20201219121225719.png

發(fā)現(xiàn)問題:大程子被拆開了都伪!

這種自己需要的詞,需要自己加到我們的分詞器的字典中!

ik 分詞器增加自己的配置

image-20201219121802928.png

重啟es猴蹂,看細節(jié)

image-20201219121956666.png

再次測試以下大程子院溺,看下效果

image-20201219122120800.png

以后的話,我們需要自己配置分詞就在自已定義的dic文件中進行配置即可磅轻!

Rest風(fēng)格說明

一種軟件架構(gòu)風(fēng)格,而不是標(biāo)準(zhǔn)逐虚,只是提供了一組設(shè)計原則和約束條件聋溜。它主要用于客戶端和服務(wù)器交互類的軟件“劝基于這個風(fēng)格設(shè)計的軟件可以更簡潔撮躁,更有層次,更易于實現(xiàn)緩存等機制买雾。

基于Rest命令說明:

method url地址 描述
PUT localhost:9200/索引名稱/類型名稱/文檔id 創(chuàng)建文檔(指定文檔id)
POST localhost:9200/索引名稱/類型名稱 創(chuàng)建文檔(隨機文檔id)
POST localhost:9200/索引名稱/類型名稱/文檔id/_update 修改文檔
DELETE localhost:9200/索引名稱/類型名稱/文檔id 刪除文檔
GET localhost:9200/索引名稱/類型名稱/文檔id 查詢文檔通過文檔id
POST localhost:9200/索引名稱/類型名稱/_search 查詢所有數(shù)據(jù)

關(guān)于索引的基本操作

1.創(chuàng)建一個索引

put /索引名/~類型名~/文檔id
{請求體}
image-20201219130054445.png

完成了自動增加索引把曼!數(shù)據(jù)也成功的添加了杨帽,這就是為什么在初期可以把它當(dāng)做數(shù)據(jù)庫學(xué)習(xí)的原因!

image-20201219130505146.png

3.那么name這個字段用不用指定類型呢嗤军。畢竟我們關(guān)系型數(shù)據(jù)庫 是需要指定類型的

  • 字符串類型

    text注盈、keyword

  • 數(shù)值類型

    long、integer叙赚、short老客、byte、double震叮、float胧砰、half_float、scaled_float

  • 日期類型

    date

  • 布爾值類型

    boolean

  • 二進制類型

    binary

  • 等等……

4.指定字段的類型

image-20201219131359794.png

獲得這個規(guī)則苇瓣,可以通過GET請求獲取具體的信息尉间!

image-20201219131508825.png

5.查看默認的信息

image-20201219131853418.png
image-20201219132010336.png

如果自己的文檔字段沒有指定,那么es就會給我們默認配置字段類型击罪!

擴展:通過命令 elasticsearch 索引情況哲嘲!通過 get _cat/ 可以獲得es的當(dāng)前的很多信息!

image-20201219132904082.png

修改 提交還是使用PUT 即可外邓! 然后覆蓋撤蚊! 最新辦法

曾經(jīng)

image-20201219133232534.png

現(xiàn)在的方法

image-20201219133542459.png

刪除索引

通過 DELETE 命令實現(xiàn)刪除、根據(jù)你的請求來判斷是刪除索引還是刪除文檔記錄损话!

使用 RESTFULL 風(fēng)格是我們ES推薦大家使用的侦啸!

關(guān)于文檔的基本操作(es的重點)

基本操作

1.添加數(shù)據(jù)

PUT /wangcp/user/3
{
  "name":"李四",
  "age":30,
  "desc":"emm,不知道如何形容",
  "tags":["靚女","旅游","唱歌"]
}
image-20201219140150147.png

2.查詢獲取數(shù)據(jù) GET

image-20201219140841850.png

3.更新數(shù)據(jù) PUT

image-20201219141046399.png
  1. Post _update,推薦使用這種更新方式!
image-20201219141510378.png

簡單的搜索

GET wangcp/user/1

簡單的條件查詢丧枪,可以根據(jù)默認的映射規(guī)則光涂,產(chǎn)生基本的查詢!

image-20201219142152908.png
image-20201219152938535.png

復(fù)雜操作搜索 select(排序拧烦,分頁忘闻,高亮,模糊查詢恋博,精準(zhǔn)查詢齐佳!)

image-20201219153320470.png
image-20201219154445137.png

輸出結(jié)果過濾,不想要那么多债沮,select name,desc

image-20201219154806222.png

我們之后使用Java操作es炼吴,所有的方法和對象就是這里面的key!

排序

image-20201219155219339.png

分頁查詢

image-20201219155446713.png

數(shù)據(jù)索引下標(biāo)還是從0開始的疫衩,和學(xué)的所有數(shù)據(jù)結(jié)構(gòu)還是一樣的硅蹦。

/search/{current}/{pagesize}

布爾值查詢

must(and),所有的條件都要符合 where id=1 and name=xxx

image-20201219160832737.png

should(or),所有的條件都要符合 where id=1 or name=xxx

image-20201219170009162.png

must_not( not )

image-20201219170140743.png

過濾器 filter

image-20201219170525438.png
  • gt 大于
  • gte 大于等于
  • lt 小于
  • lte 小于等于
image-20201219170813765.png

匹配多個條件

image-20201219171230616.png

精確查詢

term 查詢時直接通過倒排索引指定的詞條進行精確查找的童芹!

關(guān)于分詞:

  • term:直接查詢精確的

  • match:會使用分詞器解析d陶啊(先分析文檔,然后在通過分析的文檔進行查詢<偻省)

兩個類型 text keyword

image-20201219172328426.png
image-20201219172422088.png
image-20201219172950308.png

多個值匹配的精確查詢

image-20201219173729773.png

高亮查詢

image-20201219174218055.png
image-20201219180346109.png

這些其實 MySQL 也可以做署咽,只是 MySQL 效率較低

  • 匹配
  • 按照條件匹配
  • 精確匹配
  • 區(qū)間范圍匹配
  • 匹配字段過濾
  • 多條件查詢
  • 高亮查詢
  • 倒排索引

集成SpringBoot

找官方文檔

image-20201220130215774.png
image-20201220130410095.png
image-20201220130619521.png

1.找到原生的依賴

<dependency>
    <groupId>org.elasticsearch.client</groupId>
    <artifactId>elasticsearch-rest-high-level-client</artifactId>
    <version>7.10.1</version>
</dependency>

2.找對象

image-20201220131856940.png

3.分析這個類中的方法

配置基本的項目

==問題:一定保證 我們導(dǎo)入導(dǎo)入的依賴和我們的es版本一致==

image-20201220133733729.png
image-20201220134326749.png

源碼中提供的對象

image-20201221133723591.png

雖然這里導(dǎo)入3個類,靜態(tài)內(nèi)部類嗜价,核心類就一個艇抠。

/*
 * Copyright 2012-2019 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package org.springframework.boot.autoconfigure.elasticsearch.rest;

import java.time.Duration;

import org.apache.http.HttpHost;
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.Credentials;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.client.CredentialsProvider;
import org.apache.http.impl.client.BasicCredentialsProvider;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestClientBuilder;
import org.elasticsearch.client.RestHighLevelClient;

import org.springframework.beans.factory.ObjectProvider;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.context.properties.PropertyMapper;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * Elasticsearch rest client infrastructure configurations.
 *
 * @author Brian Clozel
 * @author Stephane Nicoll
 */
class RestClientConfigurations {

    @Configuration(proxyBeanMethods = false)
    static class RestClientBuilderConfiguration {

        // RestClientBuilder
        @Bean
        @ConditionalOnMissingBean
        RestClientBuilder elasticsearchRestClientBuilder(RestClientProperties properties,
                ObjectProvider<RestClientBuilderCustomizer> builderCustomizers) {
            HttpHost[] hosts = properties.getUris().stream().map(HttpHost::create).toArray(HttpHost[]::new);
            RestClientBuilder builder = RestClient.builder(hosts);
            PropertyMapper map = PropertyMapper.get();
            map.from(properties::getUsername).whenHasText().to((username) -> {
                CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
                Credentials credentials = new UsernamePasswordCredentials(properties.getUsername(),
                        properties.getPassword());
                credentialsProvider.setCredentials(AuthScope.ANY, credentials);
                builder.setHttpClientConfigCallback(
                        (httpClientBuilder) -> httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider));
            });
            builder.setRequestConfigCallback((requestConfigBuilder) -> {
                map.from(properties::getConnectionTimeout).whenNonNull().asInt(Duration::toMillis)
                        .to(requestConfigBuilder::setConnectTimeout);
                map.from(properties::getReadTimeout).whenNonNull().asInt(Duration::toMillis)
                        .to(requestConfigBuilder::setSocketTimeout);
                return requestConfigBuilder;
            });
            builderCustomizers.orderedStream().forEach((customizer) -> customizer.customize(builder));
            return builder;
        }

    }

    @Configuration(proxyBeanMethods = false)
    @ConditionalOnClass(RestHighLevelClient.class)
    static class RestHighLevelClientConfiguration {

        // RestHighLevelClient 高級客戶端,也是我們這里要講的久锥,后面項目要用到的客戶端
        @Bean
        @ConditionalOnMissingBean
        RestHighLevelClient elasticsearchRestHighLevelClient(RestClientBuilder restClientBuilder) {
            return new RestHighLevelClient(restClientBuilder);
        }

        // RestClient 普通的客戶端
        @Bean
        @ConditionalOnMissingBean
        RestClient elasticsearchRestClient(RestClientBuilder builder,
                ObjectProvider<RestHighLevelClient> restHighLevelClient) {
            RestHighLevelClient client = restHighLevelClient.getIfUnique();
            if (client != null) {
                return client.getLowLevelClient();
            }
            return builder.build();
        }

    }

    @Configuration(proxyBeanMethods = false)
    static class RestClientFallbackConfiguration {

        @Bean
        @ConditionalOnMissingBean
        RestClient elasticsearchRestClient(RestClientBuilder builder) {
            return builder.build();
        }

    }

}

具體的API測試!

1.創(chuàng)建索引

 @Test
void testCreateIndex() throws IOException {
    // 1.創(chuàng)建索引請求 相當(dāng)于 PUT wang_index
    CreateIndexRequest request = new CreateIndexRequest("wang_index");
    // 2.客戶端執(zhí)行請求
    CreateIndexResponse createIndexResponse =
        client.indices().create(request, RequestOptions.DEFAULT);
    System.out.println(createIndexResponse);

}

2.判斷索引是否存在

  @Test
void textExistIndex() throws IOException {
    GetIndexRequest request = new GetIndexRequest("wang_index");
    boolean exists = client.indices().exists(request, RequestOptions.DEFAULT);
    System.out.println(exists);
}

3.刪除索引

 @Test
void textDeleteIndex() throws IOException {
    DeleteIndexRequest request = new DeleteIndexRequest("wang_index");
    AcknowledgedResponse delete = client.indices().delete(request, RequestOptions.DEFAULT);
    System.out.println(delete.isAcknowledged());
}

4.創(chuàng)建文檔

 // 測試添加文檔
@Test
void testAddDocument() throws IOException {
    //創(chuàng)建對象
    User user = new User("大程子", 3);
    //創(chuàng)建請求
    IndexRequest request = new IndexRequest("wang_index");
    // 規(guī)則 put /wang_index/_doc/1
    request.id("1");
    request.timeout(TimeValue.timeValueSeconds(1));

    // 將我們的數(shù)據(jù)放入請求
    IndexRequest source = request.source(JSON.toJSONString(user), XContentType.JSON);

    // 客戶端發(fā)送請求家淤,獲取響應(yīng)的結(jié)果
    IndexResponse indexResponse = client.index(source, RequestOptions.DEFAULT);

    System.out.println(indexResponse);
    System.out.println(indexResponse.status()); //對應(yīng)我們命令返回的狀態(tài) CREATED
}

5.添加文檔

@Test
void testAddDocument() throws IOException {
    //創(chuàng)建對象
    User user = new User("大程子", 3);
    //創(chuàng)建請求
    IndexRequest request = new IndexRequest("wang_index");
    // 規(guī)則 put /wang_index/_doc/1
    request.id("1");
    request.timeout(TimeValue.timeValueSeconds(1));

    // 將我們的數(shù)據(jù)放入請求
    IndexRequest source = request.source(JSON.toJSONString(user), XContentType.JSON);

    // 客戶端發(fā)送請求,獲取響應(yīng)的結(jié)果
    IndexResponse indexResponse = client.index(source, RequestOptions.DEFAULT);

    System.out.println(indexResponse);
    System.out.println(indexResponse.status()); //對應(yīng)我們命令返回的狀態(tài) CREATED
}

6.獲取文檔判斷是否存在

// 獲取文檔判斷是否存在
@Test
void testIsExists() throws IOException {
    GetRequest getRequest = new GetRequest("wang_index", "1");
    // 不獲取返回的 _source 的上下文了
    getRequest.fetchSourceContext(new FetchSourceContext(false));
    getRequest.storedFields("_none_");

    boolean exists = client.exists(getRequest, RequestOptions.DEFAULT);
    System.out.println(exists);
}

7.獲得文檔信息

// 獲得文檔的信息
@Test
void testGetDocument() throws IOException {
    GetRequest getRequest = new GetRequest("wang_index", "1");
    GetResponse getResponse = client.get(getRequest, RequestOptions.DEFAULT);
    System.out.println(getResponse.getSourceAsString()); // 打印文檔內(nèi)容
    System.out.println(getResponse);//獲得的全部內(nèi)容和使用命令是一致的
}

8.更新文檔信息

// 更新文檔的信息
@Test
void testUpdateDocument() throws IOException {
    UpdateRequest updateRequest = new UpdateRequest("wang_index", "1");
    updateRequest.timeout("1s");

    User user = new User("大程子的技術(shù)成長路", 18);
    updateRequest.doc(JSON.toJSONString(user),XContentType.JSON);

    UpdateResponse updateResponse = client.update(updateRequest, RequestOptions.DEFAULT);
    System.out.println(updateResponse.status());
}

9.刪除文檔信息

// 刪除文檔信息
@Test
void testDeleteDocument() throws IOException {
    DeleteRequest request = new DeleteRequest("wang_index", "1");
    request.timeout("1s");

    DeleteResponse delete = client.delete(request, RequestOptions.DEFAULT);
    System.out.println(delete.status());
}

10.批量插入數(shù)據(jù)

// 特殊的瑟由,真實項目一般都會批量插入數(shù)據(jù)
@Test
void testBulkRequest() throws IOException {
    BulkRequest bulkRequest = new BulkRequest();
    bulkRequest.timeout("10s");

    ArrayList<User> userList = new ArrayList<>();
    userList.add(new User("wangcp1",3));
    userList.add(new User("wangcp3",6));
    userList.add(new User("wangcp2",9));
    userList.add(new User("wangcp4",12));
    userList.add(new User("wangcp5",15));
    userList.add(new User("wangcp6",18));
    userList.add(new User("dachengzi1",3));
    userList.add(new User("dachengzi2",6));
    userList.add(new User("dachengzi3",9));

    for (int i = 0; i < userList.size(); i++) {
        bulkRequest.add(
            //批量更新和批量刪除絮重,就在這里修改對應(yīng)的請求就可以了
            new IndexRequest("wang_index")
            .id("" + (i+1))
            .source(JSON.toJSONString(userList.get(i)),XContentType.JSON));
    }

    BulkResponse bulkResponse = client.bulk(bulkRequest, RequestOptions.DEFAULT);
    System.out.println(bulkResponse.hasFailures());// 是否失敗,返回 false 代表成功歹苦!
}

11.搜索查詢

// 查詢
// SearchRequest 搜索請求
// SearchSourceBuilder 條件構(gòu)造
// HighlightBuilder 高亮構(gòu)建
// TermQueryBuilder 構(gòu)建精確查詢
@Test
void testSearch() throws IOException {
    SearchRequest searchRequest = new SearchRequest("wang_index");
    //構(gòu)建搜索條件
    SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
    sourceBuilder.highlighter();

    // 查詢條件青伤,我們可以使用 QueryBuilders 工具來實現(xiàn)
    // QueryBuilders.termQuery 精確查找
    // QueryBuilders.matchAllQuery() 匹配所有
    TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("name","wangcp1");
    //        MatchAllQueryBuilder matchAllQueryBuilder = QueryBuilders.matchAllQuery();
    sourceBuilder.query(termQueryBuilder);
    // 設(shè)置查詢最大時間
    sourceBuilder.timeout(new TimeValue(60, TimeUnit.SECONDS));

    searchRequest.source(sourceBuilder);
    SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
    System.out.println(JSON.toJSONString(searchResponse.getHits()));
    System.out.println("=======================================");
    for (SearchHit documentFields : searchResponse.getHits().getHits()) {
        System.out.println(documentFields.getSourceAsMap());
    }
}

以上為日常學(xué)習(xí)ElasticSearch對應(yīng)的記錄,存在的不足或問題希望大家留言指出殴瘦!共學(xué)共勉狠角。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市蚪腋,隨后出現(xiàn)的幾起案子丰歌,更是在濱河造成了極大的恐慌,老刑警劉巖屉凯,帶你破解...
    沈念sama閱讀 211,290評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件立帖,死亡現(xiàn)場離奇詭異,居然都是意外死亡悠砚,警方通過查閱死者的電腦和手機晓勇,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評論 2 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來灌旧,“玉大人绑咱,你說我怎么就攤上這事∈嗵” “怎么了羡玛?”我有些...
    開封第一講書人閱讀 156,872評論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長宗苍。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么讳窟? 我笑而不...
    開封第一講書人閱讀 56,415評論 1 283
  • 正文 為了忘掉前任让歼,我火速辦了婚禮,結(jié)果婚禮上丽啡,老公的妹妹穿的比我還像新娘谋右。我一直安慰自己,他們只是感情好补箍,可當(dāng)我...
    茶點故事閱讀 65,453評論 6 385
  • 文/花漫 我一把揭開白布改执。 她就那樣靜靜地躺著,像睡著了一般坑雅。 火紅的嫁衣襯著肌膚如雪辈挂。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,784評論 1 290
  • 那天裹粤,我揣著相機與錄音终蒂,去河邊找鬼。 笑死遥诉,一個胖子當(dāng)著我的面吹牛拇泣,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播矮锈,決...
    沈念sama閱讀 38,927評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼霉翔,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了苞笨?” 一聲冷哼從身側(cè)響起债朵,我...
    開封第一講書人閱讀 37,691評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎猫缭,沒想到半個月后葱弟,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,137評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡猜丹,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,472評論 2 326
  • 正文 我和宋清朗相戀三年芝加,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片射窒。...
    茶點故事閱讀 38,622評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡藏杖,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出脉顿,到底是詐尸還是另有隱情蝌麸,我是刑警寧澤,帶...
    沈念sama閱讀 34,289評論 4 329
  • 正文 年R本政府宣布艾疟,位于F島的核電站来吩,受9級特大地震影響敢辩,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜弟疆,卻給世界環(huán)境...
    茶點故事閱讀 39,887評論 3 312
  • 文/蒙蒙 一戚长、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧怠苔,春花似錦同廉、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至攒驰,卻和暖如春蟆湖,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背讼育。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工帐姻, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人奶段。 一個月前我還...
    沈念sama閱讀 46,316評論 2 360
  • 正文 我出身青樓饥瓷,卻偏偏與公主長得像,于是被迫代替她去往敵國和親痹籍。 傳聞我的和親對象是個殘疾皇子呢铆,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,490評論 2 348

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