ElasticSearch入门小姿势

Elasticsearch 入门

1 安装

老实说,在安装时候确实踩了不少的坑,但是可幸的是最终可以从坑里爬出来。

坑一 elasticsearch 8

这个版本的 es 有较大改动,安装后的首次启动需要记录 密码 和 CA证书,否则?就吓唬你一下,直接去 log 里面找就好,这都小问题。

另外,在浏览器访问的时候,需要通过 https 访问,否则会报错

ElasticSearch入门小姿势_第1张图片

坑二 ik 分词器版本必须和 es 完全一致

分词器的版本必须和 es 完全一致,否则,你这辈子都起不来,不要相信 github 上 ik 分词器作者所说到的 7.x。。。。。

也就这点吧 其他的证书问题 在springboot上随机应变就好。

2 ik 分词器

2.1 什么是 ik

分词:即把一段中文或者别的划分成一个个的关键字,我们在搜索时候会把自己的信息进行分词,会把数据库中或者索引库中的数据进行分词,然后进行一一个匹配操作,默认的中文分词是将每个字看成一个词不使用用IK分词器的情况下),比如“我爱狂神”会被分为”我”,”爱”,”狂”,”神” ,这显然是不符合要求的,所以我们需要安装中文分词器ik来解决这个问题。

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

2.2 测试基本语法

ElasticSearch入门小姿势_第2张图片

2.3 配置自定义词典

只需要在 ik 分词器下的 config 文件夹中寻找 xml 文件,进去之后你要啥都懂了。

ElasticSearch入门小姿势_第3张图片

之后在上一次目录新建 .dic 文件格式的字典就可以,切记吧文件名写入刚才的 xml 文件

3 RESTFul风格

一种软件架构风格,而不是标准,只是提供了一组设计原则和约束条件。它主要用于客户端和服务器交互类的软件。基于这个风格设计的软件可以更简洁更有层次更易于实现缓存等机制。

3.1 基本Rest命令说明

method url地址 描述
PUT(创建,修改) localhost:9200/索引名称/类型名称/文档id 创建文档(指定文档id)
POST(创建) localhost:9200/索引名称/类型名称 创建文档(随机文档id)
POST(修改) localhost:9200/索引名称/类型名称/文档id/_update 修改文档
DELETE(删除) localhost:9200/索引名称/类型名称/文档id 删除文档
GET(查询) localhost:9200/索引名称/类型名称/文档id 查询文档通过文档ID
POST(查询) localhost:9200/索引名称/类型名称/文档id/_search 查询所有数据

3.2 初尝禁果

ElasticSearch入门小姿势_第4张图片

字段数据类型

  • 字符串类型

    • text、

      keyword

      • text:支持分词,全文检索,支持模糊、精确查询,不支持聚合,排序操作;text类型的最大支持的字符长度无限制,适合大字段存储;
      • keyword:不进行分词,直接索引、支持模糊、支持精确匹配,支持聚合、排序操作。keyword类型的最大支持的长度为——32766个UTF-8类型的字符,可以通过设置ignore_above指定自持字符长度,超过给定长度后的数据将不被索引,无法通过term精确匹配检索返回结果。
  • 数值型

    • long、Integer、short、byte、double、float、half floatscaled float
  • 日期类型

    • date
  • te布尔类型

    • boolean
  • 二进制类型

    • binary
  • 等等…

3.3 几个较为基本的操作

指定字段的类型(也就是创建规则),需要留心的是:即使不添加规则,也会自动生成规则

ElasticSearch入门小姿势_第5张图片

使用基本工具集

通过以下命令可以获得巨多的信息

GET _cat/health

修改数据

方法有俩种,第一直接使用 PUT 命令覆盖,这样的缺点在于不灵活,如果修改的数据少写某一条则会造成数据丢失。

第二种是采用 POST 命令,这样就不会出现丢失情况。

POST /users/_doc/1/_update
{
  "doc":{
    "name":"世界上最帅的男人"
  }
}

结果:

ElasticSearch入门小姿势_第6张图片

删除 (指定到具体位置就好)

ElasticSearch入门小姿势_第7张图片

3.4 查询

3.4.1 简单的条件查询

ElasticSearch入门小姿势_第8张图片

3.4.2 复杂搜索

什么是 Hit??

ElasticSearch入门小姿势_第9张图片

结果过滤

采用 _source 字段,选取要展示的字段。

ElasticSearch入门小姿势_第10张图片

设置超时时间

 GET /shenzizai/user/_search
 {
   "timeout":"2s",
   "query":{
     "match": {
       "name": "沈自在"
     }
   }
}

排序

ElasticSearch入门小姿势_第11张图片

分页查询

ElasticSearch入门小姿势_第12张图片

布尔值查询(精确查询)

must 命令,所有的条件都需要符合

ElasticSearch入门小姿势_第13张图片

should 命令,表示或操作

not 命令,如 not must

过滤器

gt 大于、lt 小于, e的意思是equal

ElasticSearch入门小姿势_第14张图片

匹配多个条件

多个条件使用空格隔开

精确查询

term 查询是直接通过倒排索引指定的词条进程精确查找的

关于分词:

  • term 直接进行精确查询

  • match 会通过分词器分词

GET /shenzizai/user/_search
{
  "query": {
    "term": {
      "desc":"我"
    }
  }
}

高亮查询

切记:搜索的内容再搜索的结果中会高亮显示

可以通过 “pro_tags”:“<>”
“post_tags”:"<>"自定义高亮。

