Elasticsearch入门

2023-11-17

下载地址:Download Elasticsearch | Elastic

 浏览器查看启动情况,出现一下内容说明服务已启动

如果启动成功无法访问

  • 打开如图文件

  • 将xpack.security.enabled: 和xpack.security.http.ssl:enabled: 设置为false即可。设置完了之后重启elasticsearch,然后在进行访问。

elasticsearch-head

ealsticsearch只是后端提供各种api,那么怎么直观的使用它呢?elasticsearch-head将是一款专门针对于elasticsearch的客户端工具, elasticsearch-head配置包

1.下载地址:GitHub - mobz/elasticsearch-head: A web front end for an elastic search cluster

2.启动:

npm install
npm run start

3.连接测试发现,存在跨域问题:配置es

http.cors.enabled: true
http.cors.allow-origin: "*"

4.重启es

Kibana

什么是Kibana?

       Kibana是一个针对Elasticsearch的开源分析及可视化平台,用来搜索、查看交互存储在Elasticsearch索引中的数据,使用Kibana,可以通过各种图表进行高级数据分析及展示。Kibana让海量数据更容易理解,它操作简单,基于浏览器的用户界面可以快速创建仪表盘,实时显示Elasticsearch查询动态。设置Kibana非常简单,无需编码或者额外的基础架构,几分钟就可以完成

下载对应ElasticSearch版本的Kibana

1.下载地址:Kibana:数据的探索、可视化和分析 | Elastic

2.解压下载的文件(解压需要一定时间)

3.启动Kibana

ik分词器

什么是IK分词器?

       即把一段中文或者英文划分成一个个的关键字,我们在搜索的时候会把搜索的内容进行分词,会把数据库中或者索引库中的数据进行分词,然后进行一个匹配操作,默认的中文分词是将每个字看成一个词,这显然是不符合要求的,所以我们安装中文分词器ik来解决这个问题

下载对应ElasticSearch版本的分词器

1.下载地址:Releases · medcl/elasticsearch-analysis-ik · GitHub

2. 在elasticsearch/plugins/新建一个ik目录,解压下载的文件

 

3. 重启elasticsearch,安装了插件,重启比较慢。

4. 测试分词器是否成功

ik提供了两个分词算法:ik_smart和ik_max_word,其中ik_smart为最少切分,ik_max_word为最细粒度划分

  • ik_smart

  • ik_max_word

自定义分词器字典

发现问题:"华数云"被拆开了!

这种自己需要的词,需要配置分词器字典:

如何配置?

1.打开刚刚新建的ik文件夹,找到config文件夹

2.在该目录下新建一个xxx.dic字典文件

3.并把自己定义的字典配置到IKAnalyzer.cfg.xml中

4.重启测试

Restful风格操作

1.创建一个索引

PUT /索引名/类型名/文档id

{请求体}

2.获得规则

GET /索引名

3.查询一个索引

  • GET /索引名/_search

  • 根据id搜索
    GET /索引名/类型名/文档id

根据条件搜索
 

GET /索引名/类型名/_search?q=属性名:属性值

 

4.修改一个索引

  • 还是使用PUT即可,然后覆盖
    • 使用POST
      POST /索引名/类型名/文档id/_update
      {
          "doc":{请求体}
      }

5.删除索引

DELETE /索引名

复杂查询

单条件查询

多个以空格隔开

多条件查询

must(and),所有的条件都要符合

should(or),只需要符合一个

must_not(not/!=)

filter 过滤

查询年龄大于25的

指定字段

排序

分页查询

精确查询 term

注意使用term精确查询时数据类型必须是keyword的

name为text类型,默认会进行分词处理,无法精确查询

desc为keyword类型,不会被分词器处理,看成一个整体,实现精确查询

高亮查询

默认是<em>标签

自定义标签,这样前端就能实现高亮显示

集成springboot

依赖

<dependency>
    <groupId>org.elasticsearch</groupId>
    <artifactId>elasticsearch</artifactId>
    <version>7.6.1</version>
</dependency>
<dependency>
    <groupId>org.elasticsearch.client</groupId>
    <artifactId>elasticsearch-rest-client</artifactId>
    <version>7.6.1</version>
</dependency>

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

配置bean

package com.es.config;

