elasticsearch 入门1

0. elasticsearch 是什么?

ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布,是当前流行的企业级搜索引擎。设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。

1 安装

# 1 下载
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.3.2.tar.gz

# 2 解压
tar -xzvf elasticsearch-6.3.2.tar.gz

# 3 进入文件夹,启动
cd elasticsearch-6.3.2
./bin/elasticsearch

# 4 访问测试安装结果
curl localhost:9200

{
  "name" : "z7hjjKd",
  "cluster_name" : "elasticsearch",
  "cluster_uuid" : "ITBKJdUORteDg8maReXZcA",
  "version" : {
    "number" : "6.3.2",
    "build_flavor" : "default",
    "build_type" : "tar",
    "build_hash" : "053779d",
    "build_date" : "2018-07-20T05:20:23.451332Z",
    "build_snapshot" : false,
    "lucene_version" : "7.3.1",
    "minimum_wire_compatibility_version" : "5.6.0",
    "minimum_index_compatibility_version" : "5.0.0"
  },
  "tagline" : "You Know, for Search"
}

# 请求9200端口,Elastic返回一个 JSON 对象,包含当前节点 集群 版本等信息.

默认情况下,Elastic 只允许本机访问,如果需要远程访问,可以修改Elastic 安装目录的config/elasticsearch.yml文件,去掉network.host的注释,改为network.host: 0.0.0.0,然后重新启动Elastic.
设成0.0.0.0让任何人都可以访问.线上服务不要这样设置,要设成具体的IP.

1.1 安装问题

1.1.1 Java虚拟机内存限制问题
Error occurred during initialization of VM
Could not reserve enough space for 2097152KB object heap

网上查有不少人在安装使用其他软件时,也遇到类似的问题,基本思路是在某个配置文件中减小最大堆限制,设定为256M。

# elasticsearch.bat 63行 (window)
if "%ES_JVM_OPTIONS%" == "" (
rem '0' is the batch file, '~dp' appends the drive and path
set ES_JVM_OPTIONS=%~dp0\..\config\jvm.options
)

在配置文件夹config\下找到jvm.options文件。


# Xms represents the initial size of total heap space
# Xmx represents the maximum size of total heap space

-Xms2g
-Xmx2g

修改为:
-Xms256m
-Xmx256m
1.1.2 elasticsearch: can not run elasticsearch as root
Caused by: java.lang.RuntimeException: can not run elasticsearch as root
        at org.elasticsearch.bootstrap.Bootstrap.initializeNatives(Bootstrap.java:104) ~[elasticsearch-6.3.2.jar:6.3.2]
        at org.elasticsearch.bootstrap.Bootstrap.setup(Bootstrap.java:171) ~[elasticsearch-6.3.2.jar:6.3.2]
        at org.elasticsearch.bootstrap.Bootstrap.init(Bootstrap.java:326) ~[elasticsearch-6.3.2.jar:6.3.2]
        at org.elasticsearch.bootstrap.Elasticsearch.init(Elasticsearch.java:136) ~[elasticsearch-6.3.2.jar:6.3.2]
        ... 6 more

这是出于系统安全考虑设置的条件,由于ElasticSearch可以接收用户输入的脚本并且执行,为了系统安全考虑,
建议创建一个单独的用户用来运行ElasticSearch

解决方案
# 1 创建elsearch用户组及elsearch用户
groupadd elsearch
useradd elsearch -g elsearch -p elasticsearch

# 2 更改elasticsearch-6.3.2文件夹及内部文件的所属用户及组为elsearch:elsearch
chown -R elsearch:elsearch  elasticsearch-6.3.2 # 注意此处为elasticsearch解压后的目录名称

# 3 切换用户
su elsearch #切换账户

# 4 进入目录
cd elasticsearch/bin  

# 5 启动
./elasticsearch
1.1.3 修改elasticsearch.yml配置文件network.host: 0.0.0.0 后报错
[2018-08-15T22:14:04,230][INFO ][o.e.b.BootstrapChecks    ] [z7hjjKd] bound or publishing to a non-loopback address, enforcing bootstrap checks
ERROR: [1] bootstrap checks failed
[1]: max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
[2018-08-15T22:14:04,245][INFO ][o.e.n.Node               ] [z7hjjKd] stopping ...

解决方案:

# 编辑 /etc/sysctl.conf 追加以下内容
vm.max_map_count=655360

# 保存后,执行:
sysctl -p

重新启动,成功.

2 插件

先安装nodejs环境

# 1 下载插件包
wget https://github.com/mobz/elasticsearch-head/archive/master.zip

# 2 解压,进入文件夹
unzip master.zip
cd elasticsearch-head-master

# 3 安装依赖包
npm install

# 4 修改配置文件,找到connect:server,添加`hostname:0.0.0.0`
vi Gruntfile.js
options: {
    hostname: '0.0.0.0',
    port: 9100,
    base: '.',
    keepalive: true
}

