搜索引擎 - ElasticSearch

逻辑跃动师
• 阅读 3960

注:ES是Java开源项目,预先安装Jre和NodeJS。

一、介绍

Elasticsearch是基于Apache Lucene的开源搜索引擎,目前被认为是最先进、性能最好、功能最全的搜索引擎。

1、名词

分片:集群中节点存放文档的地方,分片保存在不同节点可用于数据恢复,每个分片占用的CPU、RAM、IO越高索引速度就越快

index(索引): 类似数据库,多个索引就代表多个数据库

type(类型): 类似表名

mapping :表结构

doc(文档):数据,一条Json数据为一个文档

ES Json :ES API请求模板,用于索引数据,格式ES有严格规定(不同版本有区别)

filter(过滤):ES有俩种查询模式,一是根据条件查询(速度慢),二全部查询后再条件过滤

aggs(聚合):类似数据库的group by,可多个聚合嵌套使用

二、安装配置

以下为单节点配置:

1、下载 ES压缩包,解压到本地。

搜索引擎 - ElasticSearch

2、打开/ES/config/下 elasticsearch.yml

为了显示整洁,去掉了注释和没使用的配置项

# ---------------------------------- Cluster -----------------------------------
cluster.name: elasticsearch #ES根据此名将节点放到集群中

# ------------------------------------ Node ------------------------------------
node.name: node-master #节点名称,集群需更改!!!

# ----------------------------------- Paths ------------------------------------
#path.data: /path/to/data
#path.logs: /path/to/logs

# ----------------------------------- Memory -----------------------------------
#bootstrap.memory_lock: true

# ---------------------------------- Network -----------------------------------
network.host: 127.0.0.1 #节点绑定的ip
transport.tcp.port: 9301 #集群需更改!!!
http.port: 9401 #集群需更改!!!

# --------------------------------- Discovery ----------------------------------
#discovery.zen.ping.unicast.hosts: ["host1", "host2"] #主节点列表
##########Prevent the "split brain" by configuring the majority of nodes (total number of master-eligible nodes / 2 + 1):##########
discovery.zen.minimum_master_nodes: 1 #至少1个主节点

# ---------------------------------- Gateway -----------------------------------
#gateway.recover_after_nodes: 3

# ---------------------------------- Various -----------------------------------
#action.destructive_requires_name: true

1、命令

1、命令行到/ES/bin/下,运行 elasticsearchelasticsearch -d 隐藏运行

2、非隐藏运行可使用 Ctrl+C 关闭。隐藏模式可使用 ps -ef | grep elasticjps 查看进程号

3、当集群中的节点出现红色Unassigned,则检查处理问题(节点状态可使用下面的ES插件进行观察等其它操作

(1)查看集群相关信息

curl "localhost:9401/_nodes/process?pretty"

(2)找出 UNASSIGNED 相关信息

curl -XGET localhost:9401/_cat/shards|grep UNASSIGNED

(3)依次修改以上UNASSIGNED

curl -XPOST 'localhost:9401/_cluster/reroute' -d '{
    "commands" : [ {
        "allocate" : {
            "index" : "graylog_83",
            "shard" : 1,
            "node" : "Auq82gfGQVWgOBw6S7ajRQ",
            "allow_primary" : true
        }
    }]
}'

2、安装ES监控

1、下载开源项目 elasticsearch-head

2、进入到elasticsearch-head下,命令行 npm install grunt-cli 安装grunt客户端

搜索引擎 - ElasticSearch

3、在elasticsearch-head下打开Gruntfile.js

搜索引擎 - ElasticSearch

4、运行监控插件及结果

搜索引擎 - ElasticSearch

搜索引擎 - ElasticSearch

三、ES Api

1、创建索引

搜索引擎 - ElasticSearch

搜索引擎 - ElasticSearch

{
    "student": {
        "properties": {
            "no": {
                "type": "string",
                "fielddata": true,
                "index": "analyzed"
            },
            "name": {
                "type": "string",
                "index": "analyzed"
            },
            "age": {
                "type": "integer"
            },
            "birth": {
                "type": "date",
                "format": "yyyy-MM-dd"
            },
            "isLeader": {
                "type": "boolean"
            }
        }
    }

}

然后用REST方式调用ES接口创建索引和类型:

搜索引擎 - ElasticSearch

