Docker安装es、kibana、ik分词器

倒排索引相关概念

  • 文档(Document):用来检索的海量数据,其中的每一条数据就是一个文档。例如一个网页、一个商品信息。
  • 词条(Term):对文档数据或用户搜索数据,利用某种算法分词,得到的具备含义的词语就是词条。词条最小不可再拆分。

Docker安装

安装ElasticSearch

1)安装

docker run -id --name elasticsearch \
    -e "cluster.name=ly-elastic" \
    -e "http.host=0.0.0.0" \
    -e "ES_JAVA_OPTS=-Xms512m -Xmx512m" \
    -e "discovery.type=single-node" \
    -e http.cors.enabled=true \
    -e http.cors.allow-origin="*" \
    -e http.cors.allow-headers=X-Requested-With,X-Auth-Token,Content-Type,Content-Length,Authorization \
    -e http.cors.allow-credentials=true \
    -v es-data:/usr/share/elasticsearch/data \
    -v es-logs:/usr/share/elasticsearch/logs \
    -v es-plugins:/usr/share/elasticsearch/plugins \
    --privileged \
    --hostname elasticsearch \
    -p 9200:9200 \
    -p 9300:9300 \
    -p 5601:5601 \
elasticsearch:7.4.2
# 9200:http协议端口
# 9300:TCP协议端口
# 5601:Kibana访问端口

2)设置自启动

docker update --restart=always elasticsearch 

3)启动防火墙

systemctl start firewalld

4)开放端口

firewall-cmd --zone=public --add-port=9200/tcp --permanent
firewall-cmd --zone=public --add-port=9300/tcp --permanent

5)重启防火墙

firewall-cmd --reload

6)查看防火墙放行端口

firewall-cmd --list-ports

7)学习阶段可关闭防火墙,工作时不要关闭防火墙

systemctl stop firewalld

备注:如启动有问题,重启docker服务,再启动elasticsearch容器

systemctl restart docker
docker start elasticsearch

安装Kibana

1)安装

docker run -di --name kibana -e ELASTICSEARCH_URL=http://127.0.0.1:9200 --network=container:elasticsearch  kibana:7.4.2

安装IK分词器

1)进入/var/lib/docker/volumes/es-plugins/_data/

cd /var/lib/docker/volumes/es-plugins/_data/

2)新建文件目录 ik 并且进入

mkdir ik
cd ik

3)将elasticsearch-analysis-ik-7.4.2.zip添加进该目录

4)解压该压缩包

yum -y install unzip (可先压缩,没有该工具时再安装)
unzip elasticsearch-analysis-ik-7.4.2.zip

5)重启elasticsearch与kibana

docker restart elasticsearch
docker restart kibana

设置IK分词器的扩展词与屏蔽词词典

1)进入IK分词器config目录

cd config

2)编辑IKAnalyzer.cfg.xml,添加以下内容扩展词文件路径ext.dic、屏蔽词文件路径stopword.dic

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
        <comment>IK Analyzer 扩展配置</comment>
        <!--用户可以在这里配置自己的扩展字典 *** 添加扩展词典-->
        <entry key="ext_dict">ext.dic</entry>
         <!--用户可以在这里配置自己的扩展停止词字典-->
        <entry key="ext_stopwords">stopword.dic</entry>
        <!--用户可以在这里配置远程扩展字典 -->
        <!-- <entry key="remote_ext_dict">words_location</entry> -->
        <!--用户可以在这里配置远程扩展停止词字典-->
        <!-- <entry key="remote_ext_stopwords">words_location</entry> -->
</properties>

3)编辑stop.dic,添加屏蔽词

4)复制stop.dic命名为ext.dic,编辑ext.dic,添加扩展词
(不要自己新建文件,字符编码容易出错)

cp stopword.dic ext.dic

5)重启elasticsearch与kibana

docker restart elasticsearch
docker restart kibana

IK分词小结:

  • ik_smart:最小切分,例如:程序员可分为程序员

  • ik_max_word:最细切分,例如:程序员可分为程序员、程序

Elasticsearch对比MySQL

Elasticsearch虽然是一种NoSql库,但最终的目的是存储数据、检索数据。因此很多概念与MySQL类似的。

