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"}}}

 

posted @ 2022-08-16 22:04  勤快的懒羊羊  阅读(1385)  评论(0编辑  收藏  举报