zoukankan      html  css  js  c++  java
  • ElasticSearch(一)

    1. 全文检索技术简介

    什么是搜索?

    搜索,就是在任何场景下,找寻你想要的信息,这个时候,会输入一段你要搜索的关键字,然后就期望找到这个关键字相关的有些信息

    如何实现搜索?

    OA系统,比如:通过名字搜索员工等等
    mysql :
    select * from employee e where e.name like “%李雷%”;
    select * from employee e where e.comment like “%好%”;
    问题:

    1. 性能

    2. 比如搜索“优秀工”,mysql 无法支持

    全文检索

    全文数据库是全文检索系统的主要构成部分。所谓全文数据库是将一个完整的信息源的全部内容转化为计算机可以识别、处理的信息单元而形成的数据集合

    全文数据库不仅存储了信息,而且还有对全文数据进行词、字、段落等更深层次的编辑、加工的功能

    所有全文数据库无一不是海量信息数据库

    倒排索引

    传统数据库存储:

    id 描述
    1 优秀员工
    2 销售冠军
    3 优秀团队领导
    4 优秀项目

    倒排索引处理步骤:
    1、切词:
    优秀员工 —— 优秀 员工
    销售冠军 —— 销售 冠军
    优秀团队领导 —— 优秀 团队 领导
    优秀项目 —— 优秀 项目

    2、建立倒排索引:
    关键词 id

    关键词 id
    优秀 1,3,4
    员工 1
    销售 2
    团队 3
    。。。 。。。
    Lucene

    全文检索引擎
    Lucene 能够为文本类型的数据建立索引,所以你只要能把你要索引的数据格式转化的文本的,Lucene 就能对你的文档进行索引和搜索。比如你要对一些 HTML 文档,PDF 文档进行索引的话你就首先需要把 HTML 文档和 PDF 文档转化成文本格式的,然后将转化后的内容交给 Lucene 进行索引,然后把创建好的索引文件保存到磁盘或者内存中,最后根据用户输入的查询条件在索引文件上进行查询。不指定要索引的文档的格式也使 Lucene 能够几乎适用于所有的搜索应用程序

    换句话说,使用 Lucene 可以轻松完成上述步骤

    Elasticsearch

    Elasticsearch 是一个高度可伸缩的开源全文搜索和分析引擎。它允许你以近实时的方式快速存储、搜索和分析大量的数据。它通常被用作基础的技术来赋予应用程序复杂的搜索特性和需求

    Elasticsearch ,是基于 lucene 开发的,隐藏复杂性,提供简单易用的 restful api 接口、java api 接口(还有其他语言的 api 接口)

    Elasticsearch 特点
    1. 可以作为一个大型分布式集群(数百台服务器)技术,处理 PB 级数据,服务大公司;也可以运行在单机上,服务小公司

    2. Elasticsearch 不是什么新技术,主要是将全文检索、数据分析以及分布式技术,合并在了一起,才形成了独一无二的 ES

    3. 对用户而言,是开箱即用的,非常简单,作为中小型的应用,直接3分钟部署一下 ES ,就可以作为生产环境的系统来使用了,数据量不大,操作不是太复杂

    4. 数据库的功能面对很多领域是不够用的(事务,还有各种联机事务型的操作);特殊的功能,比如全文检索,同义词处理,相关度排名,复杂数据分析,海量数据的近实时处理; Elasticsearch 作为传统数据库的一个补充,提供了数据库所不能提供的很多功能

    Elasticsearch核心概念
    1. 近实时
      近实时,两个意思,从写入数据到数据可以被搜索到有一个小延迟(大概1秒);基于es执行搜索和分析可以达到秒级

    2. Cluster(集群)
      集群包含多个节点,每个节点属于哪个集群是通过一个配置(集群名称,默认是elasticsearch)来决定的,对于中小型应用来说,刚开始一个集群就一个节点很正常

    3. Node(节点)
      集群中的一个节点,节点也有一个名称(默认是随机分配的),节点名称很重要(在执行运维管理操作的时候),默认节点会去加入一个名称为“elasticsearch”的集群,如果直接启动一堆节点,那么它们会自动组成一个elasticsearch集群,当然一个节点也可以组成一个elasticsearch集群

    4. Index(索引-数据库)
      索引包含一堆有相似结构的文档数据,比如可以有一个客户索引,商品分类索引,订单索引,索引有一个名称。一个index包含很多document,一个index就代表了一类类似的或者相同的document。比如说建立一个product index,商品索引,里面可能就存放了所有的商品数据,所有的商品document

    5. Type(类型-表)

    每个索引里都可以有一个或多个type,type是index中的一个逻辑数据分类,一个type下的document,都有相同的field,比如博客系统,有一个索引,可以定义用户数据type,博客数据type,评论数据type。

    商品index,里面存放了所有的商品数据,商品document
    但是商品分很多种类,每个种类的document的field可能不太一样,比如说电器商品,可能还包含一些诸如售后时间范围这样的特殊field;生鲜商品,还包含一些诸如生鲜保质期之类的特殊field

    type,日化商品type,电器商品type,生鲜商品type
    日化商品type:product_id,product_name,product_desc,category_id,category_name

    电器商品type:product_id,product_name,product_desc,category_id,category_name,service_period

    生鲜商品type:product_id,product_name,product_desc,category_id,category_name,eat_period

    每一个type里面,都会包含一堆document

    {
    "product_id": "1",
    "product_name": "长虹电视机",
    "product_desc": "4k高清",
    "category_id": "3",
    "category_name": "电器",
    "service_period": "1年"
    }
    {
    "product_id": "2",
    "product_name": "基围虾",
    "product_desc": "纯天然,冰岛产",
    "category_id": "4",
    "category_name": "生鲜",
    "eat_period": "7天"
    }
    1. Document(文档-行)
      文档是es中的最小数据单元,一个document可以是一条客户数据,一条商品分类数据,一条订单数据,通常用JSON数据结构表示,每个index下的type中,都可以去存储多个document

    2. Field(字段-列)
      Field是Elasticsearch的最小单位。一个document里面有多个field,每个field就是一个数据字段

    product document
    {
    "product_id": "1",
    "product_name": "高露洁牙膏",
    "product_desc": "高效美白",
    "category_id": "2",
    "category_name": "日化用品"
    }
    1. mapping(映射-约束)
      数据如何存放到索引对象上,需要有一个映射配置,包括:数据类型、是否存储、是否分词等。
      这样就创建了一个名为blog的Index。Type不用单独创建,在创建Mapping 时指定就可以。Mapping用来定义Document中每个字段的类型,即所使用的 analyzer、是否索引等属性,非常关键等。创建Mapping 的代码示例如下:

    client.indices.putMapping({
    index : 'blog',
    type : 'article',
    body : {
    article: {
    properties: {
    id: {
    type: 'string',
    analyzer: 'ik',
    store: 'yes',
    },
    title: {
    type: 'string',
    analyzer: 'ik',
    store: 'no',
    },
    content: {
    type: 'string',
    analyzer: 'ik',
    store: 'yes',
    }
    }
    }
    }
    });
    elasticsearch与数据库的类比
    关系型数据库(比如Mysql) 非关系型数据库(Elasticsearch)
    数据库Databas 索引Index
    表Table 类型Type
    数据行Row 文档Document
    数据列Column 字段Field
    约束 Schema 映射Mapping
    ES存入数据和搜索数据机制

    1)索引对象(index):存储数据的表结构 ,任何搜索数据,存放在索引对象上 。
    2)映射(mapping):数据如何存放到索引对象上,需要有一个映射配置, 包括:数据类型、是否存储、是否分词等。
    3)文档(document):一条数据记录,存在索引对象上 。
    4)文档类型(type):一个索引对象,存放多种类型数据,数据用文档类型进行标识

    2. 安装

    单节点安装教程

    java8
    1)下载es安装包
    curl -L -O https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.1.1.tar.gz

    2)浏览器下载上传到虚拟机安装并创建和修改文件

    1. 解压elasticsearch-6.1.1.tar.gz到/opt/module目录下

    2. 在/opt/module/elasticsearch-6.1.1路径下创建data和logs文件夹
      mkdir data
      mkdir logs

    3. 修改配置文件/opt/module/elasticsearch-6.1.1/config/elasticsearch.yml
      vi elasticsearch.yml

    # ----------- Cluster -----------
    cluster.name: my-application
    # ----------- Node -----------
    node.name: node-121
    # ----------- Paths -----------
    path.data: /opt/module/elasticsearch-6.1.1/data
    path.logs: /opt/module/elasticsearch-6.1.1/logs
    # ----------- Memory -----------
    bootstrap.memory_lock: false
    bootstrap.system_call_filter: false
    # ----------- Network -----------
    network.host: 192.168.116.121
    # ----------- Discovery -----------
    discovery.zen.ping.unicast.hosts: ["hsiehchou121"]

    (1)cluster.name
    如果要配置集群需要两个节点上的elasticsearch配置的cluster.name相同,都启动可以自动组成集群,这里如果不改cluster.name则默认是cluster.name=my-application,
    (2)nodename随意取但是集群内的各节点不能相同
    (3)修改后的每行前面不能有空格,修改后的“:”后面必须有一个空格

    3)配置linux系统环境

    1. 编辑limits.conf 添加类似如下内容
      sudo vi /etc/security/limits.conf
      添加如下内容:

      • soft nofile 65536

      • hard nofile 131072

      • soft nproc 4096

      • hard nproc 4096

    2. 进入limits.d目录下修改配置文件。
      sudo vi /etc/security/limits.d/20-nproc.conf
      修改如下内容:

      • soft nproc 4096(修改为此参数,6版本的默认就是4096)

    3. 修改配置sysctl.conf
      sudo vi /etc/sysctl.conf
      添加下面配置:
      vm.max_map_count=655360
      并执行命令:
      sudo sysctl -p
      然后,重新启动elasticsearch,即可启动成功

    4. 启动(非root账户下启动)
      bin/elasticsearch
      注意:can not run elasticsearch as root

    5. 测试elasticsearch
      curl http://hsiehchou121:9200
      curl -XGET ‘hsiehchou121:9200/_cat/health?v&pretty’

    注:Linux中新建账户elasticsearch
    1、Linux中新建用户命令:
    举例:我们创建一个名字叫 elasticsearch的用户
    使用root用户操作如下命令:
    useradd elasticsearch———–创建用户
    passwd elasticsearch———–为用户设置密码
    vim /etc/sudoers ———–为用户赋予sudo权限
    添加 elasticsearch ALL=(ALL) ALL

    2、修改文件夹及其子文件夹属主命令
    chown -R elasticsearch ./elasticsearch-6.1.1/
    修改后即可以使用elasticsearch操作此文件夹内容

    4)安装elasticsearch-head.crx插件
    页面连接按钮前面有个输入框输入:http://192.168.116.121:9200/

    5)命令行验证
    REST API
    curl -XGET ‘localhost:9200/_cat/health?v&pretty’
    epoch timestamp cluster status node.total node.data shards pri relo init unassign pending_tasks max_task_wait_time active_shards_percent
    1550960314 06:18:34 elasticsearch green 1 1 0 0 0 0 0 0 - 100.0%

    看到status是 green,证明启动成功

    • Green - 一切运行正常(集群功能齐全)

    • Yellow - 所有数据是可以获取的,但是一些复制品还没有被分配(集群功能齐全)

    • Red - 一些数据因为一些原因获取不到(集群部分功能不可用)

    多节点集群安装教程

    1)分发Elasticsearch安装包至hsiehchou122、hsiehchou123、hsiehchou124
    xsync elasticsearch-6.1.1/
    或者scp -r elasticsearch-6.1.1/ hsiehchou122:/opt/module/

    2)修改hsiehchou121配置信息
    [elasticsearch@hsiehchou121 config]$ vi elasticsearch.yml
    添加如下信息:
    node.master: true
    node.data: true

    3)修改hsiehchou122配置信息

    1. 修改Elasticsearch配置信息
      [elasticsearch@hsiehchou122 config]$ vi elasticsearch.yml
      node.name: node-122
      node.master: false
      node.data: true
      network.host: 192.168.116.122

    2. 修改Linux相关配置信息(同hsiehchou121 )

    3. 修改hsiehchou122、hsiehchou1223、hsiehchou124 配置信息

    4. 因为是scp的,所以一些跟hsiehchou121一样的配置就不需要修改了

    5)分别启动三台节点的Elasticsearch
    6)使用插件查看集群状态

    集群安装(详细增加或者修改内容)

    vi /opt/module/elasticsearch-6.1.1/config/elasticsearch.yml
    hsiehchou121增加
    node.master: true
    node.data: true

    hsiehchou121修改
    discovery.zen.ping.unicast.hosts: [“hsiehchou121”,”hsiehchou122”,”hsiehchou123”,”hsiehchou124”]

    hsiehchou122增加
    node.master: false
    node.data: true

    hsiehchou122修改
    node.name: node-122
    network.host: 192.168.116.122
    discovery.zen.ping.unicast.hosts: [“hsiehchou121”,”hsiehchou122”,”hsiehchou123”,”hsiehchou124”]

    hsiehchou123增加
    node.master: false
    node.data: true

    hsiehchou123修改
    node.name: node-123
    network.host: 192.168.116.123
    discovery.zen.ping.unicast.hosts: [“hsiehchou121”,”hsiehchou122”,”hsiehchou123”,”hsiehchou124”]

    hsiehchou124增加
    node.master: false
    node.data: true

    hsiehchou124修改
    node.name: node-124
    network.host: 192.168.116.124
    discovery.zen.ping.unicast.hosts: [“hsiehchou121”,”hsiehchou122”,”hsiehchou123”,”hsiehchou124”]

    说明
    cluster.name :如果要配置集群需要两个节点上的 elasticsearch 配置的 cluster.name :相同,都启动可以自动组成集群,这里如果不改 cluster.name :则默认是 cluster.name=my-application
    nodename :随意取但是集群内的各节点不能相同

    启动es,报错:
    [1]: max file descriptors [4096] for elasticsearch process is too low, increase to at least [65536]
    [2]: max number of threads [1024] for user [hduser] is too low, increase to at least [4096]
    [3]: max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
    [4]: system call filters failed to install; check the logs and fix your configuration or disable system

    配置 linux 系统环境:
    切换到 root 用户,编辑 limits.conf 添加类似如下内容
    vi /etc/security/limits.conf

    添加如下内容:

    * soft nofile 65536
    * hard nofile 131072
    * soft nproc 4096
    * hard nproc 4096

    进入 limits.d 目录下修改配置jian

    vi /etc/security/limits.d/20-nproc.conf
    把 * soft nproc 1024 改成4096
    es6版本的我没有要改,默认就是4096

    修改配置 sysctl.conf
    vi /etc/sysctl.conf
    添加:
    vm.max_map_count=655360
    执行:
    sysctl -p

    重新登录elasticsearch用户,重新启动es
    如果还有报错,则需重启虚拟机

    查看集群状态命令:
    curl -XGET ‘your ip:9200/_cat/health?v&pretty’

    查看所有数据命令:

    [elasticsearch@hsiehchou121 config]$ curl -XGET '192.168.116.121:9200/blog/_search?pretty' -H 'Content-Type: application/json' -d'
    > {
    > "query": { "match_all": {} }
    > }
    > '
    Elasticsearch head插件安装

    node js下载插件:https://github.com/mobz/elasticsearch-head
    nodejs官网下载安装包:https://nodejs.org/dist/
    node-v6.9.2-linux-x64.tar.xz
    拷贝
    安装nodejs:
    解压
    配置环境变量:

    export NODE_HOME=/usr/local/node-v6.9.2-linux-x64
    export PATH=$PATH:$NODE_HOME/bin

    查看node和npm版本:
    node -v
    v6.9.2

    npm -v
    3.10.9

    解压head插件到/opt/module目录下:
    unzip elasticsearch-head-master.zip

    查看当前head插件目录下有无node_modules/grunt目录:
    没有的话,执行下面命令创建:

    npm install grunt --save --registry=https://registry.npm.taobao.org

    安装head插件:

    npm install -g cnpm --registry=https://registry.npm.taobao.org

    安装grunt:

    npm install -g grunt-cli --registry=https://registry.npm.taobao.org

    编辑Gruntfile.js
    vim Gruntfile.js

    文件93行添加

    hostname:0.0.0.0',

    检查head根目录下是否存在base文件夹
    没有的话,将 _site下的base文件夹及其内容复制到head根目录下
    mkdir base
    cp base/* ../base/

    启动grunt server:
    [root@hsiehchou121 elasticsearch-head-master]# grunt server -d

    如果提示grunt的模块没有安装:
    Local Npm module “grunt-contrib-clean” not found. Is it installed?
    Local Npm module “grunt-contrib-concat” not found. Is it installed?
    Local Npm module “grunt-contrib-watch” not found. Is it installed?
    Local Npm module “grunt-contrib-connect” not found. Is it installed?
    Local Npm module “grunt-contrib-copy” not found. Is it installed?
    Local Npm module “grunt-contrib-jasmine” not found. Is it installed?

    执行以下命令:
    npm install grunt-contrib-clean -registry=https://registry.npm.taobao.org
    npm install grunt-contrib-concat -registry=https://registry.npm.taobao.org
    npm install grunt-contrib-watch -registry=https://registry.npm.taobao.org
    npm install grunt-contrib-connect -registry=https://registry.npm.taobao.org
    npm install grunt-contrib-copy -registry=https://registry.npm.taobao.org
    npm install grunt-contrib-jasmine -registry=https://registry.npm.taobao.org

    最后一个模块可能安装不成功,但是不影响使用

    浏览器访问head插件:
    http://192.168.116.121:9100

  • 相关阅读:
    Leetcode Unique Binary Search Trees
    Leetcode Decode Ways
    Leetcode Range Sum Query 2D
    Leetcode Range Sum Query
    Leetcode Swap Nodes in Pairs
    Leetcode Rotate Image
    Leetcode Game of Life
    Leetcode Set Matrix Zeroes
    Leetcode Linked List Cycle II
    CF1321A
  • 原文地址:https://www.cnblogs.com/hsiehchou/p/10584766.html
Copyright © 2011-2022 走看看