• Elasticsearch 搜索入门技术之一


    1,课程回顾
    2,本章重点

    什么是全文检索,常用全文检索框架的基本原理是什么
    es是什么,主要使用场景
    es分布式搜索引擎集群的搭建

    3,具体内容
    3.1 全文检索

    3.1.1 数据分类
    我们生活中的数据总体分为三种:结构化数据,非结构化数据,半结构化数据
    结构化数据:指具有固定格式或有限长度的数据,如数据库(mysql oracle …),元数据等。
    非结构化数据:指不定长或无固定格式的数据,如邮件,word文档等
    半结构化数据,如XML,HTML等
    非结构化数据又一种叫法叫全文数据。

    对结构化数据的搜索:如对数据库的搜索,用SQL语句。
    对元数据的搜索,如利用windows搜索对文件名,类型,修改时间进行搜索等。
    对非结构化数据的搜索:如利用windows的搜索也可以搜索文件内容,Linux下的grep命令,再如用Google和百度可以搜索大量内容数据。

    3.1.2 非结构化数据搜索方法

    顺序扫描:
    比如要找内容包含某一个字符串的文件,就是一个文档一个文档的看,对于每一个文档,从头看到尾,如果此文档包含此字符串,则此文档为我们要找的文件,接着看下一个文件,直到扫描完所有的文件。
    如利用windows的搜索也可以搜索文件内容,只是相当的慢。如果你有一个500G硬盘,如果想在上面找到一个内容包含某字符串的文件,不花他几个小时,怕是做不到。Linux下的grep命令也是这一种方式。大家可能觉得这种方法比较原始,但对于小数据量的文件,这种方法还是最直接,最方便的。但是对于大量的文件,这种方法就很慢了。

    全文检索( 倒排索引es的核心):将非结构化数据中的一部分信息提取出来,重新组织,使其变得有一定结构,然后对此有一定结构的数据进行搜索,从而达到搜索相对较快的目的。

    这部分从非结构化数据中提取出的然后重新组织的信息,我们称之索引。

    这种先建立索引,再对索引进行搜索的过程就叫全文检索(Full-text Search)。

      倒排索引源于实际应用中需要根据属性的值来查找记录。这种索引表中的每一项都包括一个属性值和具有该属性值的各记录的地址。由于不是由记录来确定属性值,而是由属性值来确定记录的位置,因而称为倒排索引(inverted index)。(实际参考es中文档)
    
    • 1

    3.2 什么是 Elasticsearch?
    官网:
    https://www.elastic.co/cn/
    https://www.elastic.co/cn/what-is/elasticsearch

     Elasticsearch 是一个分布式的开源搜索和分析引擎,适用于所有类型的数据,包括文本、数字、地理空间、结构化和非结构化数据。Elasticsearch 在 Apache Lucene 的基础上开发而成,由 Elasticsearch N.V.(即现在的 Elastic)于 2010 年首次发布。Elasticsearch 以其简单的 REST 风格 API、分布式特性、速度和可扩展性而闻名,是 Elastic Stack 的核心组件;Elastic Stack 是适用于数据采集、充实、存储、分析和可视化的一组开源工具。人们通常将 Elastic Stack 称为 ELK Stack(代指 Elasticsearch、Logstash 和 Kibana),目前 Elastic Stack 包括一系列丰富的轻量型数据采集代理,这些代理统称为 Beats,可用来向 Elasticsearch 发送数据。
    
    • 1

    3.3 用途:
    Elasticsearch 在速度和可扩展性方面都表现出色,而且还能够索引多种类型的内容,这意味着其可用于多种用例:
    应用程序搜索
    网站搜索
    企业搜索
    日志处理和分析
    基础设施指标和容器监测
    应用程序性能监测
    地理空间数据分析和可视化
    安全分析
    业务分析
    3.4 基本概念:
    https://www.elastic.co/guide/en/elasticsearch/reference/6.0/_basic_concepts.html
    近实时 near realtime(nrt)
    Elasticsearch是一个几乎实时的搜索平台。意思是,从索引一个文档到这个文档可被搜索只需要一点点的延迟,这个时间一般为毫秒级。
    cluster 集群
    群集是一个或多个节点(服务器)的集合, 这些节点共同保存整个数据,并在所有节点上提供联合索引和搜索功能。一个集群由一个唯一集群ID确定,并指定一个集群名(默认为“elasticsearch”)。该集群名非常重要,因为节点可以通过这个集群名加入群集,一个节点只能是群集的一部分。
    node 节点
    节点是单个服务器实例,它是集群的一部分,可以存储数据,并参与群集的索引和搜索功能。就像一个集群,节点的名称默认为一个随机的通用唯一标识符(UUID),确定在启动时分配给该节点。如果不希望默认,可以定义任何节点名。
    index 索引
    索引是具有相似特性的文档集合。例如,可以为客户数据提供索引,为产品目录建立另一个索引,以及为订单数据建立另一个索引。索引由名称(必须全部为小写)标识,该名称用于在对其中的文档执行索引、搜索、更新和删除操作时引用索引。就像关系数据库中的“数据库”。它有一个定义多种类型的映射。索引是逻辑名称空间,映射到一个或多个主分片,并且可以有零个或多个副本分片。
    document 文档
    文档是可以被索引的信息的基本单位。也是全文搜索中被搜索的对象,可以对应一个网页,一篇txt文档或者一个商品。 相当于关系型数据库中的表中的一行记录。例如,您可以为单个客户提供一个文档,单个产品提供另一个文档,以及单个订单提供另一个文档。es本文件的表示形式为JSON(JavaScript Object Notation)格式,这是一种非常普遍的互联网数据交换格式。似于关系数据库中的一行。
    文档和索引的关系原理讲解:
    文档(txt,doc,docx…):
    1, 人生永远不可能复制,要珍惜每一份缘分 a.txt
    2, 珍惜人生的每次相遇,就是缘分 b.txt
    3, 人生中存在很多相遇和离别,都是缘分中的注定 c.txt
    提取关键字(https://www.elastic.co/guide/cn/elasticsearch/guide/current/stopwords.html使用中文分词技术 排除停用词https://wenku.baidu.com/view/8927eede80eb6294dd886c46.html)
    1, 人生 永远 复制 珍惜 缘分
    2, 珍惜 人生 相遇 缘分
    3, 人生 存在 相遇 离别 缘分 注定
    创建索引
    人生 -> 1,2,3
    永远 -> 1
    复制 1
    珍惜 1,2
    缘分 1,3

         。。。。
    
    倒排索引又叫反向索引(右下图)以字或词为文档中出现的位置情况。
      
        shards   replicas 碎片和副本 
    shards:分片数,一个索引分几个片存储,多个分片可以提升读写速度。索引可以存储大量的数据,这些数据可能(分片解决)超过单个节点的硬件限制。例如,十亿个文件占用磁盘空间1TB的单指标可能不适合对单个节点的磁盘或可能太慢服务仅从单个节点的搜索请求。
    replicas:
       副本数量,分多个副本存储索引,好处是防止一个节点挂掉,数据丢失(防止单点故障)。
       它在碎片/节点出现故障时提供高可用性(提高可用性)。
       它允许您扩展搜索量/吞吐量,因为可以在所有副本上并行执行搜索(提高搜索速度)。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    3.5 下载配置,搭建集群:

    https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.4.0.tar.gz
    或者:
    wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.4.0.tar.gz
    集群规划:
    es1 192.168.23.71
    es2 192.168.23.72
    es3 192.168.23.73
    解压:
    tar -zxvf elasticsearch-6.4.0.tar.gz -C /usr/
    修改名称
    mv /usr/elasticsearch-6.4.0/ /usr/elasticsearch/
    配置环境变量:
    vim /etc/porfile
    添加配置
    export ES_HOME=/usr/elasticsearch
    修改配置:
    PATH=$ES_HOME/bin
    让配置生效:
    source /etc/profile
    es配置:
    1,在/usr/elasticsearch创建数据data,后面配置用到:
    mkdir /usr/elasticsearch/data
    2,在/etc/sysctl.conf最后添加(解决:max virtual memory areas vm.max_map_count [65530] is too low错误,vm.max_map_count单个JVM能开启的最大线程数)
    vim /etc/sysctl.conf
    vm.max_map_count=655360
    让文件生效:
    sysctl -p
    3,在/etc/security/limits.conf最后添加:(不配置缺省值:1024,解除 Linux 系统的最大进程数和最大文件打开数限制:* 代表针对所有用户 ues表示启动用户名称,与下面创建用户一致 noproc 是代表最大进程数 nofile 是代表最大文件打开数 )
    vim /etc/security/limits.conf
    ues soft nofile 65536
    ues hard nofile 131072
    ues soft nproc 4096
    ues hard nproc 4096
    4,修改节点的配置文件jvm.options
    vim /usr/elasticsearch/config/jvm.options (22行)
    -Xms512m
    -Xmx512m
    原则:
    最小堆的大小和最大堆的大小应该相等。
    Elasticsearch可获得越多的堆,并且内存也可以使用更多的缓存。但是需要注意,分配了太多的堆给你的项目,将会导致有长时间的垃圾搜集停留。
    设置最大堆的值不能超过你物理内存的50%,要确保有足够多的物理内存来保证内核文件缓存。

    5,修改配置文件 ElasticSearch.yml
    vim /usr/elasticsearch/config/elasticsearch.yml
    # ======================== Elasticsearch Configuration =========================

    NOTE: Elasticsearch comes with reasonable defaults for most settings.

    Before you set out to tweak and tune the configuration, make sure you

    understand what are you trying to accomplish and the consequences.

    The primary way of configuring a node is via this file. This template lists

    the most important settings you may want to configure for a production cluster.

    Please consult the documentation for further information on configuration options:

    https://www.elastic.co/guide/en/elasticsearch/reference/index.html

    ---------------------------------- Cluster -----------------------------------

    Use a descriptive name for your cluster:

    17行

    cluster.name: my-app

    ------------------------------------ Node ------------------------------------

    Use a descriptive name for the node:

    #23行
    node.name: node-1

    Add custom attributes to the node:

    #node.attr.rack: r1

    ----------------------------------- Paths ------------------------------------

    Path to directory where to store the data (separate multiple locations by comma):

    33

    path.data: /usr/elasticsearch/data

    Path to log files:

    37

    path.logs: /usr/elasticsearch/logs

    ----------------------------------- Memory -----------------------------------

    Lock the memory on startup:

    #锁定物理内存地址,防止elasticsearch内存被交换出去,也就是避免es使用swap交换分区

    43 44

    bootstrap.memory_lock: false
    #是否支持过滤掉系统调用,Elasticsearch安装各种各样的系统调用过滤依赖于操作系统(如:Linux上的seccomp)。如果成功安装与启用了系统调用过滤,将能够防御一些对Elasticsearch调用的攻击行为。要想通过此检查,你必须根据日志来修复任何阻止系统调用过滤的系统错误,或者通过配置bootstrap.system_call_filter为false来禁用系统调用过滤然后你自己做风控。
    bootstrap.system_call_filter: false

    Make sure that the heap size is set to about half the memory available

    on the system and that the owner of the process is allowed to use this

    limit.

    Elasticsearch performs poorly when the system is swapping the memory.

    ---------------------------------- Network -----------------------------------

    Set the bind address to a specific IP (IPv4 or IPv6):

    #56
    network.host: 192.168.23.30

    Set a custom port for HTTP:

    #60
    http.port: 9200

    For more information, consult the network module documentation.

    --------------------------------- Discovery ----------------------------------

    Pass an initial list of hosts to perform discovery when new node is started:

    The default list of hosts is [“127.0.0.1”, “[::1]”]

    #当启动新节点时,通过这个ip列表进行节点发现,组建集群 69
    discovery.zen.ping.unicast.hosts: [“cr1”, “cr2”,“cr3”]

    Prevent the “split brain” by configuring the majority of nodes (total number of master-eligible nodes / 2 + 1):

    #通过配置这个参数来防止集群脑裂现象 (集群总节点数量/2)+1 73
    discovery.zen.minimum_master_nodes: 2

    For more information, consult the zen discovery module documentation.

    ---------------------------------- Gateway -----------------------------------

    Block initial recovery after a full cluster restart until N nodes are started:

    #gateway.recover_after_nodes: 3

    For more information, consult the gateway module documentation.

    ---------------------------------- Various -----------------------------------

    Require explicit names when deleting indices:

    #action.destructive_requires_name: true

    因为配置文件中配置了集群节点的主机名称,所以在/etc/hosts添加下面配置:
    vim /etc/hosts
    192.168.23.21 es1
    192.168.23.22 es2
    192.168.23.23 es3
    6,由于es启动不能直接使用root用户
    创建用户:
    useradd ues;
    赋权:
    chown -R ues:ues /usr/elasticsearch
    查看:
    ll /usr/ |grep elasticsearch
    ll /usr
    ll /usr/elasticsearch
    复习免密:
    ssh-keygen -t rsa 三次回车
    ssh-copy-id es2 yes 输入密码:tiger
    ssh-copy-id es3 yes 输入密码:tiger
    7,发送配置好的es到其他节点上:
    cd /usr/
    直接使用scp命令, 之前配置过ssh免密登录
    scp -r /usr/elasticsearch/ cr2:/usr/
    scp -r /usr/elasticsearch/ cr3:/usr/
    8,在其他节点修改配置及创建用户并赋权(当前集群在cr2和cr3上操作)
    发送hosts:
    scp /etc/hosts es2:/etc/
    scp /etc/hosts es3:/etc/
    发送环境变量
    scp /etc/profile cr2:/etc/
    scp /etc/profile cr3:/etc/
    发送/etc/sysctl.conf
    scp /etc/sysctl.conf cr2:/etc/
    scp /etc/sysctl.conf cr3:/etc/
    发送 /etc/security/limits.conf
    scp /etc/security/limits.conf cr2:/etc/security/
    scp /etc/security/limits.conf cr3:/etc/security/
    在cr2和cr3上操作(或者在all session):

    让文件生效:
    sysctl -p
    让环境变量生效:
    source /etc/profile

                vim /usr/elasticsearch/config/elasticsearch.yml
               分别修改23和56行
                node.name: node-2    //cr3上为3
                network.host: 192.168.23.31  //cr3上为32
                 创建用户:
    	 useradd ues;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    赋权:
    chown -R ues:ues /usr/elasticsearch
    查看:
    ll /usr/ |grep elasticsearch

    启动:
    切换到ues用户
    su ues;
    在to All Sessions中启动:
    elasticsearch -d;
    查看结果:
    curl 192.168.23.31:9200

    三个IP都可以测试链接
    还可以测试挂掉节点,再启动,注意,启动时速度不会快,可以看着日志
    3.5 常用集群命令
    查看集群支持命令:
    curl 192.168.23.30:9200/_cat
    查看集群是否健康
    curl 192.168.23.30:9200/_cat/health
    curl 192.168.23.30:9200/_cat/health?v
    绿色表示一切正常, 黄色表示所有的数据可用但是部分副本还没有分配,红色表示不可用
    查看master:
    curl 192.168.23.30:9200/_cat/master?v
    命令支持help:
    curl 192.168.23.30:9200/_cat/master?help
    查看所有索引:
    curl 192.168.23.30:9200/_cat/indices

    4,知识点总结
    5,本章面试题

  • 相关阅读:
    备战 2023 春招,P7 大咖手打 26 大后端面试专题神技,1500 题解析助力
    Excel实用函数Vlookup,多sheet之间多字段的匹配取值
    【scikit-learn基础】--『监督学习』之 LASSO回归
    java集合
    springboot banner
    死锁的常见例子及 Python 模拟
    【Web前端基础进阶学习】HTML详解(下篇)
    白盒测试的各种方法
    探究-ping指令的使用
    python之*用法
  • 原文地址:https://blog.csdn.net/zhangchen124/article/details/126249054