ElasticSearch入门

ElasticSearch入门

1、ElasticSearch介绍

1.1 引言

  • 在海量数据中执行搜索功能时,如果使用MSQL,效率太低。

  • 如果关键字输入的不准确一样可以搜索到想要的数据。

  • 将搜索关键字,以高亮字体展示(购物网站)。

1.2 ES的介绍

ES是一个使用Java语言并且基于lucence编写的搜索引擎框架,他提供了分布式的全文搜索功能,提供了一个统一的基于RESTful风格的WEB接口。官方文档

  • lucence:一个搜索引擎底层,官方网站,apache旗下的顶级项目,直接使用成本太高,所以采用ES实现功能。

  • 分布式:突出ES的横向扩展能力。

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

    比如:淘宝搜索“壳手机”,将其分解为“壳”、“手机”、“手”等;将目标“…苹果手机壳…”也这样分解。(全文检索)

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

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

1.3 ES的由来

你知道的, 为了搜索…

回忆时光

许多年前,一个刚结婚的名叫 Shay Banon 的失业开发者,跟着他的妻子去了伦敦,他的妻子在那里学习厨师。 在寻找一个赚钱的工作的时候,为了给他的妻子做一个食谱搜索引擎,他开始使用 Lucene 的一个早期版本。

直接使用 Lucene 是很难的,因此 Shay 开始做一个抽象层,Java 开发者使用它可以很简单的给他们的程序添加搜索功能。 他发布了他的第一个开源项目 Compass。

后来 Shay 获得了一份工作,主要是高性能,分布式环境下的内存数据网格。这个对于高性能,实时,分布式搜索引擎的需求尤为突出, 他决定重写 Compass,把它变为一个独立的服务并取名 Elasticsearch。

第一个公开版本在2010年2月发布,从此以后,Elasticsearch 已经成为了 Github 上最活跃的项目之一,他拥有超过300名 contributors(目前736名 contributors )。 一家公司已经开始围绕 Elasticsearch 提供商业服务,并开发新的特性,但是,Elasticsearch 将永远开源并对所有人可用。

据说,Shay 的妻子还在等着她的食谱搜索引擎…

1.4 ES和Slor

  • Solr在查询死数据时,速度比ES快。但是数据如果是改变的,Solr查询速度会降低很多,ES的查询速度没有变化。

  • Solr搭建集群依赖ZooKeeper来帮助管理,ES本身就支持集群的搭建,不需要第三方的介入。

  • Solr出现早,最开始Solr的社区很火爆,针对国内文档少;ES出现后,国内社区火爆程度 上升,ES的文档非常健全。

  • ES对云计算和大数据支持很好

1.5 倒排索引

拿到数据的过程分两步:(关键字:“好编程“,分词为”好“和”编程“)

  • query:根据输入的关键字,去分词库中检索内容;结果:1,2,3
  • fetch:根据在分词库中检索到的id,直接拉取指定数据;结果:“1:你好”,“2:编程”和“3:你好编程”

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

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

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

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

2、安装

2.1 安装docker-compose

Docker安装方法

2.2.1 安装方法1,使用pip

  • 安装pip需要先安装epel-release包

    1
    $ yum -y install -y epel-release
  • 安装pip

    1
    $ yum install -y python-pip
  • 检查python和pip版本

    1
    2
    $ python -V   # 3+
    $ pip -V # 20+
  • 若不满足上述条件

    • pip升级

      1
      $ pip install --upgrade pip -ihttp://pypi.douban.com/simple --trusted-host pypi.douban.com
    • 升级python2到python3

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      # 下载
      $ wget https://www.python.org/ftp/python/3.7.0/Python-3.7.0.tgz
      # 解压源码包
      $ tar -zxvf Python-3.7.0.tgz
      # 创建安装目录
      $ mkdir /usr/local/python3
      $ cd Python-3.7.0/
      # 安装到指定目录
      $ ./configure --prefix=/usr/local/python3
      # 编译
      $ make && make install
    • 设置软链接全局使用python3

      1
      2
      3
      4
      $ cd /usr/local/python3
      $ ln -s /usr/local/python3/bin/python3 /usr/local/bin/python3
      $ ln -s /usr/local/python3/bin/pip3 /usr/local/bin/pip3
      $ ln -s /usr/local/bin/pip3 /usr/bin/pip
    • 验证版本

      1
      2
      3
      4
      $ python3 -V
      Python 3.7.0
      $ pip -v
      pip 20.2.2 from /usr/local/python3/lib/python3.7/site-packages/pip (python 3.7)
    • 可以使用下述命令来查看软链接设置

      1
      $ ls -al /usr/bin | grep python
    • 升级 Python 之后,由于将默认的 python 指向了 python3,yum 不能正常使用,需要编辑 yum 的配置文件:

      1
      2
      3
      4
      $ vi /usr/bin/yum
      #!/usr/bin/python 改为 #!/usr/bin/python2.7
      $ vi /usr/libexec/urlgrabber-ext-down
      #!/usr/bin/python 改为 #!/usr/bin/python2.7
  • 指定安装源,安装docker-compose

    1
    $ pip install -i https://pypi.tuna.tsinghua.edu.cn/simple docker-compose
  • 查看docker-compose的版本

    1
    2
    $ docker-compose -v
    docker-compose version 1.24.0, build 0aa5906