import org.apache.http.HttpHost;
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 ElasticSearchClientConfig {

    @Bean
    public RestHighLevelClient restHighLevelClient(){
        RestHighLevelClient client = new RestHighLevelClient(RestClient
                .builder(new HttpHost("127.0.0.1", 9200, "http")));
        return client;
    }
}

注意,version需要和Elasticsearch版本一致

 

编写测试类

package com.es;

import com.alibaba.fastjson.JSON;
import com.es.pojo.User;
import org.elasticsearch.action.admin.indices.delete.DeleteIndexRequest;
import org.elasticsearch.action.bulk.BulkRequest;
import org.elasticsearch.action.bulk.BulkResponse;
import org.elasticsearch.action.delete.DeleteRequest;
import org.elasticsearch.action.delete.DeleteResponse;
import org.elasticsearch.action.get.GetRequest;
import org.elasticsearch.action.get.GetResponse;
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.action.index.IndexResponse;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.action.support.master.AcknowledgedResponse;
import org.elasticsearch.action.update.UpdateRequest;
import org.elasticsearch.action.update.UpdateResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.client.indices.CreateIndexRequest;
import org.elasticsearch.client.indices.CreateIndexResponse;
import org.elasticsearch.client.indices.GetIndexRequest;
import org.elasticsearch.common.unit.TimeValue;
import org.elasticsearch.common.xcontent.XContentType;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.index.query.TermQueryBuilder;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.elasticsearch.search.fetch.subphase.FetchSourceContext;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder;
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.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;

@SpringBootTest
@RunWith(SpringRunner.class)
public class EsTest {
    @Autowired
    private RestHighLevelClient restHighLevelClient;

    //索引的创建
    @Test
    public void testCreateIndex() throws IOException {
        //1.创建索引请求
        CreateIndexRequest request = new CreateIndexRequest("java_test");
        //2.执行创建请求,请求后获得响应
        CreateIndexResponse createIndexResponse = restHighLevelClient.indices().create(request, RequestOptions.DEFAULT);
        System.out.println(createIndexResponse.isAcknowledged());
    }

    //获取索引,只能判断存不存在
    @Test
    public void testExistIndex() throws IOException {
        GetIndexRequest request = new GetIndexRequest("java_test");
        boolean exists = restHighLevelClient.indices().exists(request, RequestOptions.DEFAULT);
        System.out.println(exists);
    }

    //删除索引
    @Test
    public void testDeleteIndex() throws IOException {
        DeleteIndexRequest request = new DeleteIndexRequest("java_test");
        AcknowledgedResponse response = restHighLevelClient.indices().delete(request, RequestOptions.DEFAULT);
        System.out.println(response.isAcknowledged());
    }

    //添加文档
    @Test
    public void testAddDocument() throws IOException {
        //创建对象
        User user = new User("张三", 18);
        //创建请求
        IndexRequest request = new IndexRequest("java_test");
        //规则 put /java_test/_doc/1
        request.id("1");
        request.timeout(TimeValue.timeValueSeconds(1));
        //将数据放入请求 json
        request.source(JSON.toJSONString(user), XContentType.JSON);
        //客户端发送请求,获取响应结果
        IndexResponse indexResponse = restHighLevelClient.index(request, RequestOptions.DEFAULT);

        System.out.println(indexResponse.toString());
        System.out.println(indexResponse.status());
    }

    //获取文档,判断是否存在
    @Test
    public void testExistDocument() throws IOException {
        GetRequest request = new GetRequest("java_test","1");
        //不获取返回的_source的上下文
        request.fetchSourceContext(new FetchSourceContext(false));
        request.storedFields("_none_");

        boolean exists = restHighLevelClient.exists(request, RequestOptions.DEFAULT);
        System.out.println(exists);
    }

    //获取文档的信息
    @Test
    public void testGetDocument() throws IOException {
        GetRequest request = new GetRequest("java_test","1");
        GetResponse response = restHighLevelClient.get(request, RequestOptions.DEFAULT);
        String sourceAsString = response.getSourceAsString();
        System.out.println(response);//返回全部内容和命令是一样的
        System.out.println(sourceAsString);//打印文档内容
    }

