栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 前沿技术 > 大数据 > 大数据系统

Elasticsearch,IK分词器以及Kibana的安装和DSL语句的基本操作

Elasticsearch,IK分词器以及Kibana的安装和DSL语句的基本操作

1. Elasticsearch的概述

  Elasticsearch可以处理海量(PB级别的)数据。支持用Restful风格的API对Elasticsearch进行操作。常常用于大量数据的实时搜索。
  Elasticsearch相当于MySQL数据库。Elasticsearch中可以创建多个索引库,每个索引库中有多个类型,每个类型中有多个文档,每个文档中有多个字段。它和数据库的对比关系如下:

Relational DB ‐> Databases ‐> Tables ‐> Rows ‐> Columns 
Elasticsearch ‐> Indices ‐> Types ‐> documents ‐> Fields
2. Elasticsearch的安装
    拉取Elasticsearch的镜像
docker pull elasticsearch:5.6.8
    安装es容器
docker run -e ES_JAVA_OPTS="-Xms256m -Xmx256m" -e "discovery.type=single-node" -di --name=elasticsearch -p 9200:9200 -p 9300:9300 elasticsearch:7.3.0

  9200端口(Web管理平台端口即restful端口) 9300(服务默认端口即TCP端口)

  查看容器

    浏览器地址访问
      浏览器输入地址访问:http://39.99.149.140:9200/(注意要在阿里云上打开9200端口的安全组才能正常访问)。

  上面步骤都完成之后,es并不能正常使用,elasticsearch从5版本以后默认不开启远程连接,程序直接连接会报如下错误:

