• Elasticsearch(ES)简介


    1、为什么要使用搜索框架?

    2、Lucene的介绍

    3、Lucene和ES的区别?

    4、ES的安装


    为什么要使用ES或者Lucene?

      之前我们接触的都是模糊查询,,但模糊查询不够准确,有很大的局限性!

      比如:我爱Java          在模糊查询中:%我爱Java%

      但正常情况下我们网页上的搜索:我爱.....;......Java......;......爱Java......;这样的词条的搜索。

      为此我们有了 Lucene搜索框架。

    1、Lucene(Apache公司的,Lucene使用的Java语言)

      Lucene是一个开源的搜索框架,

      Lucene core:核心包(提供了很多的搜索引擎和搜索方法)

      Solr:借助于Lucene core包提供的搜索方法构建的一个高性能的搜索服务器(使用了xml文件类型和http协议)

        并支持json数据格式提供了py和ruby语言的API

      PYLucene:Python语言的Lucene

    2、ES三大核心:

      Index:相当于关系型数据库

      Type:相当于关系型数据库中的表

      Document:相当于关系型数据库中的表数据

    说明:

      搜索流程:当服务器端要查询数据时,不会进入数据库中查询,而是进入ES服务器中,先根据Index索引找到对应的库,再根据Type找到对应的表,最后根据Document拿到表数据,一切都是在内存中做计算,内存中的数据则来自于ES服务器中的搜索引擎库中,搜索引擎库中的数据则来自于数据库中。

      搜索引擎库:ES中的搜索引擎库类似于数据库,ES服务器第一次搭建完成后(第一次启动),搜索引擎库中没有数据,需要把数据库中的数据导入到搜索引擎库中(需要进行搜索的数据才会导入进来),ES一旦检测到搜索引擎库中有数据,会把这些数据直接加载进内存中。  

        在ES中自带的有监听机制,监听搜索引擎库中的数据是否有变化,一旦发生变化,需要把搜索引擎库中的数据重新覆盖进内存中。

        ES服务器的缺陷:一旦ES服务器重启,内存就会被释放,ES中的数据就会丢失,所以把需要搜索的数据持久化但硬盘中的搜索引擎库中,当ES开始启动的时候,会把硬盘中的持久化数据加载进内存中,所有的一切数据都是在内存中做计算。

    3、ES是基于Lucene开发的,但是Lucene和ES都是搜索引擎框架

      什么时候使用ES或者说什么时候使用Lucene呢?

      即ES和Lucene的区别: 

        Lucene只是一个搜索架构,不能直接使用,如果需要使用Lucene则需要自己添加代码来实现搜索模块,也就是说必须根据公司的业务逻辑来进行编码搜索,

        ES已经把这些代码全部实现了(在Lucene基础上实现的),可以直接使用,不再需要添加任何和架构有关的代码。

    4、在Linux中配置ES

      (1)先配置jdk

      (2)从官网下载ES安装包

      (3)解压ES的压缩包   tar -zxvf XXXX(仍然是放在/home/apps/下)

      以下配置全部使用root用户,否则配置可能不生效

      (4)vi /etc/security/limits.conf

        配置某个用户/某些用户对软件的内存和硬盘使用权限,

        将下列配置添加进文件内部

        * soft nproc 655350
        * soft nofile 655350
        * hard nproc 655350
        * hard nofile 655350

      (5)最大线程数(ES一般情况是以集群启动的,所以目前的用户无法满足ES所要创建的线程,所以需要加线程数)

        这里只是配置系统可容纳最大线程数,默认系统都有自动保护,不会开启很大的线程数,需要手动修改

        vi /etc/sysctl.conf

        在最后一行添加: vm.max_map_count = 262144

      (6)配置用户最大的线程数:

        vi /etc/security/limits.d/90-nproc.conf

          将其中的1024 改为 4096

      (7)是修改永久生效

        sysctl -p

      (8)创建用户,因为不能直接使用root去启动es,权限太大

        用户名:   useradd  esuser

        密码:    passwd esuser

        授权:     chown  -R esuser /home/apps/elasticsearch

      (9)使用新创建的用户去启动es

        su esuser

        进入bin目录下: ./elasticsearch

      (10)检测是否启动成功:

        浏览器:使用浏览器访问本机服务器的IP+端口号(9200)    

        {
          "name" : "node-1",
          "cluster_name" : "my-cluster",
          "cluster_uuid" : "UmoHkEZzReGQMrrLShhDIQ",
          "version" : {
          "number" : "6.4.0",
          "build_flavor" : "default",
          "build_type" : "tar",
          "build_hash" : "595516e",
          "build_date" : "2018-08-17T23:18:47.308994Z",
          "build_snapshot" : false,
          "lucene_version" : "7.4.0",
          "minimum_wire_compatibility_version" : "5.6.0",
          "minimum_index_compatibility_version" : "5.0.0"
        },
          "tagline" : "You Know, for Search"
        }

     

    在配置中遇到的问题: 

    1.ES为了自我保护,不让使用root用户启动,因为root用户权限过大,容易修改ES自己配置
      创建新的用户并且授权
      useradd esuser
      passwd esuser ---> 123456
      授权:
      chown -R esuser /home/apps/elasticsearch


    2.因为ES需要消耗非常大的线程数量和内存以及硬盘存储空间:

      报错及解决:
      [1]: max file descriptors [4096] for elasticsearch process is too low, increase to at least [65536]
      [1]:当前启动用户无法对linux系统调动很多的硬盘以及内存存储空间,所以需要自行修改!
        vi /etc/security/limits.conf
      [2]: max number of threads [1024] for user [esuser] is too low, increase to at least [4096]
      [2]:当前启动的用户太low了,无法调动很多的线程(默认只能调动1024)
        vi /etc/secrity/limits.d/90-nproc.conf
      [3]: max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
      [3]:需要配置vi /etc/sysctl.conf文件,加大系统默认的总线程数


    3.使用创建出新用户启动没有问题,但是当使用root用户启动一次后,再使用新创建的用户启动就有问题
      新创建的用户无法使用root用户所创建出的文件
      无论是使用哪一个用户启动都会在config文件夹中创建elasticsearch.keystore文件,root用户权限太大,创建的文件其他用户无法使用,所以会报错!


    4.java.lang.UnsupportedOperationException: seccomp unavailable: CONFIG_SECCOMP not compiled into kernel,     CONFIG_SECCOMP and CONFIG_SECCOMP_FILTER are needed
      因为最终CONFIG_SECCOMP系统在centos7中默认会被加载,但是在centos6中没有
        需要更换centos的版本
        1、6版本---->7版本
        2、修改es的配置文件
        在yml配置文件中添加一行数据 :  bootstrap.system_call_filter: false

    备注

     1 #创建索引并添加映射(推荐)
     2 PUT /person
     3 {
     4   "mappings": {
     5     "properties": {
     6       "name": {
     7         "type": "text"
     8       },
     9       "age": {
    10         "type": "integer"
    11       }
    12     }
    13   }
    14 }
    15 
    16 #删除索引
    17 DELETE /person/
    18 
    19 #查询映射
    20 GET person/_mapping
    21 
    22 
    23 #添加字段
    24 PUT /person/_mapping
    25 {
    26   "properties": {
    27     "name": {
    28       "type": "text"
    29     },
    30     "age": {
    31       "type": "integer"
    32     }
    33   }
    34 }
    35 
    36 
    37 #添加文档,不指定id
    38 POST /person/_doc/
    39 {
    40   "name":"张三",
    41   "age":18,
    42   "address":"北京"
    43 }
    44 
    45 #查询所有文档
    46 GET /person/_search
    47 
    48 
    49 
    50 #删除指定id文档
    51 DELETE /person/_doc/1
    1 # 根据某个字段查询
    2 Get http://localhost:9200/article/_search?q=name:张三
    3 body:{"query":{"match_all":{}}}
    4 
    5 删除某条数据
    6 # 根据上一步获取的ID进行删除
    7 POST product/_delete_by_query
    8 body:{"query":{"term":{"_id":"64491a2b9d9b3f8f5d5122cc0c84fc67"}}}
  • 相关阅读:
    TCP/IP协议三次握手流程
    MySQL 单向同步复制
    源码编译安装MySQL(rhel6.5)
    Android Studio编译输出apk文件修改文件名
    Android 通知栏Notification的整合 全面学习 (一个DEMO让你完全了解它)
    android通知栏Notification点击,取消,清除响应事件
    Android平板上开发应用的一点心得——精确适配不同的dpi和屏幕尺寸
    Android SharePreference 在主进程和次进程间共享数据不同步出错
    Android API 21 Toolbar Padding
    Android Studio UML 插件 PlantUML 使用语法
  • 原文地址:https://www.cnblogs.com/lwl80/p/16593193.html
Copyright © 2020-2023  润新知