ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布,是当前流行的企业级搜索引擎。设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。
# 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.
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
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
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
重新启动,成功.
先安装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
索引(Index): Elastic数据管理的顶层单位,它是单个数据库的同义词.相当于数据库中的database,名字必须是小写.
# 查看当前节点的所有 Index
curl -X GET 'http://localhost:9200/_cat/indices?v'
# 列出每个 Index 所包含的 Type
curl 'localhost:9200/_mapping?pretty=true'
文档(Document): 索引Index里面的单条数据.类似数据库里面表的单条数据.使用JSON格式表示.
集群:集群中有多个节点,其中有一个为主节点,这个主节点是可以通过选举产生的,主从节点是对于集群内部来说的.
ES的一个概念就是去中心化,字面上理解就是无中心节点,这是对于集群外部来说的,因为从外部来看ES集群,在逻辑上是个整体,你与任何一个节点的通信和与整个ES集群通信是等价的.
单个Elastic实例称为一个节点(node).一组节点构成一个集群(cluster).
# 这是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
#
分片:ES可以把一个完整的索引分成多个分片,这样的好处是可以把一个大的索引拆分成多个,分布到不同的节点上.构成分布式搜索.分片的数量只能在索引创建前指定,并且索引创建后不能更改.
副本:ES可以设置多个索引的副本,副本的作用:
* 1 提高系统的容错性,当某个节点某个分片损坏或丢失时可以从副本中恢复
* 2 提高ES的查询效率,ES会自动对搜索请求进行负载均衡.
Elasticsearch入门教程
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" # 大于等于
}
}
}
]
}
}
}
# 文档数据结构
{
"user_name":"张三",
"user_age":20,
"user_phone":"13112345678",
"note":"姓名张三,年龄20,张三的简介"
}
常用查询
* 1 用固定分数查询
127.0.0.1/_search(全文搜索)
{
"query":{
"match"{
"note":"elashsearch" //查询note含有elashsearch的字段
}
}
}
{
"query":{
"bool":{
"should":[//关键词,应当满足条件
{
"match":{
"user_name":"瓦力" }
},{
"match":{
"note":"aaa" }
}
]
}
}
}
{
"query":{
"bool":{
"must":[ //关键词,为必须满足条件
{
"match":{
"user_name":"瓦力" }
},
{
"match":{
"note":"aaa" }
}
],
"filter":[ //过滤查找年龄为20的
{
"term":{
"user_age":20 }
}
]
}
}
}