•  

ElasticSearch安装笔记

发表于 2018-12-11,阅读 84

基本信息

安装环境

CentOS:CentOS Linux release 7.6.1810 (Core)
Linux:Linux version 3.10.0-1062.el7.x86_64
GCC:gcc version 4.8.5 20150623 (Red Hat 4.8.5-36) (GCC)

软件版本

elasticsearch-6.5.2.tar.gz

验证时间

2020/01/08

准备工作

本地化

如果是新环境,我们需要设置时区以保证时间显示正确

timedatectl set-timezone Asia/Shanghai

安装wget

如果环境里没有wget,通过yum安装一下

yum -y install wget

建立环境根目录

mkdir -p /tongfu.net/env/

建立安装包目录并进入

mkdir /packages
cd /packages

安装

下载

ElasticSearch

wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.5.2.tar.gz

JDK

必须通过网页下载,需要勾选“接受协议”,所以不能用wget直接下载了!
网页地址:https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html

安装

直接安装

因为安装elastic search引擎需要去掉内存使用限制,所以我们需要进行如下设置

[root@tongfunet]# vi /etc/security/limits.conf

es               soft    memlock         unlimited
es               hard    memlock         unlimited
es               soft    nofile          65536
es               hard    nofile          65536

Docker安装

因为安装elastic search引擎需要去掉内存使用限制,所以如果我们想要安装在Docker容器内,则创建Docker容器时候需要增加如下参数设置

--ulimit memlock=-1:-1 --ulimit nofile=65536:65536

vm.max_map_count

默认 vm.max_map_count 是 65530,需要加大到 262144(Docker安装需要在宿主机上执行)

sysctl -w vm.max_map_count=262144

建立用户

useradd es

解压缩elasticsearch

tar -xzvf elasticsearch-6.5.2.tar.gz -C /tongfu.net/env/

设置权限elasticsearch

chown es.es -R /tongfu.net/env/elasticsearch-6.5.2/

解压缩jdk

tar -xzvf jdk-8u192-linux-x64.tar.gz -C /tongfu.net/env/

设置权限jdk

chown es.es -R /tongfu.net/env/jdk1.8.0_192/

优化

设置JVM内存使用

建议设置初始化内存和最高内存都是物理内存的一半

[root@tongfunet]# vi /tongfu.net/env/elasticsearch-6.5.2/config/jvm.options

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

-Xms4g
-Xmx4g

ES设置

设置启动内存锁定

把 bootstrap.memory_lock: true 前面的 # 去掉

[root@tongfunet]# vi /tongfu.net/env/elasticsearch-6.5.2/config/elasticsearch.yml

#
# Lock the memory on startup:
#
bootstrap.memory_lock: true

设置IP

默认elasticsearch只能通过127.0.0.1访问,我们需要设置一下IP地址

[root@tongfunet]# vi /tongfu.net/env/elasticsearch-6.5.2/config/elasticsearch.yml

#
network.host: 0.0.0.0
#
# Set a custom port for HTTP:
#
http.port: 9200

启动

启动ES

建立启动脚本

[root@tongfunet]# cat > /tongfu.net/env/elasticsearch-6.5.2/bin/elasticsearch.sh <<EOF
#!/bin/sh

echo "set environment..."
export JAVA_HOME=/tongfu.net/env/jdk1.8.0_192/

echo "starting..."
/tongfu.net/env/elasticsearch-6.5.2/bin/elasticsearch -d
EOF

授权启动脚本

chmod 0755 /tongfu.net/env/elasticsearch-6.5.2/bin/elasticsearch.sh

启动服务

su es /tongfu.net/env/elasticsearch-6.5.2/bin/elasticsearch.sh

测试

[root@tongfunet]# curl 'http://localhost:9200/'
{
  "name" : "QguZy94",
  "cluster_name" : "elasticsearch",
  "cluster_uuid" : "O5CfJjefQRWrkVe8_yRQoA",
  "version" : {
    "number" : "6.5.0",
    "build_flavor" : "default",
    "build_type" : "tar",
    "build_hash" : "816e6f6",
    "build_date" : "2018-11-09T18:58:36.352602Z",
    "build_snapshot" : false,
    "lucene_version" : "7.5.0",
    "minimum_wire_compatibility_version" : "5.6.0",
    "minimum_index_compatibility_version" : "5.0.0"
  },
  "tagline" : "You Know, for Search"
}

