elasticSearch学习笔记

1.基本概念

Index(索引)

动词相当于mysql的insert,名词相当于databases

tyep(类型)

在Index(索引)中,可以定义一个或者多个类型,类似于Mysql中的Table,每一种类型的数据放在一起。

在ElasticSearch6.X中,一个index中只能存在一个type,而在ElasticSearch7.X中,type的概念已经被废除了。

Document(文档)

保存在某个索引下,某个类型的一个数据,文档是JSON格式,Document就像是Mysql中的某个Table里面的内容

模型

正向索引和倒排索引的概念

正排索引

正向索引 (forward index) 以文档的ID为关键字,表中记录文档中每个字的位置信息,查找时扫描表中每个文档中字的信息直到找出所有包含查询关键字的文档
在这里插入图片描述

倒排索引

倒排索引以字或词为关键字进行索引,表中关键字所对应的记录表项记录了出现这个字或词的所有文档
在这里插入图片描述

2.初步检索

_cat

GET /_cat/nodes; ## 查看所有节点
GET /_cat/health;## 查看es的健康状况
GET /_cat/master; ##查看主节点
GET /_cat/indices; ## 查看所有索引

索引一个文档

PUT /索引名/类型名/主键id ## 使用put方式,必须传入主键id,如果存在当前id,为更新操作,否则为新增操作
POST /索引名/类型名/主键id ##使用post方式,传入主键id可选择,如果当前没有传入id,为新增操作,否则传入id,如果存在当前id,为更新操作,否则为新增操作

在这里插入图片描述

查询文档操作

## 查询指定id的索引
GET /索引名/_doc/主键id ##例如:GET /shopping/_doc/1
## 查询当前索引下的所有数据
GET /索引名/_search/ ## 例如:GET /shopping/_search

在这里插入图片描述

乐观锁修改:
更新携带?if_seq_no=0&if_primary_term=1(PUT请求)

更新文档操作

POST /索引名/_update/主键名 
## 例如:
POST /shopping/_update/1
{
  "doc": {
    "更新字段名":"更新数据",
    .....
  }
}

删除文档操作

DELETE /索引名/_doc/主键id ## 删除一个文档

批量操作

在这里插入图片描述

3.高级检索

两种检索方式:

  • 一个是通过使用REST request URI 发送搜索参数(uri+检索参数)(不推荐)
GET /shopping/_search/?q=*
  • 一个是通过REST request body来发送他们(uri+请求体)(推荐)
GET /shopping/_search
{
  "query": {
    "match": {
      "username": "admin"
    }
  }
}

DSL操作

语法格式

{
	"操作类型“: "操作规则"
}

按照字段值关键字查询(match操作)

GET /索引名/_search
{
	"query":{
		"match":{
			"字段名":"字段值"
		}
	}
}

查询所有文档(match_all操作)

GET /shopping/_search 
{
  "query": {
    "match_all": {
      
    }
  }
}

完全查询和高亮显示(match_phrase)

GET /shopping/_search
{
  "query": {
    "match_phrase": {
      "字段名": "字段显示"
    }
  },
  "highlight": {
    "fields": {
      "字段名": {
        
      }
    }
  }
}

分页查询(操作等级与query相等)

GET /shopping/_search 
{
  "query": {
    "match_all": {
      
    }
  },
  "from":"1", ##代表offset,从第一个数据开始
  "size":"2" ## 代表limit,查询多少数据
}

只显示部分字段

GET /shopping/_search 
{
  "query": {
    "match_all": {
      
    }
  },
  "_source": ["字段名1", "字段名2"...]
}

排序

不能对文本类型进行排序

GET /shopping/_search
{
  "query": {
    "match_all": {
      
    }
  },
  "sort": [
    {
      "字段名": {
        "order": "升序或者降序(ASC或者DESC)"
      }
    }
  ]
}

多添加查询

GET /shopping/_search
{
  "query": {
    "bool": {
      "must": [  ## must中的条件必须同时符合,类似于and
        {
          "match": {
            "price": "3"
          }
        }
      ],
      "should": [ ## should中的条件符合其一集合,类似于or
        {
          "match": {
            "username.keyword": "admin"
          }
        }
      ],
      "filter": { ##过滤以上结果
        "range": { ## 范围过滤
          "price": {
            "gte": 1,
            "lte": 5
          }
        }
      }
    }
  }
}

聚合操作(aggs)

GET /bank/_search
{
  "query": {
    "match_all": {}
  },
  "aggs": {
    "age_group": { ##聚合操作名
      "terms": { ## 聚合操作类型
        "field": "age"
        "size": 10
      }
    }
  },
  "size": 0
}

映射(mapping)

表示字段的类型,一般在创建索引的时候指定,但是在ElasticSearch8中,将移除,因此,此处降只记录一个概念。
创建一个映射

PUT /testIndex
{
  "mappings": {
    "properties": {
      "age": {
        "type":"integer", ## 字段类型
        "index": false, ## 是否能够被索引到
        "doc_values": true ##是否存储到磁盘中
      },
      "email": {
        "type":"keyword" ## 字段类型
      }
    }
  }
}

在已创建的映射中添加一个字段映射

PUT /testIndex/_mapping
{
  "properties": {
    "email": {
        "type":"keyword" ## 字段类型
      }
  }
}

修改已存在字段的类型