搜索引擎 - ElasticSearch

ES监控插件上显示:

搜索引擎 - ElasticSearch

2、bulk批处理

bulk API 允许在单个步骤中进行多次 create 、 index 、 update 或 delete 请求。

curl -XPOST "http://172.16.13.4:9401/_bulk?pretty" -d '
{"delete": {"_index": "megacorp", "_type": "employee", "_id": "2"}}
{"create": {"_index": "megacorp", "_type": "employee", "_id": "2"}}
{"name": "first"}
{"index": {"_index": "megacorp", "_type": "employee"}}\n

搜索引擎 - ElasticSearch

3、ES分析器

分析器包括三个功能:字符过滤器(过滤掉HTML,特殊符号转换)、分词器也叫分析器(标准分析器、简单、空格、语言分析器)、token过滤器(删除改变无用词)。具体详见这章 ES分析器

四、ES集群

配置很简单就不做详细说明了,原理跟redis集群差不多,判断节点超时、投票选取主节点。

#####################################主节点1#####################################
# ---------------------------------- Cluster -----------------------------------
cluster.name: alex-es

# ------------------------------------ Node ------------------------------------
node.name: node1
node.master: true
node.data: true

# ----------------------------------- Path ------------------------------------
path.data: /path/to/data
path.logs: /path/to/logs

# ----------------------------------- Memory -----------------------------------
bootstrap.memory_lock: true

# ---------------------------------- Network -----------------------------------
network.host: 172.16.13.4
transport.tcp.port: 9301
transport.tcp.compress: true
http.port: 9401
http.max_content_length: 100mb
http.enabled: true
http.cors.enabled: true
http.cors.allow-origin: "*"

# --------------------------------- Discovery ----------------------------------
discovery.zen.minimum_master_nodes: 2
discovery.zen.ping.unicast.hosts: ["172.16.13.4:9301", "172.16.13.4:9302"]

# ---------------------------------- Gateway -----------------------------------
gateway.recover_after_nodes: 3
gateway.recover_after_time: 5m
gateway.expected_nodes: 3
#####################################主节点2#####################################
# ---------------------------------- Cluster -----------------------------------
cluster.name: alex-es

# ------------------------------------ Node ------------------------------------
node.name: node2
node.master: true
node.data: true

# ----------------------------------- Path ------------------------------------
path.data: /path/to/data2
path.logs: /path/to/logs2

# ----------------------------------- Memory -----------------------------------
bootstrap.memory_lock: true

# ---------------------------------- Network -----------------------------------
network.host: 172.16.13.4
transport.tcp.port: 9302
transport.tcp.compress: true
http.port: 9402
http.max_content_length: 100mb
http.enabled: true
http.cors.enabled: true
http.cors.allow-origin: "*"

# --------------------------------- Discovery ----------------------------------
discovery.zen.minimum_master_nodes: 2
discovery.zen.ping.unicast.hosts: ["172.16.13.4:9301", "172.16.13.4:9302"]

# ---------------------------------- Gateway -----------------------------------
gateway.recover_after_nodes: 3
gateway.recover_after_time: 5m
gateway.expected_nodes: 3
#####################################子节点######################################
# ---------------------------------- Cluster -----------------------------------
cluster.name: alex-es

# ------------------------------------ Node ------------------------------------
node.name: node3
node.master: false
node.data: true

# ----------------------------------- Path ------------------------------------
path.data: /path/to/data3
path.logs: /path/to/logs3

# ----------------------------------- Memory -----------------------------------
bootstrap.memory_lock: true

# ---------------------------------- Network -----------------------------------
network.host: 172.16.13.4
transport.tcp.port: 9303
transport.tcp.compress: true
http.port: 9403
http.max_content_length: 100mb
http.enabled: true
http.cors.enabled: true
http.cors.allow-origin: "*"

# --------------------------------- Discovery ----------------------------------
discovery.zen.minimum_master_nodes: 2
discovery.zen.ping.unicast.hosts: ["172.16.13.4:9301", "172.16.13.4:9302"]

# ---------------------------------- Gateway -----------------------------------
gateway.recover_after_nodes: 3
gateway.recover_after_time: 5m
gateway.expected_nodes: 3

以上配置信息不能包含空格,配置好后,全部启动,在ES-head上监控显示:

搜索引擎 - ElasticSearch

