课程咨询 :186 8716 1620      qq:2066486918

昆明Java培训 > 达内新闻 > 分享Elasticsearch---基础篇
  • 分享Elasticsearch---基础篇

    发布:昆明Java培训      来源:达内新闻      时间:2016-10-19

  • 昆明Java培训班的老师今天给大家分享Elasticsearch的基础篇。

    【理论部分】

    一、什么是Elasticsearch?

    首先Elasticsearch是一个基于Lucene的搜索服务器,而Lucene是一个基于java开发的全文检索引擎的架构。

    下面是官网对Elaticsearch的介绍:

    Actionable Insight at Your Fingers

    Distributed, scalable, and highly available

    Real-time search and analytics capabilities

    Sophisticated RESTful API

    我们可以看到上面描述es的一些特性:具备分布式能力和相应功能,实时搜索和分析,支持现在流行的RESTful架构风格。而分布式让他对大数据也能很好的支持,对RESTful的支持让任何语言都可以访问。

    所以昆明Java培训班的老师对它的理解是:

    一个采用Restful API标准的高扩展性和高可用性的实时数据分析的全文搜索工具。

    二、Elasticsearch的用途

    上面也提到了,elasticsearch的主语是全文搜索工具,所以他就是干全文搜索用的。

    下面是一些使用案例:

    i) Github

    “Github使用Elasticsearch搜索20TB的数据,包括13亿的文件和1300亿行的代码”

    这个不用介绍了吧,Github在2013年1月升级了他们的代码搜索,由solr转为elasticsearch,目前集群规模为26个索引存储节点和8个客户端节点(负责处理搜索请求),

    ii) Mozilla

    Mozilla公司以火狐著名,它目前使用WarOnOrange这个项目来进行单元或功能测试,测试的结果以json的方式索引到elasticsearch中,开发人员可以非常方便的查找bug。

    Socorro是Mozilla公司的程序崩溃报告系统,一有错误信息就插入到Hbase和Postgres中,然后从Hbase中读取数据索引到elasticsearch中,方便查找。

    三、Elasticsearch名词解释

    i)在数据层面主要有:

    Index:Elasticsearch用来存储数据的逻辑区域,它类似于关系型数据库中的db概念。一个index可以在一个或者多个shard上面,同时一个shard也可能会有多个replicas。(必须小写)

    Document:Elasticsearch里面存储的实体数据,类似于关系数据中一个table里面的一行数据。

    document由多个field组成,不同的document里面同名的field一定具有相同的类型。document里面field可以重复出现,也就是一个field会有多个值,即multivalued。(区分大小写)

    Document type:为了查询需要,一个index可能会有多种document,也就是document type,但需要注意,不同document里面同名的field一定要是相同类型的。相当于数据库里的一个表。(区分大小写,且里面的field也区分大小写)

    Document id :唯一,相当于数据库主键。

    Mapping:存储field的相关映射信息,不同document type会有不同的mapping。

    ii)在服务层面主要有:

    Node:一个server实例。

    Cluster:多个node组成cluster。

    Shard:数据分片,一个index可能会存在于多个shards,不同shards可能在不同nodes。

    Replica:shard的备份,有一个primary shard,其余的叫做replica shards。

    【实践部分】

    四、Elasticsearch的安装部署启动

    一些基本的认识我们都有了,下面就开始实践了,由于es一般都是运行在linux里的,我们现在就在linux下部署一个elasticsearch服务(特别需要注意的,elasticsearch1.x和2.x有非常大的区别,昆明Java培训班的老师下面讲的都是2.x的):

    1、环境

    elasticesearch依赖java环境,需要jre7以上。

    2、下载

    在官网下载tar.gz格式压缩包

    3、解压安装

    elasticesearch只需要解压就行,解压到相应目录

    [boss@localhost ~]$ mkdir elasticesearch

    [boss@localhost ~]$ cd elasticesearch/

    [boss@localhost elasticesearch]$ tar xzf elasticsearch-2.3.5.tar.gz

    4、启动

    启动的时候最好添加jvm参数./elasticsearch -Xms512m -Xmx512m

    [boss@localhost elasticesearch]$ cd bin/

    [boss@localhost bin]$ ./elasticsearch

    5、问题

    测试环境是在公司虚拟机上,jdk 1.7.0_45,启动报错,需要升级jdk,貌似是jvm的bug。

    在官网上看到这么一句话需要java 8 update 20 for later, or java 7 update 55 or later version.否则有bug.,甚至导致数据丢失。

    至于windows下的安装部署启动在这就不介绍了,具体请看另外一篇《Elasticesearch在Windows的安装运行》

    关于elasticsearch集群:只要在相同是host下,且配置文件中的cluster.name相同的节点,就会组成一个集群

    五、Elasticsearch目录、配置信息解释

    i)安装的目录布局如下:

    Type

    Description

    Default Location

    Setting

    home

    elasticsearch安装目录                  path.home

    bin

    二进制脚本,包括elasticsearch启动节点       {path.home}/bin   

    conf

    配置文件路径,包含elasticsearch.yml     {path.home}/config       path.conf

    data

    在节点上每个索引/碎片的数据文件的位置。可以有多个目录。{path.home}/datapath.data

    work

    零时文件目录(工作目录)      {path.home}/workpath.work

    logs

    日志文件目录      {path.home}/logs path.logs

    如果有多个数据目录,可以允许使用数据分拆技术,将数据能够按照设置放在不同的磁盘上。这个分拆原来是很简单的,只是保证一个文件完整的存在一个地方,具体是如果选择存在那个磁盘上是通过index.store.distributor来配置的:

    least_used(默认):总是选择可用空间最大的目录。

    random:随机选择的目录。选择一个特定的目录的概率,是与这个目录中可用空间量成正比。

    注意,在相同的数据上没有多个副本,在这一点上,它的类似raid 0。虽然简单,但是它应该提供一个好的解决方案,对于不想使用raid的人。

    ii)配置文件

    Elasticsearch的配置文件在conf目录下,有两个.yml文件,一个是elasticsearch.yml,另一个是logging.yml。

    其中elasticsearch.yml是对elasticsearch的配置;logging.yml是对elasticsearch日志的配置,也就是对log4j的配置。

    我们这里讲elasticsearch.yml,文件中都比较详细的英文解释,所以我就说说比较重要的几个配置:

    cluster.name:      elasticsearch天然具备集群能力,所以这里就有一个集群名称配置,默认为elasticsearch,最好修改下。

    node.name:          节点名称,也就是集群中的各个节点的名称,也需要配置,方便以后管理和java api开发

    network.host:        允许访问的host,可以是ipv4也可以是ipv6形式,在es2.x下如果不配,那么就只能localhost访问了。

    http.port:          http端口号,用于restful、插件的访问端口,默认9200,不能重复

    transport.tcp.port:     通讯端口,java api访问的就是这个端口,默认9300,不能重复

    discovery.zen.ping.unicast.hosts:   这个是集群启动的时候,默认发现的主机列表,然后通过这里的host再去发现别的节点,需要至少配置一个,不然好像有点问题,我在集群搭建的时候就因为没配置遇到一些意外情况。

    discovery.zen.minimum_master_nodes:  最小的master选举人数,默认为2,这种形式计算(total umber of nodes /2+1)

    discovery.zen.ping.multicast.enabled: 自动发现节点开关,如果为false,则新加入的节点不会被发现。

    discovery.zen.ping.timeout:      自动发现超时时间。

    六、Elasticsearch插件安装

    1、head插件:       

    对于Elasticsearch这种为分布式集群而生的,没有一个管理工具的话,会无从下手,所以我们需要安装一些插件来辅助,经典的插件是head插件,marvel插件。

    alpha-application为集群名称

    集群健康值:分为绿、黄、红。绿是表示正常;黄色表示部分异常,可以搜索,但是增删改备份什么的会有异常,数据会丢失;红色表示连搜索也不行了。

    上面一个集群有两个节点,分别是node-alpha-0、node-alpha-1。其中node-alpha-0为master。

    上面有5个index,每个index都有5个分片。

    2、analysis-ik插件:

    首先得介绍一个概念:在检索数据中,有一个概念analysis,中文为分词。

    比如一句话I want to a be a bird。 如果不分词,那么每个字母都是搜索的关键词。这样就无法搜索了。es默认有分词,但是它对英文分词支持很好,对中文就很烂了。

    比如“我国是发展中国家”,es对他的分词就是每个汉字,这当然不行,理想的分词是我国、是、发展、发展中、国家。

    因此我们需要ik插件,ik插件对中文分词有很好的支持。

    3、analysis-ik-pinyin插件:

    说完了中文分词插件,不可避免的需要拼音插件了,analysis-ik-pinyin这个插件是我找了很久觉得比较好的中文拼音插件。

    安装插件需要将elasticsearch-analysis-lc-pinyin的源码自己maven build出来,这样可以避免版本冲突

    配置使用:

    lc 2.x是不需要在elasticsearch.yml里配置的,我们只需要重启elasticsearch实例即可。

    关键就是在于使用上mapping和DSL的配置。

    由于elasticsearch 1.x和2.x改动很大,所以昆明Java培训班的老师这里直接贴2.x的mapping配置了:

    curl -XPUT http://localhost:9200/addr

    curl -XPOST http://localhost:9200/addr/std/_mapping -d'

    {

    "std": {

    "properties": {

    "detail_name": {

    "type": "string",

    "analyzer": "lc_index",

    "search_analyzer": "lc_search",

    "fields": {

    "cn": {

    "type": "string",

    "analyzer": "ik_max_word",

    "search_analyzer": "ik_max_word"

    }

    }

    },

    "door_name": {

    "type": "string",

    "analyzer": "lc_index",

    "search_analyzer": "lc_search",

    "fields": {

    "cn": {

    "type": "string",

    "analyzer": "ik_max_word",

    "search_analyzer": "ik_max_word"

    }

    }

    }

    }

    }

    }'

    主要问题是在于,1.x是index_analyzer为lc_index,但是2.x没有了index_analyzer这个参数。

    接下来就和1.x差不多了。

    4、sql插件:

    这个插件可以让不熟悉curl命令的人使用sql语句查询。

    5、elasticsearch-jdbc插件:

    这是一个数据库(mysql/oracle...)和elasticsearch同步的插件,并且支持实时同步(但是不同步物理删除的数据)。

    不过它的同步是通过脚本实现的,linux为.sh,windows下为.bat。

    需要说明的是,该插件提供了mysql的样例,oracle的没有提供,下面是昆明Java培训班的老师写的oracle的脚本,由于不是很熟悉linux命令,有些参数没有使用到。

    #!/bin/sh

    # This example is a template to connect to Oracle

    # The JDBC URL and SQL must be replaced by working ones.

    DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"

    bin=${DIR}/../bin

    lib=${DIR}/../lib

    JAVA_HOME="/opt/java/jdk1.8.0_101"

    echo '

    {

    "type" : "jdbc",

    "jdbc" : {

    "url" : "jdbc:oracle:thin:@//***.***.***.***:1521/***",

    "connection_properties" : {

    "oracle.jdbc.TcpNoDelay" : false,

    "useFetchSizeWithLongColumn" : false,

    "oracle.net.CONNECT_TIMEOUT" : 10000,

    "oracle.jdbc.ReadTimeout" : 50000

    },

    "user" : "pboss",

    "password" : "******",

    "sql" : "select std_addr_id as \"_id\",std_addr_id as \"std_addr_id\", name as \"door_name\", detail_name as \"detail_name\" from addr_std_addr",

    "index" : "addr",

    "type" : "std",

    "elasticsearch" : {

    "cluster" : "alpha-application",

    "host" : "10.10.100.104",

    "port" : 9300

    },

    "max_bulk_actions" : 20000,

    "max_concurrent_bulk_requests" : 10,

    "index_settings" : {

    "index" : {

    "number_of_shards" : 1,

    "number_of_replica" : 0

    }

    }

    }

    }

    ' | ${JAVA_HOME}/bin/java \

    -cp "${lib}/*" \

    -Dlog4j.configurationFile=${bin}/log4j2.xml \

    org.xbib.tools.Runner \

    org.xbib.tools.JDBCImporter

    上面的url即jdbc驱动的url,user和password是相应数据库的登录名密码。

    上面的脚本是一次性同步,实时同步需要加如一些参数。

    "interval":           "1800",这里是同步数据的频率1800s,半小时,可以按需要设成1s或其它

    "schedule" :          "0 0/60 0-23 ? * *",  同步数据任务 60分钟一次

    "flush_interval" :    "5s",   刷新间隔为5S 

    了解详情请登陆昆明达内Java培训官网(km.Java.tedu.cn)!

    推荐文章

上一篇:java培训老师分享:CSS基础{属性:值;}

下一篇:JavaScript中的原型和继承

最新开班日期  |  更多

Java--零基础全日制班

Java--零基础全日制班

开班日期:12/29

Java--零基础业余班

Java--零基础业余班

开班日期:12/29

Java--周末提升班

Java--周末提升班

开班日期:12/29

Java--零基础周末班

Java--零基础周末班

开班日期:12/29

  • 网址:http://km .java.tedu.cn      地址:昆明市官渡区春城路62号证券大厦附楼6楼
  • 课程培训电话:186 8716 1620      qq:2066486918    全国服务监督电话:400-827-0010
  • 服务邮箱 ts@tedu.cn
  • 2001-2016 达内国际公司(TARENA INTERNATIONAL,INC.) 版权所有 京ICP证08000853号-56