2.1.2 安装方法2,离线安装(推荐)

Github发行版本,下载docker-compose-Linux-x86_64,推荐一个软件Motrix,加快下载速度,将下载文件命名为docker-compose

  • 上传到服务器并移动到/usr/local/bin/

    1
    $ mv docker-compose /usr/local/bin/
  • 添加可执行权限

    1
    $ chmod +x /usr/local/bin/docker-compose
  • 查看docker-compose版本

    1
    2
    $ docker-compose -v
    docker-compose version 1.26.2, build eefe0d31

2.2 安装ElasticSearch&Kibana

Docker镜像工厂,分别搜索“elasticsearch”和“kibana”,选取“社区镜像”作为来源,找到“library/elasticsearch”和“library/kibana”,版本同一。

Kibana是为Elasticsearch设计的开源分析和可视化平台。

  • 在指定文件夹下:

    1
    $ vi docker-compose.yml
  • 并复制下面内容到docker-compose.yml文件

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    version: "3.1"
    services:
    elasticsearch:
    image: daocloud.io/library/elasticsearch:6.5.4
    restart: always
    container_name: elasticsearch
    ports:
    - 9200:9200
    kibana:
    image: daocloud.io/library/kibana:6.5.4
    restart: always
    container_name: kibana
    ports:
    - 5601:5601
    environment:
    - elasticsearch_url=ip:9200 # 此处ip为自己对应主机地址
    depends_on:
    - elasticsearch
  • 运行

    1
    $ docker-compose up -d
  • 查看日志

    1
    $ docker-compose logs -f
  • 浏览器查看,成功

2.3 安装IK分词器

Es默认的分词器对中文的支持是不友好的,Github下载地址,版本还是要统一。

还是使用docker安装:

  • 查看es容器的CONTAINER ID,进入es容器内部:

    1
    2
    [root@localhost docker_elasticsearch]# docker exec -it <CONTAINER ID> bash
    [root@fddcec4fe9e7 elasticsearch]#
  • 进入bin目录,执行bin目录下的脚本文件:

    1
    $ cd bin
  • IK分词器对于es来说就是一个插件:

    1
    2
    3
    $ ./elasticsearch-plugin install 
    https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v6.5.4/
    elasticsearch-analysis-ik-6.5.4.zip

    由于在容器内安装IK分词器,如果把容器down掉,这个IK分词器就没了,重启就可以了

  • 记得重启es容器,分词器才会生效,重启es就可以了:

    1
    $ docker restart <CONTAINER ID>
  • 在Kibana中测试,使用GitHub推荐方法;在Dev Tool中:

    1
    2
    3
    4
    5
    POST _analyze
    {
    "analyzer": "ik_max_word",
    "text":"我是Java工程师.你呢?"
    }
  • 得到输出“

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    {
    "tokens" : [
    {
    "token" : "我",
    "start_offset" : 0,
    "end_offset" : 1,
    "type" : "CN_CHAR",
    "position" : 0
    },
    {
    "token" : "是",
    "start_offset" : 1,
    "end_offset" : 2,
    "type" : "CN_CHAR",
    "position" : 1
    },
    {
    "token" : "java",
    "start_offset" : 2,
    "end_offset" : 6,
    "type" : "ENGLISH",
    "position" : 2
    },
    {
    "token" : "工程师",
    "start_offset" : 6,
    "end_offset" : 9,
    "type" : "CN_WORD",
    "position" : 3
    },
    {
    "token" : "工程",
    "start_offset" : 6,
    "end_offset" : 8,
    "type" : "CN_WORD",
    "position" : 4
    },
    {
    "token" : "师",
    "start_offset" : 8,
    "end_offset" : 9,
    "type" : "CN_CHAR",
    "position" : 5
    },
    {
    "token" : "你",
    "start_offset" : 10,
    "end_offset" : 11,
    "type" : "CN_CHAR",
    "position" : 6
    },
    {
    "token" : "呢",
    "start_offset" : 11,
    "end_offset" : 12,
    "type" : "CN_CHAR",
    "position" : 7
    }
    ]
    }

评论