    //更新文档的信息
    @Test
    public void testUpdateDocument() throws IOException {
        UpdateRequest request = new UpdateRequest("java_test","1");
        User user = new User("李四", 22);
        request.doc(JSON.toJSONString(user),XContentType.JSON);
        UpdateResponse response = restHighLevelClient.update(request, RequestOptions.DEFAULT);
        System.out.println(response.status());
    }

    //删除文档记录
    @Test
    public void testDeleteDocument() throws IOException {
        DeleteRequest request = new DeleteRequest("java_test", "1");
        DeleteResponse deleteResponse = restHighLevelClient.delete(request, RequestOptions.DEFAULT);
        System.out.println(deleteResponse.status());
    }

    //真实项目一般都会批量插入数据
    @Test
    public void testBulkRequest() throws IOException {
        BulkRequest bulkRequest = new BulkRequest();
        bulkRequest.timeout("10s");

        List<User> userList = new ArrayList<>();
        userList.add(new User("zhangan1", 18));
        userList.add(new User("zhangan2", 18));
        userList.add(new User("zhangan3", 18));
        userList.add(new User("lisi1", 18));
        userList.add(new User("lisi2", 18));
        userList.add(new User("lisi3", 18));

        //批处理请求
        for (int i = 0; i < userList.size(); i++) {
            //批量更新和批量删除,就在这里修改对应的请求就可以了
            bulkRequest.add(
                    new IndexRequest("java_test")
                            .id("" + (i+1))
                            .source(JSON.toJSONString(userList.get(i)), XContentType.JSON)
            );
        }
        BulkResponse bulkResponse = restHighLevelClient.bulk(bulkRequest, RequestOptions.DEFAULT);
        System.out.println(bulkResponse.hasFailures());//是否失败,返回false 代表成功
    }

    //查询
    @Test
    public void testSearch() throws IOException {
        SearchRequest searchRequest = new SearchRequest("java_test");
        //构建搜索条件
        SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
        //查询条件,我们可以使用QueryBuilds工具类来实现
        //QueryBuilders.termQuery() 精确
        //QueryBuilders.matchAllQuery() 匹配所有
        TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("name", "lisi1");

        sourceBuilder.query(termQueryBuilder);
        sourceBuilder.timeout(new TimeValue(60, TimeUnit.SECONDS));

        searchRequest.source(sourceBuilder);

        SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
        System.out.println(JSON.toJSONString(searchResponse.getHits()));
        System.out.println("===============================================");
        for (SearchHit searchHit:searchResponse.getHits().getHits()) {
            System.out.println(searchHit.getSourceAsString());
        }

    }
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Elasticsearch入门 的相关文章

随机推荐

  • [免签约]微信+支付宝个人收款解决方案

    方案原理 使用一台闲置的安卓手机专门用来做收款 收到付款时手机会有通知提示 对该通知进行监控 监控到后发送数据到服务器 服务器根据订单情况支付情况判断是否成功完成一轮下单支付操作 如果成功则自动发货 具体实现流程 网页前端展示商品 用户浏览
  • 华容道html源码,华容道(项目源代码)

    实例简介 Java华容道游戏完整代码 添加了图片与音效 设置了三个关卡 有注释 实例截图 核心代码 华容道 项目源代码 华容道 bin HuaRong About class BackgroundPanel class HuaRong 1
  • 学习PySOT避坑指南

    PySOT是商汤 SenseTime视频智能研究团队 开源的目标跟踪库 实现了最新的单目标跟踪算法 主要包含 SiamRPN SiamMask 使用Python编写的 基于Pytorch深度学习框架 该软件系统还包含了评估跟踪算法的Pyth
  • Java生成6位随机码(大小写+数字)

    char sources new char a b c d e f g h i j k l m n
  • 【Taro】微信小程序隐私协议改造

    微信要求小程序开发者在2023 9 15日前将小程序中调用获取用户隐私api的接口时 都必须要先让用户授权 如果用户拒绝授权 那么小程序的对应接口或组件将直接禁用 那么首先 请将微信小程序开发者工具 详情 本地设置 基础调试库 切换至2 3
  • QT实现用户登录功能

