Elasticsearch学习笔记(1)

这篇具有很好参考价值的文章主要介绍了Elasticsearch学习笔记(1)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


前言

Elasticsearch是一个开源的搜索引擎,主要应用于文章解锁中,如在购物网站搜索物品时快速查找到目标,Elasticsearch的建立是基于一个一个的索引库,与mysql的数据库有些许类似的地方


一、Elasticsearch的安装(以docker为例)

docker run -d \
	--name es \
    -e "ES_JAVA_OPTS=-Xms512m -Xmx512m" \
    -e "discovery.type=single-node" \
    -v es-data:/usr/share/elasticsearch/data \
    -v es-plugins:/usr/share/elasticsearch/plugins \
    --privileged \
    --network es-net \
    -p 9200:9200 \
    -p 9300:9300 \
elasticsearch:7.12.1
  • –name设置容器名称
  • -e设置环境变量,这里设置的内存大小和是否为集群模式
  • -v设置数据卷挂载,前面的目录为自己的目录地址
  • -network设置网络名称
  • -p设置端口号映射

二、Elasticsearch相关属性

1.分词器

分词器是Elasticsearch内用于定义分割语句标准的工具,在创建倒排索引是对文档进行分词,在搜素是对关键词进行分词,自带的分词器有

  • english
  • chinese

chinese分词效果:
Elasticsearch学习笔记(1),elasticsearch,学习,笔记
Elasticsearch学习笔记(1),elasticsearch,学习,笔记
english分词效果:
Elasticsearch学习笔记(1),elasticsearch,学习,笔记
Elasticsearch学习笔记(1),elasticsearch,学习,笔记

但是对于中文语句我们往往使用ik分词器,ik分词器的有2种模式:

  • ik_smart:智能切分,粗粒度
  • ik_max_word:最细切分,细粒度

ik_smart分词效果:
Elasticsearch学习笔记(1),elasticsearch,学习,笔记
Elasticsearch学习笔记(1),elasticsearch,学习,笔记

ik_max_word分词效果:
Elasticsearch学习笔记(1),elasticsearch,学习,笔记
Elasticsearch学习笔记(1),elasticsearch,学习,笔记

2.倒排索引

倒排索引中有两个非常重要的概念:

  • 文档(Document):用来搜索的数据,其中的每一条数据就是一个文档。例如一个网页、一个商品信息
  • 词条(Term):对文档数据或用户搜索数据,利用某种算法分词,得到的具备含义的词语就是词条。例如:我是中国人,就可以分为:我、是、中国人、中国、国人这样的几个词条

创建倒排索引是对正向索引的一种特殊处理,流程如下:

  • 将每一个文档的数据利用算法分词,得到一个个词条
  • 创建表,每行数据包括词条、词条所在文档id、位置等信息
  • 因为词条唯一性,可以给词条创建索引,例如hash表结构索引

如图:

Elasticsearch学习笔记(1),elasticsearch,学习,笔记

3.文档,字段,映射

文档:将索引库类似为Mysql中的表的话,文档就是其中的一条数据,但是他是以json格式存储的
字段:类似与表中的一个属性,如user表中的name属性
映射:定义字段的类型如keyword等

4. mapping映射属性

mapping是对索引库中文档的约束,常见的mapping属性包括:

  • type:字段数据类型,常见的简单类型有:
    • 字符串:text(可分词的文本)、keyword(精确值,例如:品牌、国家、ip地址)
    • 数值:long、integer、short、byte、double、float、
    • 布尔:boolean
    • 日期:date
    • 对象:object
    • 地理坐标:geo_point
  • index:是否创建索引,默认为true
  • analyzer:使用哪种分词器
  • properties:该字段的子字段

三、索引库相关操作和java api

1.增加索引库

DSL语句

#创建索引库
PUT /Indexname
{
  "mappings": {
    "properties": {
      "info":{
        "type": "text",
        "analyzer": "ik_smart"
      },
      "email":{
        "type": "keyword",
        "index": false
      },
      "name":{
        "type": "object",
        "properties": {
          "firstname":{
            "type": "keyword"
          },
          "lastname":{
             "type": "keyword"
          }
        }
      }
    }
  }
}

java api

		//1.创建请求
        CreateIndexRequest request = new CreateIndexRequest("hotel");//指定索引库名称
        //2.封装数据
        request.source(hotelConstants.HOTEL_MAPPING, XContentType.JSON);//为Json风格的DSL语句
        //3.发送请求
        clinet.indices().create(request, RequestOptions.DEFAULT);

2.删除索引库

DSL语句

#删除索引库
DELETE /Indexname

java api

 		//1.创建请求
        DeleteIndexRequest request = new DeleteIndexRequest("hotel");
        //3.发送请求
        clinet.indices().delete(request, RequestOptions.DEFAULT);

