ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

4.7 ElasticSearch

2021-02-20 16:35:21  阅读:194  来源: 互联网

标签:4.7 ip 索引 文档 elasticsearch ElasticSearch type ES


一、ElasticSearch介绍

1.1 引言

  1.  在海量数据中执行搜索功能时,如果使用MySQL,效率太低。
  2. 如果关键字输入的不准确,一样可以搜索到想要的数据。
  3. 将搜索关键字,以红色的字体展示。

当在京东搜索手机壳的时候,可以搜索到千万级,上亿级的数量。如果用MySQL搜索,则SQL语句是select * from product where name like '%手机壳%';但是我们知道当通配符开始就是'%'的时候,索引就会失效,此时效率之低,难以想象;此外,当我们在京东搜索'壳手机'的时候一样可以出现搜索结果,显然此时就不是MySQL能够完成的了;最后我们发现搜索之后,手机壳这三个字是用红色标注的,你可能觉得简单,只需要在每个字前面加上<form>标签即可,但是当数据量极大的时候,如何高效地操作,就是一个问题。

 

 

1.2 ES的介绍

ES是一个使用Java语言并且基于Lucene编写的搜索引擎框架,他提供了分布式的全文搜索功能,提供了一个统一的基于RESTful风格的WEB接口,官方客户端也对多种语言都提供了相应的API。

Lucene:Lucene本身就是一个搜索引擎的底层,是Apach的项目,其实就是Jar包,提供了一些搜索的API。但是呢?由于其过于底层,因此用起来比较麻烦。ElasticSearch在Lucene基础上进行封装。其实Apach本身也不建议直接使用ElasticSearch,他自己也封装了一个新的项目是Solr,因此会经常见到Solr和ElasticSearch的对比。

分布式:ES主要是为了突出他的横向扩展能力。

全文搜索:将一段词语进行分词,并且将分出的单个词语统一的放到一个分词库中,在索引时,根据关键字去分词库中检索,找到匹配的内容。(倒排索引)

RESTful风格的WEB接口:操作ES很简单,只需要发送一个HTTP请求,并且根据请求方式的不同,携带参数的不同,执行相应的功能。

应用广泛:Github.com,WIKI,Gold Man用ES每天维护将近10TB的数据。

1.3 ES的由来

 

 

1.4 ES和Slor

  1. Solr在查询死数据时,速度相对ES更快一些。但是数据如果是实时改变的,Solr的查询速度会降低很多,ES的查询的效率基本没有变化。
  2. Solr和SlasticSearch都是单节点的,如果Solr搭建集群需要依赖Zookeeper来帮助管理。ES本身就支持集群的搭建,不需要第三方的介入。
  3. 最开始Solr的社区可以说是非常火爆,针对国内的文档并不是很多。在ES出现之后,ES的社区火爆程度直线上升,ES的文档非常健全。
  4. ES对现在云计算和大数据支持的特别好。

1.5 倒排索引

将存放的数据,以一定的方式进行分词,并且将分词的内容存放到一个单独的分词库中。

当用户去查询数据时,会将用户的查询关键字进行分词。

然后去分词库中匹配内容,最终得到数据的id标识。

根据id标识去存放数据的位置拉取到指定的数据。

 

 

二、ElasticSearch安装

2.1 安装ES&Kibana

Kibana是ES的客户端,对于ES和Kibana,我们只需要用docker的compose容器去维护即可。

version: '2'
services:
  elasticsearch:
    container_name: elasticsearch
    image: daocloud.io/library/elasticsearch:6.5.4
    ports:
      - "9200:9200"
    environment:
      - "ES_JAVA_OPTS=-Xms64m -Xmx128m"
      - "discovery.type=single-node"
      - "COMPOSE_PROJECT_NAME=elasticsearch-server"
    restart: always

  kibana:
    container_name: kibana
    image: daocloud.io/library/kibana:6.5.4
    ports:
      - "5601:5601"
    restart: always
    environment:
      - ELASTICSEARCH_HOSTS=http://1.15.122.141:9200

 

对于上面的docker-compose.yml文件,由于Kibana需要依赖es,因此有了environment的配置。

上面这个yml不是老师的,老师那么启动后,无法连接es和kibana,因此换用了这个。安装步骤是:在/opt/目录下mkdir docker_elasticsearch;vi docker-compose.yml,并复制上面内容;docker-compose up -d启动。

启动后:浏览器输入http://1.15.122.141:9200/访问ES,要在ES可以访问的情况下访问Kibana,对于Kibana,我们只需要关注两个内容即可。

 

 

2.2 安装IK分词器

其实ES是有默认的分词器的,但是呢?其对汉语支持的不好。他会一个字一个字的分开,因此这里我们安装一个IK分词器。是国内的,对汉语分词效果好。

安装步骤:进入jithub;搜索ik,点击第一个进去;选择releases版本,最终选择6.5.4,和上面保持一致;右键复制链接:https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v6.5.4/elasticsearch-analysis-ik-6.5.4.zip

 