ES中的概念 数据库概念 说明
索引库(indices) 数据库(Database) ES中可以有多个索引库,就像Mysql中有多个Database一样。
类型(Type) 表(table) mysql中database可以有多个table,table用来约束数据结构。而ES中的每个索引库中只有一个类型类型中用来约束字段属性的叫做映射(mapping),7.X之后将会被取消,取默认值:_doc
映射(mappings) 表的字段约束 mysql表对字段有约束,ES中叫做映射,用来约束字段属性,包括:字段名称、数据类型等信息
文档(document) 行(Row) 存入索引库原始的数据,比如每一条商品信息,就是一个文档。对应mysql中的每行数据
字段(field) 列(Column) 文档中的属性,一个文档可以有多个属性。就像mysql中一行数据可以有多个列。

因此,我们对ES的操作,就是对索引库、类型映射、文档数据的操作:

  • 索引库操作:主要包含创建索引库、查询索引库、删除索引库等
  • 类型映射操作:主要是创建类型映射、查看类型映射
  • 文档操作:文档的新增、修改、删除、查询

Elasticsearch的索引库操作

  • 创建索引库
PUT /索引库名
{
    "settings": {
        "属性名": "属性值"
      }
}
  • 查询索引库
GET /索引库
  • 删除索引库
DELETE /索引库名

mapping映射(三个是否)

  • 数据是否参与搜索?

    • 通过index属性来指定是否参与搜索,默认为true
  • 数据是否需要分词?

    • 分词器类型很多,中文一般选择IK分词器
    • 指定分词器类型可以通过analyzer属性指定

    注意:在同一个域上 分词和搜索时 建议使用同一个分词器

  • 数据是否存储到es库中?

    • 是否存储取决于用户是否需要将当前字段展示给用户查看

数据类型

string

  • text:默认是索引、存储、分词
  • keyword:默认是索引、存储、不分词
  • wildcard

NUmeric

  • long
  • integer
  • short
  • byte
  • double
  • float
  • half_float
  • scaled_float

Date

  • date

Date nanoseconds

  • date_nanos

Boolean

  • boolean

Binary

  • binary

Range

  • integer_range
  • float_range
  • long_range
  • double_range
  • date_range
  • ip_range

Object

  • object for single JSON objects

Nested

  • nested for arrays of JSON objects

创建类型映射

索引库已经存在

PUT /索引库名/_mapping
{
  "properties": {
    "字段名1": {
      "type": "类型",
      "index": true,
      "analyzer": "分词器"
    },
    "字段名2": {
      "type": "类型",
      "index": true,
      "analyzer": "分词器"
    },
    ...
  }
}

索引库不存在

PUT /索引库名
{
	"mappings":{
      "properties": {
        "字段名1": {
          "type": "类型",
          "index": true,
          "analyzer": "分词器"
        },
        "字段名2": {
          "type": "类型",
          "index": true,
          "analyzer": "分词器"
        },
        ...
      }
    }
}

查看映射关系

GET /索引库名/_mapping

Document文档的操作

新增文档

新增并随机生成id

POST /索引库名/_doc
{
    "key":"value"
}

新增并指定id

POST /索引库名/_doc/id值
{
    "key":"value"
}

或者使用PUT(id不存在则新增,存在则修改,必须指定id)

PUT /索引库名/_doc/id值
{
    "key":"value"
}

查询文档

根据ID查询

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

删除文档

DELETE /索引库名/类型名/id值

文档映射

默认映射

  • 如遇String类型数据,ES无法确定该用text还是keyword,它就会存入两个字段。
    例如:
    • subtitle:text类型
    • subtitle.keyword:keyword类型

动态映射

# 动态模板
PUT heima3
{
  "mappings": {
      "properties": {
        "title": {
          "type": "text",
          "analyzer": "ik_max_word"
        }
      },
      "dynamic_templates": [
        {
          "strings": { 
            "match_mapping_type": "string",
            "mapping": {
              "type": "keyword"
            }
          }
        }
      ]
    }
}

这个动态模板的意思是:凡是string类型的自动,统一按照 keyword来处理。

上一篇:es(四)--IK分词器和ElasticSearch集成使用


下一篇:elasticsearch笔记(1)