elasticsearch中不能修改已存在字段的类型,因为这样会使历史数据丢失,因此在elasticsearch中如果要修改现有字段的类型,只能创建一个新的索引,规定mapping后,进行数据迁移、

数据迁移
elasticsearch6.0之后的写法
在这里插入图片描述
elasticsearch6.0以前的写法
在这里插入图片描述
在这里插入图片描述

分词

一个tokenizer(分词器)接受一个字符流,将之分隔为独立的tokens(词元,通常是独立的单词),然后输出tokens流。
ElasticSearch提供了很多内置的分词器,可以用来构建custom analyzers(自定义分词器)

安装ik分词器

下载地址:https://hub.fastgit.xyz/medcl/elasticsearch-analysis-ik/releases?page=7
安装步骤
将插件安装包传入elasticsearch的plugin目录下,即可。

自定义分词器

配置文件地址:elasticsearch/plugins/ik/config/IKAnalyzer.cfg.xml,由于配置的分词器是对应的网络地址,因此,我们需要搭一个Nginx。
在这里插入图片描述

搭建nginx

docker-compose内容:

 nginx:
    image: nginx
    container_name: nginx
    ports:
      - "8000:80"
    volumes:
      - './nginx/html:/usr/share/nginx/html'
      - './nginx/logs/:/var/log/nginx/'
      - './nginx/conf/:/etc/nginx/'
    restart: always
    privileged: true
    networks:
      - rmq1

将nginx的容器复制到外面

docker container cp nginx:/etc/nginx ./nginx_1

在nginx/html/目录下创建一个txt文件,添加你的词组
将对应的访问路径放入elasticsearch文件即可。

4.SpringBoot集成ElasticSearch

单体架构

使用步骤:

1.加入jar包

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>

2.application.yaml中加入配置

spring:
  elasticsearch:
    rest:
      uris:
        - IP地址:端口

3.工具类:ElasticsearchRestTemplate(是使用 High Level REST Client 的 ElasticsearchOperations 接口的实现)
4.创建实体类

package com.tom.gulimall.search.es;

import com.tom.common.es.AttrsEsModelDto;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.FieldType;
import org.springframework.data.elasticsearch.annotations.IndexPrefixes;

import java.util.List;

/**
 * @author: wys
 * @date: 2022/9/8 17:42
 * @description: 首页索引
 */

@Document(indexName = "product") //设置索引名,如果不存在,默认创建
@Data
public class HomeIndexEntity {

    @Id
    @Field(type = FieldType.Long)
    private Long skuId;

    @Field(type = FieldType.Keyword)
    private Long spuId;

    @Field(type = FieldType.Text, analyzer = "ik_smart")
    private String skuTitle;

    @Field(type = FieldType.Keyword)
    private String skuPrice;

    @Field(type = FieldType.Keyword, index = false, docValues = false)//index代表不作为索引对象,docValue表示不序列化
    private String skuImg;

    @Field(type = FieldType.Long)
    private Long saleCount;

    @Field(type = FieldType.Boolean)
    private Boolean hasStock;

    @Field(type = FieldType.Long)
    private Long hotScore;

    @Field(type = FieldType.Long)
    private Long brandId;

    @Field(type = FieldType.Long)
    private Long catelogId;

    @Field(type = FieldType.Keyword, index = false, docValues = false)
    private Long brandName;

    @Field(type = FieldType.Keyword, index = false, docValues = false)
    private String brandImg;

    @Field(type = FieldType.Keyword, index = false, docValues = false)
    private String catelogName;

    @Field(type = FieldType.Object)
    private List<AttrsEsModelDto> attr;
}

5.创建持久层对象,继承ElasticsearchRepository接口

//第一个泛型代表操作对象,第二个泛型代表主键id类型
@Component
public interface UpProductDao extends ElasticsearchRepository<HomeIndexEntity, Long> {


}

6.可以根据语法定义常用方法,也可以用@Query自定义方法

GET /product/_search
{
  "query": {
    "match_all": {}
  }
}

上述查询方法,可以简述为(@Query中的内容为【“query”:】后的内容):

@Query("{\n" +
            "    \"match_all\": {}\n" +
            "  }")
List<HomeIndexEntity> findAllProduct();

5.常见的问题:

ES存储数组数据的时候会对数据执行扁平化操作,而扁平化操作会导致数据操作错误,如何解决这种影响?

设置属性为nested类型
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
elasticsearch 学习笔记包括以下内容: 一、Elasticsearch概述: - Elasticsearch是一种开源的分布式搜索和分析引擎,可以用于快速搜索、分析和储大量的结构化和非结构化数据。 - Elasticsearch与Solr相比有一些区别,包括用户、开发和贡献者社区的规模和成熟度等方面。 二、Elasticsearch安装: 1. 下载Elasticsearch,可以从官方网站或华为云镜像下载。 2. 安装Elasticsearch。 三、安装head插件: - head插件是一个可视化的管理界面,可以方便地管理和监控Elasticsearch集群。 四、安装Kibana: 1. Kibana是一个开源的数据可视化工具,用于展示和分析Elasticsearch中的数据。 2. 下载Kibana并安装。 3. 启动Kibana并进行访问测试。 4. 可选的汉化操作。 五、ES核心概念理解: - 学习ES的核心概念,包括索引、文档、映射、查询等。 以上是elasticsearch学习笔记的主要内容,希望对你有帮助。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [Elasticsearch 学习笔记(上)](https://blog.csdn.net/m0_52691962/article/details/127064350)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值