3.修改索引库

倒排索引结构虽然不复杂,但是一旦数据结构改变(比如改变了分词器),就需要重新创建倒排索引,这简直是灾难。因此索引库一旦创建,无法修改mapping

虽然无法修改mapping中已有的字段,但是却允许添加新的字段到mapping中,因为不会对倒排索引产生影响。

语法说明

PUT /索引库名/_mapping
{
  "properties": {
    "新字段名":{
      "type": "integer"
    }
  }
}

4.判断索引库是否存在

java api

		 //1.创建请求
        GetIndexRequest request = new GetIndexRequest("hotel");
        //2.发送请求
        boolean exists = clinet.indices().exists(request, RequestOptions.DEFAULT);
        System.out.println(exists ? "索引库存在" : "索引库不存在");

四、文档相关操作

1.新增文档

DSL语句

POST /索引库名/_doc/文档id
{
    "字段1": "值1",
    "字段2": "值2",
    "字段3": {
        "子属性1": "值3",
        "子属性2": "值4"
    },
    // ...
}

java api

	@Test
    void addDocTest() throws IOException {
        //1.查询数据
        Hotel byId = service.getById(36934L);
        HotelDoc hotelDoc = new HotelDoc(byId);
        //2.创建请求
        IndexRequest request = new IndexRequest("hotel").id(hotelDoc.getId().toString());
        //3.封装数据
        request.source(JSON.toJSONString(hotelDoc), XContentType.JSON);//将hoteldoc转为json
        //4.发送请求
        clinet.index(request,RequestOptions.DEFAULT);
    }

2.查询文档

DSL语句

GET /{索引库名称}/_doc/{id}

java api

 	@Test
    void getDocTest() throws IOException {
        GetRequest request = new GetRequest("hotel").id("36934");
        GetResponse response = clinet.get(request, RequestOptions.DEFAULT);
        //解析返回
        String sourceAsString = response.getSourceAsString();
        HotelDoc hotelDoc = JSON.parseObject(sourceAsString, HotelDoc.class);
        System.out.println(hotelDoc);
    }

3.修改文档

修改有两种方式:

  • 全量修改:直接覆盖原来的文档
  • 增量修改:修改文档中的部分字段

3.1.全量修改

全量修改是覆盖原来的文档,其本质是:

  • 根据指定的id删除文档
  • 新增一个相同id的文档

注意:如果根据id删除时,id不存在,第二步的新增也会执行,也就从修改变成了新增操作了。

语法:

PUT /{索引库名}/_doc/文档id
{
    "字段1": "值1",
    "字段2": "值2",
    // ... 略
}

示例:

PUT /heima/_doc/1
{
    "info": "黑马程序员高级Java讲师",
    "email": "zy@itcast.cn",
    "name": {
        "firstName": "云",
        "lastName": "赵"
    }
}

3.2.增量修改

增量修改是只修改指定id匹配的文档中的部分字段。

语法:

POST /{索引库名}/_update/文档id
{
    "doc": {
         "字段名": "新的值",
    }
}

示例:

POST /heima/_update/1
{
  "doc": {
    "email": "ZhaoYun@itcast.cn"
  }
}

3.3Java api

	@Test
    void updateDoctTest() throws IOException {
        UpdateRequest request = new UpdateRequest("hotel","36934");
        request.doc(
                "price","10000",
                        "startName","三钻"
        );
        clinet.update(request,RequestOptions.DEFAULT);
    }

4.删除文档

DSL语句

DELETE /{索引库名}/_doc/id值

java api文章来源地址https://www.toymoban.com/news/detail-848048.html

	 @Test
    void deleteDocTest() throws IOException {
        DeleteRequest request = new DeleteRequest("hotel","36934");
        clinet.delete(request,RequestOptions.DEFAULT);
    }

5.批量增加

	/**
     * 批量增加
     */
    @Test
    void addBulkDocTest() throws IOException {
        //1.准备数据
        List<Hotel> list = service.list();
        //2.封装数据
        BulkRequest requests = new BulkRequest();
        for (Hotel hotel : list) {
            HotelDoc hotelDoc = new HotelDoc(hotel);
            requests.add(new IndexRequest("hotel")
                    .id(hotelDoc.getId().toString())
                    .source(JSON.toJSONString(hotelDoc),
                    XContentType.JSON));
        }
        //3.发送请求
        clinet.bulk(requests,RequestOptions.DEFAULT);
    }