    功能 1 提供登录界面 客户端 2 服务器端用数据库来存储用户名和密码 3 注册时客户端将注册信息发送给服务器端 并进行验证 如果注册名可用 添加进数据库并返回客户端添加成功信息 4 登录时客户端将登录信息发送给服务器端进行验证 服务端返回
  • Ubuntu14.04下配置CGAL+boost+QT+Suitesparse

    这两天突然间想把以前在linux在没有调通的程序给调通 这个程序需要用到CGAL和Suitesparse 稀疏矩阵计算 大家上网查哈 而CGAL又依赖于boost 和QT 所以总共需要安装boost QT suitesparse和CGAL
  • java二维数组的创建,java二维数组创建方法

    java动态创建二维数组 从零学java笔录 第31篇 图解二位数组在内存中存储 java二维数组动态赋值 java二维数组创建方法 二维数组的定义 type arrayName type arrayName Java 二维数组的声明 初始
  • 数据可视化入门学习——Jupyter Notebook 和绘图有关的几个魔术指令

    数据可视化 Jupyter Notebook 和绘图有关的几个魔术指令 matplotlib inline 这是默认的模式 输出的图片是静态的 matplotlib auto 在这个模式下会弹出一个单独 的绘图窗口 和在pycharm中一样
  • MyBatis枚举映射类讨论

    前言 本篇需要对于MyBatis有一定的认识 而且只是针对于TypeHandler接口来讨论 暂不讨论其他方面的问题 TypeHandler概叙 TypeHandler是MyBatis设计的一个用于参数的接口 你们会不会很好奇MyBatis
  • 【error】 java.net.MalformedURLException: no protocol,未指定通信协议

    目录 1 报错信息 2 报错原因 3 处理方法 1 报错信息 在通过 IP 地址及端口号调用远程方法时 报错信息如下 java net MalformedURLException no protocol 由 no protocol 可知 系
  • 海凌科7621开发板适配新版openwrt

    最近在海凌科买了一块7621的开发板 flash是32M的 ddram是256M的 性价比感觉不错 海凌科提供的openwrt是比较旧的版本 在openwrt最新的19 07版本里已有的硬件都有一定的差距 因此修改一下相关配置 可以用ope
  • PHP如何使用循环语句?用法详细指南

    像任何其他语言一样 PHP中的循环用于多次执行一条语句或一段语句 直到满足特定条件为止 这有助于用户节省多次编写同一代码的时间和精力 PHP支持四种类型的循环技术 for循环 while循环 循环执行 foreach循环 现在让我们详细了解
  • 包装类自动装箱和拆箱原理

    包装类的自动装箱和自动拆箱 包装类的自动装箱和拆箱是JDK1 5的新特性 一 首先 了解自动装箱的过程 有两种自动装箱过程 第一种 128 127 之内 调用相应包装类的valueOf 例如 Integer i 12 Integer a 2
  • L2-016 愿天下有情人都是失散多年的兄妹 (25 分)

    题目 题目链接 题解 DFS 孩子向父母方向连边 将孩子视为根节点 首先判断输入两个人的性别 如果不同再分别以二者为起点进行dfs 前者五服之内的亲属都标记一下 以后者为起点dfs 如果遇到了标记的人 那么说明五服之内存在公共祖先 不可以结
  • extern C 在c/c++中的使用

    http blog csdn net jscese article details 37821961 1 问题定义 在研究操作系统源代码或者在嵌入式系统中编写程序时 经常会发现下面这种用法 cpp view plain copy print
  • 引入UnityEngine.dll中的巨坑

    正确路径 C Program Files Unity Editor Data Managed 此目录下只需引用UnityEngine dll就可以访问MonoBehaviour 其他路径 C Program Files Unity Edit
  • compose配置文件参数详解

    本文介绍compose配置文件参数的使用 熟练编写compose文件 root docker lnmp cat lnmp yaml version 3 services nginx build root docker demo nginx
  • js之forEach怎么跳出循环

    第一种 跳出此次循环 1 2 3 4 5 6 forEach e gt if e 2 return false console log e 第二种 中断循环 1 2 3 4 5 6 forEach e gt if e 2 throw 抛出异
  • Elasticsearch入门

    下载地址 Download Elasticsearch Elastic 浏览器查看启动情况 出现一下内容说明服务已启动 如果启动成功无法访问 打开如图文件 将xpack security enabled 和xpack security ht