我们这里并不直接下载安装,而是在ES容器内部安装。步骤为:docker ps查看es的container id;docker exec -it ID bash进入容器内部,ls看一下列表,进入bin目录;看到elasticsearch-plugin(其实对ES而言,分词器就是一个插件);输入命令:./elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v6.5.4/elasticsearch-analysis-ik-6.5.4.zip;输入y确认。

 

 

 下面我们就可以测试一波这个IK分词器了。其实在gitbuh的该项目下方也可以看到用法

 

 

 但是发现此时运行报错,说没有找到这个分词器。刚刚命名安装了呀!!!这是因为我们还需要重启一下es,因为IK分词器还没有生效。(这里不需要重启kibana,因为我们没有修改他;此外由于IK分词器是暗黄在容器的内部,因为我们以后尽量不要down这个容器,需要的话就restart重启)。重启之后再次测试,可以看到上图的结果。

 

 

 三、ElasticSearch基本操作

3.1 ES的结构

3.1.1 索引Index,分片和备份

ES的服务中,可以创建多个索引。每一个索引默认被分成5片存储。每一个分片都会存在至少一个备份分片。备份分片默认不会帮助苏检索数据,当ES检索压力特别大的时候,备份分片才会帮助检索数据。备份分片必须放在不同的服务器中。

 

3.1.2 类型Type

 一个索引下,可以创建多个类型。

Ps:根据版本不同,类型的创建也不同。

 

3.1.3 文档Doc

一个类型下,可以有多个文档,这个文档就类似于MySQL表中的多行数据。

 

3.1.4 属性Field

一个文档中,可以包含多个属性。类似于MySQL表中的一行数据存在多个列。

 

3.2 操作ES的RESTful语法

GET请求:

http://ip:port/index:查询索引信息

http://ip:port/index/type/doc_id:查询指定的文档信息

POST请求:

http://ip:port/index/type/_search:查询文档,可以在请求体中添加json字符串来标识查询条件

http://ip:port/index/type/doc_id/_update:修改文档,在请求体中指定json字符串代表修改的具体信息

PUT请求:

http://ip:port/index:创建一个索引,需要在请求体中指定索引的信息,类型,结构

http://ip:port/index/type/_mapping:代表创建索引时,指定索引文档存储的属性的信息

DELETE请求:

http://ip:port/index:删除跑路

http://ip:port/index/type/doc_id:删除指定的文档

4.3 索引的操作

4.3.1 创建一个索引

语法如下:

# 创建一个索引
PUT /person
{
  "settings": {
    "number_of_shards": 5
    "number_of_replicas": 1
  }
}

 

4.3.2 查看索引信息

一种是用Kibana查看

 

 另一种是用命令查看:

# 查看索引信息
GET /person

 

 

4.3.3 删除索引

一种是在Management页面中勾选并删除索引。截图略

另一种是通过命令的方式

# 删除索引
DELETE /person

 

3.4 ES中Field可以指定的类型

字符串类型:

  • text:一般被用于全文检索。将当前Field进行分词。
  • keyword:当前Field不会被分词。

数值类型:

  • long:
  • integer:
  • short:
  • byte:
  • double:
  • float:
  • half_float:精度比float小一半(16位精度)
  • scaled_float:根据一个long和scaled来表达一个浮点型,long-345,scaled-100 -> 3.45

时间类型:

  • data类型,针对时间类型指定具体的格式

布尔类型:

  • boolean类型,表达true和false

二进制类型:

  • binary类型暂时支持Base64 encode string

范围类型:

  • long_range:赋值时,无需指定具体的内容,只需要存储一个范围即可,指定gt,it,gte,lte
  • integer_range:同上
  • doucle_range:同上
  • float_range:同上
  • date_range:同上
  • ip_range:同上

经纬度类型:

  • geo_point:用来存储经纬度的

ip类型:

  • ip:可以存储IPV4和IPV6

其它的数据类型参考官网:https://www.elastic.co/guide/en/elasticsearch/reference/6.5/mapping.html#mapping-type

3.5 创建索引并指定数据结构

如法如下:

# 创建索引,指定数据结构
PUT /book
{
  "settings": {
   # 分片数 "number_of_shards": 5,
   # 备份数 "number_of_replicas": 1 },
  # 指定数据结构 "mappings": {
   # 类型 Type "novel": {
    # 文档存储的Field "properties": {
     # Field属性名 "name": {
      # 类型 "type": "text",
      # 指定分词器 "analyzer": "ik_max_word",
      # 指定当前Field可以被作为查询的条件 "index": true,
      # 是否需要额外存储 "store": false }, "author": { "type": "keyword" }, "count": { "type": "long" }, "on-sale": { "type": "date",
      # 时间类型的格式化方式 "format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis" }, "descr": { "type": "text", "analyzer": "ik_max_word" } } } } }

 

上面索引已经创建好了,下面就是往里面添加内容了。

3.6 文档的操作

文档1ES服务中的唯一标识,_index,_type,_id三个内容为组合,锁定一个文档,操作是添加还是修改。

3.6.1 新建文档

自动生成_id

# 添加文档,自动生成id
POST /book/novel
{
  "name": "盘龙",
  "author": "我爱吃西红柿",
  "count": "1000000",
  "on-sale": "2000-01-01",
  "descr": "吸消息或或或和二二的1ddddddd的尺寸大大大毒贩夫妇过过过过"
}

 

 

 这种id是自动生成的,不容易记忆,不太推荐这种新建文档的方式。

手动指定_id

 

其实对于

 

 

wwwwwwww

标签:4.7,ip,索引,文档,elasticsearch,ElasticSearch,type,ES
来源: https://www.cnblogs.com/G-JT/p/14421874.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有