# 5 启动
npm run start

3 基本概念

3.1 索引(Index)

索引(Index): Elastic数据管理的顶层单位,它是单个数据库的同义词.相当于数据库中的database,名字必须是小写.

# 查看当前节点的所有 Index
curl -X GET 'http://localhost:9200/_cat/indices?v'

3.2 类型(Type)

  • Index下的Type使用时一般建议将类似的type数据放在一个index下面,也就是说同个index下的type尽量多的字段相同,比如电商系统里面的商品可以是一个index,而不同类型的商品(比如家电,户外,虚拟商品)等则可以是该index下的不同的type, 这些type有大量的商品共性字段,也有少量的特有的属性字段.
  • 查询时可以直接对Index进行查询,会去查询所有包含查询字段的type;也可以指定type查询,这样就只会查询该type下的文档.
  • 每个type下的文档都是独立的,不存在共享.
  • Elastic6.x版只允许每个Index包含一个Type,7.x 版将会彻底移除Type
# 列出每个 Index 所包含的 Type
curl 'localhost:9200/_mapping?pretty=true'

3.3 文档(Document)

文档(Document): 索引Index里面的单条数据.类似数据库里面表的单条数据.使用JSON格式表示.

3.4 节点(Node) 与集群(cluster)

集群:集群中有多个节点,其中有一个为主节点,这个主节点是可以通过选举产生的,主从节点是对于集群内部来说的.

ES的一个概念就是去中心化,字面上理解就是无中心节点,这是对于集群外部来说的,因为从外部来看ES集群,在逻辑上是个整体,你与任何一个节点的通信和与整个ES集群通信是等价的.

单个Elastic实例称为一个节点(node).一组节点构成一个集群(cluster).

3.4.1 集群配置
# 这是Master Node 配置参数
vim $ES_HOME/config/elasticsearch.yml

# ======================== ES 参数配置 =========================
#
#
# ------------------------ 集群设定 ----------------------------
#
# 集群名称 
 cluster.name: ${CLUSTER_NAME}
#
# ------------------------ 节点设定 ----------------------------
#
# 节点名称
 node.name: ${HOSTNAME}
#
# 节点角色
 node.master: true
 node.data: false
 node.ingest: false
#
# ------------------------ 路径设定 ----------------------------
#
# 索引、日志存放路径
 path:
   data: ${DATA_PATH}
   logs: ${LOGS_PATH}
#
# ------------------------ 内存设定 ----------------------------
#
#
# 锁定内存,阻止操作系统管理内存,可以有效的防止内存数据被交换到磁盘空间,
#   交换过程中磁盘会抖动,会对性能产生较大的影响。因为ES是基于JAVA开发的
#   可以能过垃圾回收器来单独管理内存,所以关闭操作系统级别的内存管理可以
#   提升性能
 bootstrap.memory_lock: true
#
# ------------------------ 网络设定 ----------------------------
#
# 绑定节点上的所有网络接口,用于接收通过任意网卡传输过来的请求
 network.bind_host: 0.0.0.0
#
# 绑定一个网络接口(网卡),用于集群内部节点通信(一般选择吞吐量大的网卡)
 network.publish_host: _eth0:ipv4_
#
# HTTP 通信端口
 http.port: ${PORT}
#
# TCP 通信端口
 transport.tcp.port: ${PORT}
#
# --------------------------------- 集群发现 模块 ----------------------------------
#
# 集群初始化连接列表,节点启动后,首先通过连接初始化列表里的地址去发现集群。
 discovery.zen.ping.unicast.hosts: ["ip:port","ip:port","ip:port"]
#
# 为了防止集群脑裂,目前的策略是当且仅当节点有超过半数的master候选者存活时(目前是2台,可以完成选举),集群才会进行master选举
 discovery.zen.minimum_master_nodes: 2
#
# ---------------------------------- 其它 -----------------------------------
#
# 关闭操作系统内核验证(我的操作系统没有升级,如果不关闭验证则无法启动)
 bootstrap.system_call_filter: false
#
# ------------------------ HTTP ----------------------------
#
# 是否支持跨域访问资源
 http.cors.enabled: true
#
#
#允许访问资源的类型
 http.cors.allow-origin: "*"
#
#
# 允许HTTP请求的方法类型 
 http.cors.allow-methods: OPTIONS,HEAD,GET,POST,PUT,DELETE
#
# 允许HTTP请求头返回类型
 http.cors.allow-headers: X-Requested-With,Content-Type,Content-Length,Authorization,Content-Encoding,Accept-Encoding
#
# 支持HTTP访问API 总开关
 http.enabled: true
#
#
# 这是Data Node 配置参数
vim $ES_HOME/config/elasticsearch.yml
# ======================== ES 参数配置 =========================
#
#
# ------------------------ 集群设定 ----------------------------
#
# 集群名称 
 cluster.name: ${CLUSTER_NAME}
#
# ------------------------ 节点设定 ----------------------------
#
# 节点名称
 node.name: ${HOSTNAME}
