码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • Elasticsearch 保姆级入门篇


    Elasticsearch 是一个分布式的、面向生产规模工作负载优化的搜索引擎。

    Kibana 可以将 Elasticsearch 中的数据转化为直观的图表、图形和仪表盘。

    这篇文章,您将学习本地安装 Elasticsearch 和 Kibana,以及使用开发工具/ Java SDK 创建索引和搜索数据。

    1 本地安装

    1.1 创建网络

    我们需要创建一个供 Elasticsearch 和 Kibana 使用的 network。这个 network 将被用于 Elasticsearch 和 Kibana 之间的通信。

    docker network create elastic
    

    1.2 安装 ES

    拉取 Elasticsearch 镜像

    docker pull docker.elastic.co/elasticsearch/elasticsearch:{version}
    

    这里的版本 version ,我们选取:8.9.0 。

    docker pull docker.elastic.co/elasticsearch/elasticsearch:8.9.0
    

    启动 docker elasticsearch 镜像

    docker run --name elasticsearch --net elastic -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -t docker.elastic.co/elasticsearch/elasticsearch:8.9.0
    

    修改 elasticsearch 用户密码

    bin/elasticsearch-reset-password --username elastic -i
    

    1.3 安装 Kibana

    拉取 Kibana 镜像

    docker pull docker.elastic.co/kibana/kibana:8.9.0
    

    启动 Kibana 镜像

    docker run --name kibana --net elastic -p 5601:5601 docker.elastic.co/kibana/kibana:8.9.0
    

    因为启动安装 Kibana ,需要 token , 所以进入 elasticsearch 容器 ,执行:

    bin/elasticsearch-create-enrollment-token -s kibana
    

    输入 token 之后,刷新页面,进入登录页面:

    2 接口测试

    我们可以使用 Kibana Dev tools 来进行接口测试。

    2.1 添加

    向索引添加单个文档,提交一个 HTTP POST 请求,目标是该索引。

    POST /customer/_doc/1
    {
      "firstname": "Jennifer",
      "lastname": "Walters"
    }
    

    该请求会自动创建名为customer的索引(如果不存在),然后添加一个 ID 为 1的新文档,同时存储并建立firstname和lastname字段的索引。

    新文档可以立即从集群中的任何节点获取。您可以使用 GET 请求来检索它,请求中需指定其文档 ID :

    GET /customer/_doc/1
    

    要一次性添加多个文档,请使用 _bulk API。批量数据必须是以换行分隔的 JSON(NDJSON)格式。每一行必须以换行字符(\n)结尾,包括最后一行。

    PUT customer/_bulk
    { "create": { } }
    { "firstname": "Monica","lastname":"Rambeau"}
    { "create": { } }
    { "firstname": "Carol","lastname":"Danvers"}
    { "create": { } }
    { "firstname": "Wanda","lastname":"Maximoff"}
    { "create": { } }
    { "firstname": "Jennifer","lastname":"Takeda"}
    

    2.2 搜索

    已索引的文档可以在准实时的情况下进行搜索。下面的搜索将在customer索引中匹配所有名为 Jennifer 的顾客。

    GET customer/_search
    {
      "query" : {
        "match" : { "firstname": "Jennifer" }
      }
    }
    

    2.3 视图

    进入 Kibana Data Views :

    然后创建数据视图 :

    创建数据视图之后,可以在 Analytics > Discover 查看索引数据。

    3 Java SDK 实战

    3.1 依赖

    <dependency>
        <groupId>co.elastic.clientsgroupId>
        <artifactId>elasticsearch-javaartifactId>
        <version>8.9.0version>
    dependency>
    
    <dependency>
        <groupId>io.github.hakky54groupId>
        <artifactId>sslcontext-kickstartartifactId>
        <version>7.1.0version>
    dependency>
    
    <dependency>
        <groupId>com.fasterxml.jackson.coregroupId>
        <artifactId>jackson-databindartifactId>
        <version>2.12.3version>
    dependency>
    
    <dependency>
        <groupId>com.fasterxml.jackson.coregroupId>
        <artifactId>jackson-coreartifactId>
        <version>2.12.3version>
    dependency>
    
    <dependency>
        <groupId>com.fasterxml.jackson.coregroupId>
        <artifactId>jackson-annotationsartifactId>
        <version>2.12.3version>
    dependency>
    
    <dependency>
        <groupId>jakarta.jsongroupId>
        <artifactId>jakarta.json-apiartifactId>
        <version>2.0.1version>
    dependency>
    
    
    <dependency>
        <groupId>org.elasticsearch.clientgroupId>
        <artifactId>elasticsearch-rest-clientartifactId>
        <version>8.9.0version>
    dependency>
    

    3.2 创建客户端

    RestClientBuilder builder = RestClient.builder(new HttpHost("localhost", 9200, "https"));
    
    final CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
    credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials("elastic", "ilxw@19841201"));
    
    // Elasticsearch 提供了 Https 服务,创建 client 建立 SSL 链接时没有做证书验证 ;
    SSLFactory sslFactory = SSLFactory.builder().withUnsafeTrustMaterial().withUnsafeHostnameVerifier().build();
    builder = builder.setHttpClientConfigCallback(
                       httpClientBuilder -> httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider)
                                     setSSLContext(sslFactory.getSslContext())
                                    .setSSLHostnameVerifier(sslFactory.getHostnameVerifier())
            );
    
    RestClient restClient = builder.build();
    
    // Create the transport with a Jackson mapper
    ElasticsearchTransport transport = new RestClientTransport(restClient, new JacksonJsonpMapper());
    
    // And create the API client
    ElasticsearchClient esClient = new ElasticsearchClient(transport);
    

    3.3 创建文档

    创建索引名为 products ,新建一个文档 id 为 1 。

    ProductPo product = new ProductPo(1, "Bag", 42);
    
    IndexRequest indexRequest = new IndexRequest.Builder<>().index("products").id(String.valueOf(product.getId())).document(product).build();
    
    IndexResponse response = esClient.index(indexRequest);
    
    System.out.println("Indexed with version " + response.version());
    
    

    3.4 查询文档

    GetResponse response = esClient.get(g -> g
                    .index("products")
                    .id(String.valueOf(1)),
            ProductPo.class
    );
    
    if (response.found()) {
        ProductPo product = response.source();
        System.out.println("Product name " + product.getName());
    } else {
        System.out.println("Product not found");
    }
    

    3.5 修改文档

     Map doc = new HashMap();
     //文档产品名称调整为 my bike
     doc.put("name", "my bike");
     doc.put("price", 100);
    
     BulkOperation op = new BulkOperation.Builder().update(
            						 i -> i.action(new UpdateAction.Builder<>().doc(doc).docAsUpsert(true).build()).id("1"))
             						 .build();
    
       List list = Collections.singletonList(op);
       BulkResponse response = esClient.bulk(bulkBuilder -> bulkBuilder.index("products").operations(list));
    

    参考文档:

    1、Elasticsearch 官方文档:

    https://www.elastic.co/guide/en/elasticsearch/client/java-api-client/current/getting-started-java.html

    2、Github文档

    https://github.com/elastic/elasticsearch

  • 相关阅读:
    到点了开始网抑云(悲)但是用python(整活)
    【经典文献】水下光学和声学成像:融合的时代?最新技术概述
    强化学习领域有哪些最热门和最有前途的研究课题
    随手记录第三话 --你见过哪些神乎其乎的存储方式?
    【leetcode面试经典150题】71. 对称二叉树(C++)
    8、Feign远程调用
    一点一点学习C++之笔记004
    linux操作Rpm
    如何开发npm依赖包,并发布到npm
    6-1 pytorch中构建模型的3种方法
  • 原文地址:https://www.cnblogs.com/makemylife/p/17632780.html
    • 最新文章
    • 沪漂五周年了:我越来越迷茫了
      Agentic Skill Routing 实战:别再把所有 Skill 塞进 AI Agent 上下文
      MySQL-Seconds_behind_master的精度误差
      [MAF预定义ChatClient中间件-03]CachingChatClient——利用缓存省钱省时间
      AI的至暗历史:从万众期待到被政府撤资,AI的两次死亡徘徊
      Agent OS :五种驯服不确定性的范式
      PortSwigger SQL注入LAB11
      数据库即时编译JIT
      [Begin]AI Learn Data Day 0
      深度学习进阶(二十七)现代 LLM 的核心架构设计其二:SwiGLU
    • 热门文章
    • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
      奉劝各位学弟学妹们,该打造你的技术影响力了!
      五年了,我在 CSDN 的两个一百万。
      Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
      面试官都震惊,你这网络基础可以啊!
      你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
      心情不好的时候,用 Python 画棵樱花树送给自己吧
      通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
      13 万字 C 语言从入门到精通保姆级教程2021 年版
      10行代码集2000张美女图,Python爬虫120例,再上征途
    小工具 小游戏
    Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

    京公网安备 11010502049817号