ElasticSearch01——es安装、ik分词器、索引库概念

ElasticSearch01——es安装、ik分词器、索引库概念,第1张

ElasticSearch01——es安装、ik分词器、索引库概念

ElasticSearch简称es,是一个开源的分布式搜索引擎,可以用来实现搜索、日志统计、分析、系统监控等功能

ElasticSearch本身是一个存储、计算、搜索数据的引擎,可以结合kibana(数据可视化工具)、Beats(数据抓取工具)、Logstash(数据抓取工具),组成elastic stack(ELK),可应用于日志统计、实时监控等领域。除了elasticsearch本身,其他组件都可以被替代

Lucene:Apache的开源搜索引擎类库,提供了搜索引擎的核心API,elasticsearch就是基于Lucene做的二次开发

概念介绍

文档:每一条数据就是一个文档,在ES中文档是json格式

词条:对文档中的内容分词得到的词语就是词条,中文就按照中文语义分。

比如说一个网页包含可口可乐信息、另外一个网页包含百事可乐信息,这时按照语义可以分为"可口","可乐","百事"这三个词条。如下:

ID对应数据(这里假设为网页)1可口可乐网页2百事可乐网页

这里对上面表格词条按语义分词

词条ID可口1可乐1,2百事2

当我们搜索"可口",对应id为1的网页,就是可口可乐网页,当搜索"可口可乐",对应,分别对应id为1,id为1,2,综合优先展示id为1的网页,即也是可口可乐;当我们搜索“可乐”时,对应id为1,2,则展示id为1和2的网页,也就是所有可乐相关的消息都展示出来了,这就是倒排索引

正向索引:基于文档id创建索引。查询词条时必须先找到文档,再判断是否包含词条

倒排索引:对文档内容分词,对词条创建索引,并记录词条所在文档的信息。查询时先根据词条查询到文档id,然后获取到文档

mysql和elasticSearch的对应关系

MySQL主要负责事务类型 *** 作,保证数据安全性

ES主要负责海量数据的搜索、分析、计算

ES及其组件安装

ES安装

  1. 我的所有安装都是在docker里进行的,因为我们还需要部署kibana容器,因此需要让es和kibana容器互联。这里先创建一个网络:
    docker network create es-net  #创建网络名叫es-net

  2. 通过docker pull elasticsearch:7.12.1命令下载es镜像,镜像比较大,下载时间久,也可以自己取外部下载   ,链接: https://pan.baidu.com/s/1r4C37YB9xQZt6yKrm0FXlQ 提取码: nje4,下载后传到虚拟机,通过docker load -i xxx命令加载镜像

  3. 加载完后通过docker images可以查看镜像是否存在,然后开始运行镜像

    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  #使容器拥有root权限
        --network es-net   #让该容器加入到我们刚才创建的es-net网络中
        -p 9200:9200   #http协议端口
        -p 9300:9300  #各个容器互联端口
    elasticsearch:7.12.1

    通过docker ps可以查看容器运行状态,或者直接取浏览器访问es端口,如下则表示容器部署并且运行成功

     由此也可发现es内部确实都是json格式的

es组件kibana安装,该组件可以将es数据可视化

  1. 首先还是去服务器拉取镜像,或者通过外部下载,然后加载镜像,链接: https://pan.baidu.com/s/1HuKxFp1RloR22z1PFrGOwQ 提取码: haay
  2. 完成镜像加载后,开始运行容器
    docker run -d 
    --name kibana 
    -e ELASTICSEARCH_HOSTS=http://es:9200   #指定es地址,因为是在同一个网络,所有可以通过容器名:端口来互联
    --network=es-net 
    -p 5601:5601    #kiban端口
    kibana:7.12.1  #版本需和es版本一致

    运行成功后可在浏览器访问5601端口

IK分词器

之前谈到es是通过语义来分词,但是对于中文来说不友好,通常会把一句话的每个字都做分词,而不是按照语义来分,IK分词器则可以解决该问题,对中文分词十分友好,所以这里需要使用IK分词器

安装方式有两种:第一种是在线安装,但是下载较慢,这里把命令给出即可

# 进入容器内部
docker exec -it elasticsearch /bin/bash

# 在线下载并安装
./bin/elasticsearch-plugin  install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.12.1/elasticsearch-analysis-ik-7.12.1.zip

#退出
exit
#重启容器
docker restart elasticsearch

第二种是离线安装

  1. IK插件是安装在es的插件目录里的,所以安装插件需要知道elasticsearch的plugins目录位置,因为之前创建了数据卷es-plugins,所以可以通过docker volume inspect es-plugins命令查看数据卷信息,找到具体的目录位置,然后将IK分词器插件直接上传到该文件目录里即可,分词器链接: https://pan.baidu.com/s/1iw9bYlmngrnwaLDMyqYHkg 提取码: 4jup 
  2. 重启容器,安装成功

 IK分词器的使用