GET /shenzizai/user/_search
{
  "query": {
    "match": {
      "name":"沈自在"
    }
  },
  "highlight": {
  	"pro_tags":"<>"
  	"post_tags":"<>"
    "fields": {
      "name":{}
    }
  }
}

4 集成Springboot

4.1 初识

导入依赖并且统一版本

<properties>
   <java.version>1.8java.version>
   
   <elasticsearch.version>7.6.1elasticsearch.version>
properties>

<dependency>
   <groupId>org.springframework.bootgroupId>
   <artifactId>spring-boot-starter-data-elasticsearchartifactId>
dependency>
<dependency>
   <groupId>org.elasticsearch.clientgroupId>
   <artifactId>elasticsearch-rest-high-level-clientartifactId>
   <version>7.6.2version>
dependency>

创建并编写配置类

@Configuration
public class ElasticSearchClientConfig {

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

}

4.2 测试索引API

索引三连

    // 创建索引
    @Test
    void createIndex() throws IOException {
        CreateIndexRequest request = new CreateIndexRequest("test-shenzizai-01");
        CreateIndexResponse response = client.indices().create(request, RequestOptions.DEFAULT);
        boolean acknowledged = response.isAcknowledged();
        System.out.println(acknowledged);
    }
    // 判断索引是否存在
    @Test
    void isExistIndex() throws IOException {
        GetIndexRequest request = new GetIndexRequest("test-shenzizai-05");
        boolean exists = client.indices().exists(request, RequestOptions.DEFAULT);
        System.out.println(exists);
    }
    // 删除索引
    @Test
    void deleteIndex() throws IOException {
        DeleteIndexRequest request = new DeleteIndexRequest("test-shenzizai-01");
        AcknowledgedResponse delete = client.indices().delete(request,RequestOptions.DEFAULT);
        System.out.printf(String.valueOf(delete.isAcknowledged()));
    }

4.3 文档测试

添加文档

    //创建文档
    @Test
    void createDocument() throws IOException {
        CreateIndexRequest request = new CreateIndexRequest("haoran");
        CreateIndexResponse createIndexResponse = client.indices().create(request, RequestOptions.DEFAULT);
        if (createIndexResponse.isAcknowledged() == true){
            User user = new User("沈自在",21,"不要羡慕哥,哥只是一个传说");
            IndexRequest writeRequest = new IndexRequest("haoran");
            writeRequest.id("1");
            writeRequest.timeout(TimeValue.timeValueSeconds(1));
            writeRequest.source(JSON.toJSONString(user), XContentType.JSON);
            IndexResponse response = client.index(writeRequest, RequestOptions.DEFAULT);
            System.out.println(response.status());
            System.out.println(response);
        }
    }

获取文档 判断文档是否存在

    //获取文档
    @Test
    void getDocument() throws IOException {
        GetRequest request = new GetRequest("haoran","2");
        //此处设置不在返回 source
        request.fetchSourceContext(new FetchSourceContext(false));
        request.storedFields("_none_");
        //GetResponse response = client.get(request, RequestOptions.DEFAULT);
        //判断是否存在
        boolean exists = client.exists(request, RequestOptions.DEFAULT);
        System.out.println(exists);
    }

更新文档

    //文档更新
    @Test
    void updateDocument() throws IOException {
        UpdateRequest request = new UpdateRequest("haoran","1");
        User user = new User("沈自在大帅哥",21,"我二弟天下无敌");
        request.timeout(TimeValue.timeValueSeconds(3));
        request.doc(JSON.toJSONString(user),XContentType.JSON);
        UpdateResponse response = client.update(request, RequestOptions.DEFAULT);
        System.out.println(response.getVersion());
    }

文档删除

    //文档删除
    @Test
    void  deleteDocument() throws IOException {
        DeleteRequest request = new DeleteRequest("haoran","1");
        DeleteResponse response = client.delete(request, RequestOptions.DEFAULT);
        System.out.println(response.status());
    }

批量处理文档(添加文档)

    //批量添加文档
    @Test
    void bulkDocument() throws IOException {
        BulkRequest request = new BulkRequest();
        request.timeout(TimeValue.timeValueSeconds(3));
        List<User> list = new ArrayList<>();
        for (int i = 0; i < 10; i++) {
            User user = new User("沈自在 "+i,21,"不要迷恋哥,哥只是一个传说");
            list.add(user);
        }
        for (int i = 0; i < list.size(); i++) {
            request.add(
                    new IndexRequest("haoran")
                            .id((i+1)+"")
                            .source(JSON.toJSONString(list.get(i)),XContentType.JSON)
            );
        }
        BulkResponse bulk = client.bulk(request,RequestOptions.DEFAULT);
        System.out.println(bulk.status());
    }

搜索文档

    @Test
    void searchDocument() throws IOException {
        SearchRequest request = new SearchRequest();
        //构建搜索条件
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        //TermQueryBuilder termQuery = QueryBuilders.termQuery("name", "沈自在1");
        MatchQueryBuilder matchQueryBuilder = QueryBuilders.matchQuery("name", "沈自在");
        //条件投入
        searchSourceBuilder.query(matchQueryBuilder);
        //添加条件到请求
        request.source(searchSourceBuilder);
        //查看返回结果
        SearchResponse search = client.search(request, RequestOptions.DEFAULT);
        SearchHits hits = search.getHits();
        System.out.println(JSON.toJSONString(hits));
        for (SearchHit hit : hits.getHits()) {
            System.out.println(hit.getSourceAsMap());
        }
    }

你可能感兴趣的:(elasticsearch,jenkins,大数据)