五、ES客户端问题

官方提供了基于Python、Java等语言的客户端,其中实现了对es连接池轮训、查询、索引、批量等操作。

由于最近在用多进程并发查询es的功能,当请求数量在一段时间内增加时,会有多个进程的响应超时的问题。

经过调查,已排查掉以下可能存在的问题:

1、Java GC机制问题(包括并发GC、FullGC、GCone等),因为根据GC的机制不同,会影响es的性能
2、es队列大小
3、进程池,基本上是同一时间异步调用es查询,所以这个不存在问题
4、CPU内存及es配置优化等

最后在服务器上抓包发现,部分请求要经过一定时间才能传到es上,而且随着请求数量加大,时间间隔有递增趋势,这样问题就定位在es客户端发送请求那。

经过一番研究,可能是es客户端所采用的传输协议会导致请求时间延长,最后决定用Python的 pycurl 来代替es客户端,下面是代码,可以自己实现es轮训:

import pycurl
import StringIO
import random

def es_pool():
    return ["ip:port", "ip:port"]

# curl请求
def curl_req(index='', rtype='', body=''):
    s = StringIO.StringIO()
    c = pycurl.Curl()

    es_hosts = es_pool()
    host = es_hosts[random.randint(0, len(es_hosts)) % len(es_hosts)]  # 根据es池大小随机选择
    url = host + '/' + index + '/' + rtype + '/_search'

    c.setopt(pycurl.URL, url)
    c.setopt(pycurl.POST, 1)
    c.setopt(pycurl.POSTFIELDS, body)
    c.setopt(pycurl.WRITEFUNCTION, s.write)
    c.perform()
    c.close()
    return s.getvalue()
点赞
收藏
评论区
推荐文章
blmius blmius
4年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Irene181 Irene181
4年前
手把手教你使用Flask搭建ES搜索引擎(预备篇)
/1前言/Elasticsearch是一个开源的搜索引擎,建立在一个全文搜索引擎库ApacheLucene™基础之上。那么如何实现Elasticsearch和Python的对接成为我们所关心的问题了(怎么什么都要和Python关联啊)。/2 Python交互/所以,Python也就提供了可以对接Elasti
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
美凌格栋栋酱 美凌格栋栋酱
7个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Wesley13 Wesley13
3年前
FLV文件格式
1.        FLV文件对齐方式FLV文件以大端对齐方式存放多字节整型。如存放数字无符号16位的数字300(0x012C),那么在FLV文件中存放的顺序是:|0x01|0x2C|。如果是无符号32位数字300(0x0000012C),那么在FLV文件中的存放顺序是:|0x00|0x00|0x00|0x01|0x2C。2.  
Wesley13 Wesley13
3年前
ELK初探
EKL核心组成1.ElasticSearch开源分布式搜索引擎,他的特点是分布式、零配置、自动发现、索引自动分片,索引副本机制,restful接口,多数据源,自动搜索负载。安装ElasticSearch  高可用,易扩展,支持集群(cluster),分片和复制(sharding和replicas)验证启动:curlXGETht
王仕宇编程 王仕宇编程
8个月前
Springboot2.x整合ElasticSearch7.x实战(一)
ElasticSearch是一个开源的搜索引擎,建立在一个全文搜索引擎库ApacheLucene™基础之上。Lucene可以说是当下最先进、高性能、全功能的搜索引擎库——无论是开源还是私有。
Python进阶者 Python进阶者
1年前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这
陈占占 陈占占
3年前
Django 配置搜索引擎 haystack 与 搜索页面无法返回数据问题
Django配置搜索引擎haystack与搜索页面无法返回数据问题1、Django安装haystackwhooshjiebahaystack是django的开源搜索框架,该框架支持Solr,Elasticsearch,Whoosh,搜索引擎量。Whoosh是一个搜索引擎使用,这是一个由纯Python实现的全文搜索引擎,没有二进制文
ElasticSearch集群灾难:别放弃,也许能再抢救一下 | 京东云技术团队
1前言Elasticsearch作为一个分布式搜索引擎,自身是高可用的;但也架不住一些特殊情况的发生,如:集群超过半数的master节点丢失,ES的节点无法形成一个集群,进而导致集群不可用;索引shard的文件损坏,分片无法被正常恢复,进而导致索引无法正常