failed to load elasticsearch nodes : org.elasticsearch.client.transport.NoNodeAvailableException: None of the configured nodes are available: [{#transport#-1}{5ttLpMhkRjKLkvoY7ltUWg}{192.168.211.132}{192.168.211.132:9300}]

  所以,我们要修改es配置,开启远程连接

    进入到容器内部
docker exec -it changgou_elasticsearch /bin/bash
    进入到config目录
ls -l
cd config
    查看文件
ls -l
    安装vim编辑器
apt-get update
apt-get install vim
    编辑elasticsearch.yml配置文件
vi elasticsearch.yml

  改成如下图所示

9. 重启docker

docker restart changgou_elasticsearch 

  重启后发现重启启动失败了,这是什么原因呢?这与我们刚才修改的配置有关,因为elasticsearch在启动的时候会进行一些检查,比如最多打开的文件的个数以及虚拟内存区域数量等等,如果你放开了此配置,意味着需要打开更多的文件以及虚拟内存,所以我们还需要系统调优

    修改vi /etc/security/limits.conf ,追加内容 (nofile是单个进程允许打开的最大文件个数, soft nofile 是软限制 hard nofile是硬限制 )
vi /etc/security/limits.conf

  末尾追加的内容

* soft nofile 65536
* hard nofile 65536
    修改vi /etc/sysctl.conf,追加内容 (限制一个进程可以拥有的VMA(虚拟内存区域)的数量 )
vi /etc/sysctl.conf

  追加的内容

vm.max_map_count=655360
    执行下面命令 修改内核参数马上生效
sysctl -p

  此时就能正常开启elasticsearch容器。

docker start changgou_elasticsearch

  提示:此时elasticsearch的内存开销特别大,可能导致我们的内存不足,导致无法启动,所以我们要优化一下

docker exec -it changgou_elasticsearch /bin/bash
cd /etc/elasticsearch
vi jvm.options


  改成合适的大小即可。

3. IK分词器的安装

  标准分词器对于中文只能一个字一个字的搜索,而我们集成使用IK分词器时就可以根据中文短语进行搜索。
  IK分词器下载地址https://github.com/medcl/elasticsearch-analysis-ik/releases,下载5.6.8版本的zip压缩包。

    将下载好的elasticsearch-analysis-ik-5.6.8.zip文件上传到服务器安装unzip命令
sudo yum install -y unzip zip
    将elasticsearch-analysis-ik-5.6.8.zip解压缩到当前目录的ik目录下(先创建好一个ik文件夹,否则报错)
unzip elasticsearch-analysis-ik-5.6.8.zip -d ./ik
    将解压后的文件重命名成ik
cd ik
mv elasticsearch ik

    将重命名后的文件拷贝到elasticsearch容器中的plugins目录下
docker cp ik changgou_elasticsearch:/usr/share/elasticsearch/plugins

  可以进入容器查看内容是否已经拷贝过去。

    重启docker容器
docker restart changgou_elasticsearch
4. IK分词器的测试 (1) 用IK最小分词器测试

  测试的访问路径:http://39.99.149.140:9200/_analyze?analyzer=ik_smart&pretty=true&text=我是程序员

(2) 用IK最细分词器测试

  测试的访问路径:http://39.99.149.140:9200/_analyze?analyzer=ik_max_word&pretty=true&text=我是程序员

5. 自定义分词器


  "迪丽热巴"是一个明星的名字,我们在分词的时候不想拆分他们,所以我们要自定义分词器以便于关键字进行搜索。

    进入到elasticsearch容器
docker exec -it changgou_elasticsearch /bin/bash
    进入到IK分词器的config目录下
cd /usr/share/elasticsearch/plugins/ik/config
    新建一个others.dic文件(名字随便取),在里面加入"迪丽热巴"
vi others.dic

  在文件中写的内容如下图所示:

    然后配置IKAnalyzer.cfg.xml文件,把我们刚刚新创建的自定义分词文件名添加进去
vi IKAnalyzer.cfg.xml

    重启elasticsearch的docker容器
docker restart changgou_elasticsearch
    再次访问就可以了
6. 自定义停用词汇

  方法和上边一样,修改IKAnalyzer.cfg.xml配置文件:添加停用词汇的文件名。

7. Kibana概述

  Kibana 是一款开源的数据分析和可视化平台,可以使用 Kibana 对 Elasticsearch 索引中的数据进行搜索、查看、交互操作。还可以很方便的利用图表、表格及地图对数据进行多元化的分析和呈现。

8. Kibana下载安装
    拉取Kibana镜像
docker pull docker.io/kibana:5.6.8
    创建Kibana容器
docker run -it -d -e ELASTICSEARCH_URL=http://39.99.149.140:9200 --name kibana --restart=always -p 5601:5601 kibana:5.6.8

  ELASTICSEARCH_URL=http://192.168.211.132:9200:是指链接的ES地址

  注意:别忘了在阿里云服务器打开5601端口的安全组。

    输入http://39.99.149.140:5601/测试访问

9. Kibana的DSL语句操作

  相当于数据库中的SQL语句

(1) 查询所有索引库
GET /_cat/indices?v

(2) 删除索引库
DELETE /skuinfo

(3) 新增索引库
PUT /user

(4) 创建映射

  索引库/类型/映射

PUT /user/userinfo/_mapping
{
  "properties": {
    "name":{
      "type": "text",
      "analyzer": "ik_smart",
      "search_analyzer": "ik_smart",
      "store": false
    },
    "city":{
      "type": "text",
      "analyzer": "ik_smart",
      "search_analyzer": "ik_smart",
      "store": false
    },
    "age":{
      "type": "long",
      "store": false
    },
    "description":{
      "type": "text",
      "analyzer": "ik_smart",
      "search_analyzer": "ik_smart",
      "store": false
    }
  }
}

(5) 新增文档数据

  索引库/类型/文档下标

PUT /user/userinfo/1
{
  "name":"李四",
  "age":22,
  "city":"深圳",
  "description":"李四来自湖北武汉!"
}

  再增加几条数据

#新增文档数据 id=2
PUT /user/userinfo/2
{
  "name":"王五",
  "age":35,
  "city":"深圳",
  "description":"王五家住在深圳!"
}

#新增文档数据 id=3
PUT /user/userinfo/3
{
  "name":"张三",
  "age":19,
  "city":"深圳",
  "description":"在深圳打工,来自湖北武汉"
}

#新增文档数据 id=4
PUT /user/userinfo/4
{
  "name":"张三丰",
  "age":66,
  "city":"武汉",
  "description":"在武汉读书,家在武汉!"
}

#新增文档数据 id=5
PUT /user/userinfo/5
{
  "name":"赵子龙",
  "age":77,
  "city":"广州",
  "description":"赵子龙来自深圳宝安,但是在广州工作!",
  "address":"广东省茂名市"
}

#新增文档数据 id=6
PUT /user/userinfo/6
{
  "name":"赵毅",
  "age":55,
  "city":"广州",
  "description":"赵毅来自广州白云区,从事电子商务8年!"
}

#新增文档数据 id=7
PUT /user/userinfo/7
{
  "name":"赵哈哈",
  "age":57,
  "city":"武汉",
  "description":"武汉赵哈哈,在深圳打工已有半年了,月薪7500!"
}
(6) 替换一条文档数据

  这种操作会将整个数据替换掉

#替换数据,id=4
PUT /user/userinfo/4
{
  "name":"张三丰",
  "description":"在武汉读书,家在武汉!在深圳工作!"
}

  图片中创建失败,替换成功,所以是成功的。

(7) 更新一条文档数据

  使用 post 更新某个列的文档数据

POST /user/userinfo/4/_update
{
  "doc":{
    "name":"张三丰",
    "description":"在武汉读书,家在武汉!在深圳工作!"
  }
}

  只改变更新的列,其余的列不改变

(8) 删除一条文档数据
#删除数据
DELETE user/userinfo/7
(9) 查询user索引库所有数据
GET /user/_search


  查询user索引库中userinfo类型下的数据

GET /user/userinfo/_search

  查询所有索引库的所有数据

GET _search

(10) 根据文档ID查询数据

#根据ID查询
GET /user/userinfo/2

(11) 排序查询

  查询所有,根据age降序查询
  “match_all”: {} 查询所有,asc是升序

#搜索排序
GET /user/_search
{
  "query":{
    "match_all": {}
  },
  "sort":{
    "age":{
      "order":"desc"
    }
  }
}
(12) 排序分页查询
#分页实现
GET /user/_search
{
  "query":{
    "match_all": {}
  },
  "sort":{
    "age":{
      "order":"desc"
    }
  },
  "from": 0,
  "size": 2
}

  from:序号从0开始,表示从哪个序数开始查询
  size:每页显示条数

(13) term(分词)过滤查询

  term主要用于分词精确匹配。

#过滤查询-term
GET _search
{
  "query":{
    "term":{
      "city":"武汉"
    }
  }
}

(14) terms(多个分词)过滤查询

  terms和term类似,term有一个条件分词,terms指定多个分词的匹配条件进行匹配,只要有一个分词符合条件,就能查询出来

#过滤查询-terms 允许多个Term
GET _search
{
  "query":{
    "terms":{
      "city":
        [
          "武汉",
          "广州"
        ]
    }
  }
}

(15) range(范围)过滤

  range过滤允许我们按照指定范围查找一批数据。例如我们查询年龄范围。

#过滤-range 范围过滤
#gt表示> gte表示>=
#lt表示< lte表示<=
GET _search
{
  "query":{
    "range": {
      "age": {
        "gte": 30,
        "lte": 57
      }
    }
  }
}

(16) exists过滤

  exists 过滤可以用于查找拥有某个域的数据

#过滤搜索 exists:是指包含某个域的数据检索
GET _search
{
  "query": {
    "exists":{
      "field":"address"
    }
  }
}

(17) bool过滤

  bool 过滤可以用来合并多个过滤条件查询结果的布尔逻辑,它包含一下操作符:

must : 多个查询条件的完全匹配,相当于 and。must_not : 多个查询条件的相反匹配,相当于 not。should : 至少有一个查询条件匹配, 相当于 or。

  搜索在深圳的用户,并且年龄在10-30之间的用户

#过滤搜索 bool 
#must : 多个查询条件的完全匹配,相当于 and。
#must_not : 多个查询条件的相反匹配,相当于 not。
#should : 至少有一个查询条件匹配, 相当于 or。
GET _search
{
  "query": {
    "bool": {
      "must": [
        {
          "term": {
            "city": {
              "value": "深圳"
            }
          }
        },
        {
          "range":{
            "age":{
              "gte":10,
              "lte":30
            }
          }
        }
      ]
    }
  }
}
(18) prefix查询

  以什么字符开头的,可以更简单地用 prefix ,例如查询所有以赵开始的用户描述

#前缀匹配 prefix
GET _search
{
  "query": {
    "prefix": {
      "name": {
        "value": "赵"
      }
    }
  }
}
(19) match查询

  match_all 查询,可以查询到所有文档,是没有查询条件下的默认语句。

#查询所有 match_all
GET _search
{
  "query": {
    "match_all": {}
  }
}

  match查询是一个标准查询,不管你需要全文本查询还是精确查询基本上都要用到它。

#字符串匹配
GET _search
{
  "query": {
    "match": {
      "description": "武汉"
    }
  }
}

  multi_match查询允许你做match查询的基础上同时搜索多个字段,在多个字段中同时查一个

#多个域匹配搜索
GET _search
{
  "query": {
    "multi_match": {
      "query": "深圳",
      "fields": [
        "city",
        "description"
      ]
    }
  }
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/761978.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号