首先了解以下DSL语句,专门用于 *** 作ES的语句,就像数据库用sql *** 作一样。刚才安装的kibana组件就可以很好的让我们去实现dsl语句的编写。

首先访问kibana的首页

然后出现如下控制台,可以直接在这里写dsl语句 

 ik分词器包含两种模式

  • ik_smart`:最少切分
  • ik_max_word`:最细切分

然后我随便写一个简单的分词

 如图右面所以,ik分词器根据语义做出了智能分词,这就是一个简单的分词。

除此之外还可以自定义分词,就比如把我上面那句话的"小鱼啦啦"分为一个词,然后把"禁止"这个词作为禁忌词语不让出现, *** 作如下

在ik插件目录的config目录的IKAnalyzer.cfg.xml文件里做修改

按如下修改




	IK Analyzer 扩展配置
	
	ext.dic
	 
	stopword.dic
	
	
	
	

接着在同级目录创建ext.dic和stopword.dic文件,前者添加自定义词汇,后者屏蔽禁忌词汇

 建好后去编辑两个文件的内容

 其他不管,我屏蔽掉我需要的"禁止",然后保存,docker restart es命令重启容器

 效果如上图所示,把我自定义的"小鱼啦啦"变成了一个词条,同时屏蔽掉了"禁止"这个词

索引库 *** 作

索引库类似于数据库中的表结构,所以第一步一定先创建索引库

mapping属性:mapping是对索引库中的文档约束,类似于数据库中对字段的约束

mapping常见属性如下

  1. type:字段数据类型
  • 字符串类型:text(可分词的文本),keyword(精确值,例如:品牌、国家、ip地址,即不需要进行分词的类型)
  • 数值:long、integer、short、byte、double、float
  • 布尔:boolean
  • 日期:date
  • 对象:object

      2. index:是否创建倒排索引,默认为true

      3. analyzer: 使用哪种分词器 

      4. properties:字段的子字段

以上就是常见属性,但并非所有属性,下面通过在kibana上写dsl语句来演示

 原语句如下

PUT /xiaoyu    
{
  "mappings":{
    "properties":{
      "info":{
        "type":"text"
        , "analyzer": "ik_smart"
      },
      "tel":{
        "type": "keyword",
        "index": false
      },
      "sex":{
        "type": "boolean"
      },
      "name":{
        "type": "object",
        "properties": {
          "firstName":{
            "type":"keyword"
          },
          "lastName":{
            "type":"keyword"
          }
        }
      }
    }
  }
}

  这样一个索引库就创建好了,现在对索引库做简单的删改查 *** 作

查询刚才创建的索引库:通过GET /索引库名字即可,查询后执行即可看见查询结果

修改 *** 作:es不支持对已经创建的索引库进行修改!!!只能在已创建的索引库里面增加新的字段

 原语句如下

#修改索引库,本质是添加新字段
PUT /xiaoyu/_mapping
{
    "properties":{
      "age":{
        "type":"integer"
      }
  }
}

删除 *** 作

#删除 *** 作    
DELETE /xiaoyu 

文档 *** 作

首先明确一点,文档就类似于数据库中的一条数据,对文档的 *** 作就类似于对数据库中的数据 *** 作,所以文档的 *** 作是在索引库的基础之上的,就像数据库的数据 *** 作是在表里面的一样

新增 *** 作

 原句如下

#新增文档
POST /xiaoyu/_doc/1
{
  "info": "这是一条数据,本质上就是一个文档",
  "tel": 123,
  "sex": false,
  "name":{
    "firstName":"王",
     "lastName":"五"
  }
}

查询 *** 作

GET /xiaoyu/_doc/1

删除 *** 作

DELETE /xiaoyu/_doc/1

修改 *** 作:

修改 *** 作分为全量修改和局部修改两种。

全量修改就是把之前的这条数据删除后,把刚刚的数据新增上去,相当于直接替换掉,如果在修改时id没有对应上,则之前的数据没被删除,又把刚刚的数据新增上去了,就变为了新增 *** 作

PUT /xiaoyu/_doc/1
{
  "info": "修改这条数据",
  "tel": 123,
  "sex": false,
  "name":{
    "firstName":"王",
     "lastName":"五"
  }
}

局部修改,不做全部替换,只对修改的地方做替换,语法有所区别,“_update”为固定写法

POST /xiaoyu/_update/1
{
  "doc":{
    "info":"局部修改,只修改info"
  }
}

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5679267.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存