#
# 节点角色
 node.master: false
 node.data: true
 node.ingest: false
#
# ------------------------ 路径设定 ----------------------------
#
# 索引、日志存放路径
 path:
   data: ${DATA_PATH}
   logs: ${LOGS_PATH}
#
# ------------------------ 内存设定 ----------------------------
#
#
# 锁定内存,阻止操作系统管理内存,可以有效的防止内存数据被交换到磁盘空间,
#   交换过程中磁盘会抖动,会对性能产生较大的影响。因为ES是基于JAVA开发的
#   可以能过垃圾回收器来单独管理内存,所以关闭操作系统级别的内存管理可以
#   提升性能
 bootstrap.memory_lock: true
#
# ------------------------ 网络设定 ----------------------------
#
# 绑定节点上的所有网络接口,用于接收通过任意网卡传输过来的请求
 network.bind_host: 0.0.0.0
#
# 绑定一个网络接口(网卡),用于集群内部节点通信(一般选择吞吐量大的网卡)
 network.publish_host: _eth0:ipv4_
#
# HTTP 通信端口
 http.port: ${PORT}
#
# TCP 通信端口
 transport.tcp.port: ${PORT}
#
# --------------------------------- 集群发现 模块 ----------------------------------
#
# 集群初始化连接列表,节点启动后,首先通过连接初始化列表里的地址去发现集群。
 discovery.zen.ping.unicast.hosts: ["ip:port","ip:port","ip:port"]
#
# 为了防止集群脑裂,目前的策略是当且仅当节点有超过半数的master候选者存活时(目前是2台,可以完成选举),集群才会进行master选举
 discovery.zen.minimum_master_nodes: 2
#
# ---------------------------------- 其它 -----------------------------------
#
# 关闭操作系统内核验证(我的操作系统没有升级,如果不关闭验证则无法启动)
 bootstrap.system_call_filter: false
#

3.5 分片(shard)和副本(Replica)

分片:ES可以把一个完整的索引分成多个分片,这样的好处是可以把一个大的索引拆分成多个,分布到不同的节点上.构成分布式搜索.分片的数量只能在索引创建前指定,并且索引创建后不能更改.

副本:ES可以设置多个索引的副本,副本的作用:
* 1 提高系统的容错性,当某个节点某个分片损坏或丢失时可以从副本中恢复
* 2 提高ES的查询效率,ES会自动对搜索请求进行负载均衡.

4 基本用法

4.1 创建索引 & 增删改查

Elasticsearch入门教程

4.2 query与filter

Query查询上下文

在查询上下文中,查询会回答这个问题——”这个文档匹不匹配这个查询,它的相关度高么?”

如何验证匹配很好理解,如何计算相关度呢?ES中索引的数据都会存储一个_score分值,分值越高就代表越匹配.另外关于某个搜索的分值计算还是很复杂的,因此也需要一定的时间.

查询上下文是在使用query进行查询时的执行环境,比如使用search的时候.

Filter过滤器上下文

在过滤器上下文中,查询会回答这个问题——”这个文档匹不匹配?”

答案很简单,是或者不是.它不会去计算任何分值,也不会关心返回的排序问题,因此效率会高一点.

过滤上下文是在使用filter参数时候的执行环境,比如在bool查询中使用Must_not或者filter.

GET /_search
{
  "query": { 
    "bool": { 
      "must": [
        { "match": { "fieldName": "value"}}, 
        { "match": { "fieldName": "value"}}  
      ],
      "filter": [ 
        { "term":  { "fieldName": "value"}}, 
        { 
            "range": { 
                "fieldName": { 
                    "gte": "value" # 大于等于
                }
            }
        } 
      ]
    }
  }
}

4.3 符合查询

# 文档数据结构
{
    "user_name":"张三",
    "user_age":20,
    "user_phone":"13112345678",
    "note":"姓名张三,年龄20,张三的简介"
}

常用查询
* 1 用固定分数查询

 127.0.0.1/_search(全文搜索)
     {
        "query":{
            "match"{
                "note":"elashsearch" //查询note含有elashsearch的字段
            }
        }
      }
  • 2 布尔查询,两个match的关系为或,满足一个即可
{
    "query":{
       "bool":{
          "should":[//关键词,应当满足条件
            {  
                "match":{
                    "user_name":"瓦力" }
            },{
                "match":{
                    "note":"aaa" }
            }
          ]
        }
    }
}
  • 3 两者都满足
{
  "query":{
     "bool":{
       "must":[ //关键词,为必须满足条件
           {
                "match":{
                    "user_name":"瓦力" }
           },
           {
                "match":{
                   "note":"aaa" }
           }
        ],
        "filter":[  //过滤查找年龄为20的
            {
              "term":{
                  "user_age":20 }
            }
        ]
      }
   }
}

5 spring 与elasticsearch 整合

你可能感兴趣的:(elasticsearch)