使用

准备

建议使用工具Postman进行调试。

ES里的index(索引)对应数据库里的数据库名称
ES里的数据是文档型的,每个类型下面可以有多个文档,文档结构必须一致
如果文档结构有大的变化,需要建立新的类型,因为旧的数据已经存入缓存,无法立即更新

写入数据

通过POST方式请求如下地址,索引名称 index1

POST /index1

{
    "id":1,
    "class":10,
    "name":"北京"
}

我们按照这个结果插入多个文档进去,例如:上海,天津,河北,河南。

为了测试我们再写入河北省,河南省两个文档进去。

获取数据

通过GET方式请求如下地址

GET /index1/_search

{
    "_index": "index1",
    "_type": "type1",
    "_id": "1",
    "_version": 1,
    "found": true,
    "_source": {
        "id": 1,
        "class": 10,
        "name": "北京"
    }
}

标准搜索

关键字搜索

搜索包含“河”的文档

POST /index1/_search 

{
    "from" :0,
    "size" :10,
    "query" :{
        "match" :{
            "name":"河"
        }
    }
}

搜索包含“河北省”且class为20的文档
注意:这里的 must 相当于数据库里的“and”,“or”则用 should 表示,must、should必须配合 bool 使用

POST /index1/_search

{
    "from" :0,
    "size" :10,
    "query" :{
        "bool" :{
            "must" :[
                {
                    "terms" :{
                        "class":[20]
                    }
                },
                {
                    "match" :{
                        "name":"河省"
                    }
                }
            ]
        }
    }
}

以上语法可以将“河北”,“河南”,“河北省”,“河南省”全部查询出来,因为任何一个字命中都会被找出来

如果我们希望只找出那些完全包含给定关键字的文档出来,可以使用以下语句

POST

使用match_phrase替代match,表示完全匹配模式,即:关键字的必须完全命中,且出现顺序才会被查询出来

分组统计

获得包含“河”的文档的class列表

POST /index1/_search

{
    "from" :0,
    "size" :0,
    "query" :{
        "bool" :{
            "must" :[
                {
                    "match" :{
                        "name":"河"
                    }
                }
            ]
        }
    },
    "aggs":{
        "group_by_class":{
            "terms":{
                "field":"class",
                "size":1000
            }
        }
    }
}

结果如下

{
    "took": 2,
    "timed_out": false,
    "_shards": {
        "total": 5,
        "successful": 5,
        "skipped": 0,
        "failed": 0
    },
    "hits": {
        "total": 3,
        "max_score": 0,
        "hits": []
    },
    "aggregations": {
        "group_by_class": {
            "doc_count_error_upper_bound": 0,
            "sum_other_doc_count": 0,
            "buckets": [
                {
                    "key": 20,
                    "doc_count": 3
                }
            ]
        }
    }
}

这里使用的是aggregations模拟数据库的group by功能,group_by_class是别名可以随便起
如果分组的字段是字符串类型,则需要在字段后面加上“.keyword”,例如:class.keyword

类型与映射

字段类型

设置字段类型

删除索引

删除索引

DELETE http://localhost:9200/index1

数据备份/还原

安装工具

安装导入导出工具 elasticdump

cd /tongfu.net/env/elasticsearch-6.5.2/bin/
yum -y install epel-release
yum -y install nodejs
npm install elasticdump

导出/导入

从一个es导出mappings到另一个es

./elasticdump --input=http://[源ES]/demo_index --output=http://[目标ES]/demo_index --type=mapping

从一个es导出数据到另一个es

./elasticdump --input=http://[源ES]/demo_index --output=http://[目标ES]/demo_index --type=data

将es数据导出到json文件

./elasticdump --input=http://[源ES]/demo_index --output=my_data.json --type=data

从json文件导入数据到es

./elasticdump --input=my_data.json --output=http://[目标ES]/demo_index --type=data

常见错误

错误1

如果在写入数据的时候遇到这个错误信息 FORBIDDEN/655/index1 read-only / allow delete (api),可以通过执行下面的命令修复

PUT /index1/_settings

{
    "index.blocks.read_only_allow_delete":"false"
}






鬼谷子叔叔
  • 日志:212
  • 回复:13

进入ta的主页