到了这里,关于Elasticsearch学习笔记(1)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • ElasticSearch 学习、实践笔记

    1. 索引(Index) :索引是 Elasticsearch 中最基本的数据存储单位,类似于关系型数据库中的数据库。一个索引可以包含多个文档,每个文档都有一个唯一的 ID,用于标识该文档。索引可以被分为多个分片,每个分片可以存储一部分文档数据。  2. 文档(Document) :文档是 Elast

    2024年01月23日
    浏览(13)
  • ES(elasticSearch学习笔记)

    ES(elasticSearch学习笔记)

    es是面向文档型的数据库,一条数据在es数据库就是一个文档,和关系型数据库做一个类比: 1:es的索引类比关系型数据库的数据库, 2:es的type类比数据表( 7.0版本以上删除了type这个概念 ), 3:es的索引下的文档document类比关系型数据库的行,新增时可以指定文档主键id

    2023年04月08日
    浏览(8)
  • 【超容易理解】Elasticsearch学习笔记

    【超容易理解】Elasticsearch学习笔记

    安装docker,步骤略 安装elasticsearch 安装kibana 挂载目录,修改目录权限 运行es和kibana 注:启动kibana的ip地址要换成自己的ip 打开192.168.56.10:5601,进入kibana,打开下面的界面,这个界面就是执行api的界面,因为elasticsearch是对 Lucene 的封装,提供了 REST API 的操作接口,在不接触底

    2024年02月03日
    浏览(36)
  • Elasticsearch8.x学习笔记

    Elasticsearch8.x学习笔记

    ES7.x版本可以参考:Elasticsearch7学习笔记 从 2019 年 4 月 10 日 Elasticsearch7.0 版本的发布,到 2022 年 2 月 11 日 Elasticsearch8.0 版本的发布的近 3 年间,基于不断优化的开发设计理念,Elasticsearch 发布了一系列的小版本。这些小版本在以下方面取得了长足的进步并同时引入一些全新的

    2024年02月08日
    浏览(9)
  • ElasticSearch学习笔记一——下载及安装

    ElasticSearch学习笔记一——下载及安装

    最近发现ES是个很重要的内容啊,各种大厂都会使用ES来做一些大范围的搜索之类的功能,所以今天我们也来学习一下。 首先我们要准备Java的环境,推荐版本8、11、14 ES官方的JDK兼容性列表(有些慢,需要耐心等待一下哈) 在我写文章时,针对JDK1.8能支持的ES最高版本是Elastics

    2024年02月15日
    浏览(11)
  • Linux学习笔记——ElasticSearch安装部署

    5.6.1、简介 全文搜索属于最常见的需求,开源的ElasticSearch(以下简称es)是目前全文搜索引擎的首选。 它可以快速的储存、搜索和分析海量数据。维基百科、Stack Overflow、GitHub都采用它。 ElasticSearch简称es,在企业内同样是一款应用非常广泛的搜索引擎服务。 很多服务中的搜

    2024年02月09日
    浏览(7)
  • Elasticsearch7学习笔记(尚硅谷)

    Elasticsearch7学习笔记(尚硅谷)

    Elasticsearch是一个 实时的分布式搜索和分析引擎 。它可以帮助你用前所未有的速度去处理大规模数据。它可以用于 全文搜索,结构化搜索以及分析 ,当然你也可以将这三者进行组合。 Elasticsearch是一个建 立在全文搜索引擎 Apache Lucene™ 基础 上的搜索引擎,可以说Lucene是当今

    2024年01月23日
    浏览(15)
  • 【ElasticSearch8.X】学习笔记(一)

    【ElasticSearch8.X】学习笔记(一)

    减少内存堆使用,完全支持 ARM 架构,引入全新的方式以使用更少的存储空间,从而让每个节点托管更多的数据 Elasticsearch8.x需要jdk17 降低查询开销,在大规模部署中成效尤为明显 首次启动 Elasticsearch8.x时,会自动进行安全配置 在 Elasticsearch 8.0 中做了一些改变来保护系统索引

    2024年02月07日
    浏览(11)
  • 【ElasticSearch8.X】学习笔记(二)

    【ElasticSearch8.X】学习笔记(二)

    在本人blog中ElasticSearch7.x使用postman进行演示过基础操作 因此在ElasticSearch8.x通过Kibana进行演示 4.1.1、创建索引 ES 软件的索引可以类比为 MySQL 中表的概念,创建一个索引,类似于创建一个表 ES 不允许修改索引 4.1.2、查询指定索引 根据索引名称查询指定索引,如果查询到,会返

    2024年02月03日
    浏览(12)
  • 全文检索学习之ElasticSearch学习笔记

    在非关系型数据库中,数据是非结构化的,如果直接去查找效率极低,全文检索将非结构化数据中的一部分信息提取出来,重新组织,使其变得有一定结构,然后对此有一定结构的数据进行搜索,从而达到搜索相对较快的目的。索引就是从非结构化数据中提取出的然后重新组

    2023年04月11日
    浏览(9)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包