Elasticsearch一篇入门

Elasticsearch 介绍

结合官方文档介绍

  1. Elasticsearch是一个基于Apache Lucene的开源搜索引擎。ES不仅包括了全文搜索功能,还拥有分布式搜索的功能。当然,ES虽然是基于Lucene开发,但相对于Lucene复杂程度,ES提供了简单的RESTful API用来隐藏Lucene的复杂性,使得ES操作变得简单很多。
  2. ES的功能:
    1. 兼容了Lucene和全文搜索的功能。
    2. 拥有分布式的实时文件存储的功能,每个字段都被索引并可被搜索
    3. 分布式的实时分析搜索引擎
    4. 可以扩展到上百台服务器,处理PB级结构化或非结构化数据
  3. 而且,所有的这些功能被集成到一个服务里面,你的应用可以通过简单的RESTful API、各种语言的客户端甚至命令行与之交互。
  4. 上手Elasticsearch非常容易。它提供了许多合理的缺省值,并对初学者隐藏了复杂的搜索引擎理论。它开箱即用(安装即可使用),只需很少的学习既可在生产环境中使用。

以上总结:ES是基于Lucene的开源搜索引擎,它封装了RESTful API简化了操作,容易上手。兼容了全文搜索的功能,添加了分布式的存储及搜索功能,可扩展到上百台服务器处理PB级数据。

参考文章:
Elasticsearch权威指南(中文版)

Lucene、Solr、Elasticsearch的区别

Lucene是一个开放源代码的全文检索引擎工具包,提供了完整的查询引擎和索引引擎。Lucene可以被认为是迄今为止最先进、性能最好的、功能最全的搜索引擎库。Lucene在搜索引擎的领域就相当于Spring框架一般,是Solr和ES的前身。

Solr是一个高性能,采用Java5开发,基于Lucene的全文搜索服务器。同时对其进行了扩展,它对外提供类似于Web-service的API接口。相当于Lucene的扩展版。而且,Solr与Lucene最大的区别便是Solr是一个独立的应用程序。

ES则是作为分布式搜索引擎的使用,提供了分布式的解决方案,对处理的数据量进行了扩展,可达到亿级数据的搜索。

Solr与ES对比

特征Solr/SolrCloudElasticsearch
社区和开发者Apache 软件基金和社区支持单一商业实体及其员工
节点发现Apache Zookeeper,在大量项目中成熟且经过实战测试Zen内置于Elasticsearch本身,需要专用的主节点才能进行分裂脑保护
碎片放置本质上是静态,需要手动工作来迁移分片,从Solr 7开始 - Autoscaling API允许一些动态操作动态,可以根据群集状态按需移动分片
高速缓存全局,每个段更改无效每段,更适合动态更改数据
分析引擎性能非常适合精确计算的静态数据结果的准确性取决于数据放置
全文搜索功能基于Lucene的语言分析,多建议,拼写检查,丰富的高亮显示支持基于Lucene的语言分析,单一建议API实现,高亮显示重新计算
DevOps支持尚未完全,但即将到来非常好的API
非平面数据处理嵌套文档和父-子支持嵌套和对象类型的自然支持允许几乎无限的嵌套和父-子支持
查询DSLJSON(有限),XML(有限)或URL参数JSON
索引/收集领导控制领导者安置控制和领导者重新平衡甚至可以节点上的负载不可能
机器学习内置 - 在流聚合之上,专注于逻辑回归和学习排名贡献模块商业功能,专注于异常和异常值以及时间序列数据

以上总结:Solr是Lucene面向于企业搜索的扩展,是一个独立的应用程序,相对ES更加成熟;ES是Lucene分布式搜索的扩展,是针对于分布式亿级数据量的搜索引擎。

参考文章:
全文搜索引擎 ElasticSearch 还是 Solr? and
Lucene 和solr的区别

推荐文章:
全文索引Elasticsearch,Solr,Lucene

基本类型

ES的存储类型以JSON格式为主。

例如:

{
    "name" : "xiaoming",
    "sex" : "man",
    "age" : 18,
    "birthDate": "2001/05/01"
}

在搜索时,传入对应的RESTful风格的JSON进行搜索。

搜索实例:

POST _search
{
    "name" : "ming"
}

更多语法:
Elasticsearch入门教程

索引

取舍

首先,我们需要知道ES采用的索引是倒排索引,相对于B-Tree索引,在查询速度上提升了很多。当然,有取必有舍,倒排索引虽然提高了搜索的性能,却牺牲了其他的一些性能,例如插入与更新。

B-Tree索引与倒排索引

B-Tree

B-Tree作为一个常用的数据结构,是由二叉树到红黑树再到B-Tree发展而来。二叉树的查询效果是logN,在插入新节点时不用移动全部节点,所以能同时兼容插入与查询的性能。传统的关系型数据库便是在这个基础上结合了磁盘的顺序读/随机读的特性,以B-Tree/B+Tree作为数据结构的:

在这里插入图片描述

倒排索引

倒排索引,举例说,它就如同一个字典。在我们查某个汉字的时候,首先我们会去查这个字母的首字母,然后再去找这个字的全拼,最后就可以得到这个全拼在字典中的位置都有哪些了。前人智慧令人拜服,这样查询的速度也许在一本新华字典中看不出来多少的效率,但若是上亿条数据呢?

首先,我们来了解一下倒排索引的构成:

我们需要一张实例表:

nameagesex
xiaoming18man
xiaohong17woman
xiaoli17man
  1. Posting List

    posting list就是一个int类型的数组,它会为存入的JSON格式的序号。如实例表中,posting list会为每条数据加入一个自建id,就如同字典的目录一样,示例如下:

    name

    tremposting list
    xiaoming1
    xiaohong2
    xiaoli3

    age

    tremposting list
    181
    17[2,3]

    sex

    tremposting list
    man[1,3]
    woman2

    综上表展示,我们发现针对于数据每个字段的不同值,posting list都为我们做好了筛选。但 如果是上万条数据呢?而且我们需要查询的还是name呢?

    所以,我们还需要结合其他的数据结构一起处理这方面的问题。

  2. Trem Index

    B-Tree通过减少磁盘的遍历次数来提高查询效率,ES对于这样大大提升查询速度的数据结构怎么可能不引入呢?但是,相对于B-Tree不同的是,ES查询查询的数据量是特别大的,这样一来trem就会特别多,term dictionary也会相对的特别大,那么,B-Tree这种通过内存查询的思路显然便成了不可取的了。
    于是ES便相对的出现了Trem Index,正是我们上面所说的字典目录了:
    在这里插入图片描述

  3. FST压缩技巧

    距离来说,如果我们需要存储一个Map集合的数据,那么它最简单的定义将是Map<String,intager="">,那如果从占用内存的角度去想,节省更多的内存就需要用到FST压缩技术了。

    首先,举例来说,我们的Map中有70,73,80,205,223,103这几个值,为了提高搜索效率,FST对其进行了压缩,变成了73,3,7,125,18,-120。规律便是采用了递增,只需要保存递增值即可。之后,再精打细算通过bit排队存储,为何精打细算?就是为了避免例如有如上例子中的3这个值也要存储int(4字节)的浪费。

  4. Roaring bitmaps

    Roaring bitmaps是由数据结构bitmap发展而来。举例来说,有个posting list:
    [1,2,3,5,7,10]
    它对应的bitmaps便是:
    [1,1,1,0,1,0,1,0,0,1]
    通过观察,我们可以简单的发现这个数据结构递增的规律。但是,bitmaps的缺点是存储空间会随着文档个数线性增长,但Roaring bitmaps打破了这一点。
    在这里插入图片描述

    如上图,Roaring bitmaps采用2字节的最大数65535(2^16-1)为范围,以<商,余数>的结构对数据进行存储。

  5. 联合索引中的倒排

    如果是联合索引,则利用跳表的数据结构快速做‘与’运算。
    在这里插入图片描述

    参考文章:Elasticsearch-基础介绍及索引原理分析

ES的安装

  1. 首先,去ES官网下载安装包:ES官网下载

    或者在Linux中直接使用命令:

    wget https://artifacts.elastic.co/downloads/elasticsearch/  elasticsearch-6.0.0.tar.gz
    
  2. 之后的Linux操作:

    #创建文件夹
    mkdir elasticsearch
    #移动安装包
    mv elasticsearch-6.0.0.tar.gz /elasticsearch
    #解压
    tar -zxvf elasticsearch-6.0.0.tar.gz
    

    ES目录(仅了解):

    bin/
    config/ //ES配置文件的目录
    lib/ //依赖的第三方库的目录
    LICENSE.txt
    modules/ //模块目录
    NOTICE.txt
    plugins/ //第三方插件的目录
    README.textile
    

    *确保有JDK1.8环境,这点很重要。另外,使用Oracle JDK的注意Oracle有认证,建议先下载安装包再解压。

  3. 执行:

    sh ./ bin/elasticsearch
    
  4. 在浏览器输入

    127.0.0.1:9200
    

推荐文章:ES 入门之一 安装ElasticSearcha

该作者ES入门笔记:ElasticSearch 入门笔记

集群安装

  1. 配置Linux环境

    vim /etc/security/limits.conf
    * soft nofile 65536
    * hard nofile 65536
    
    vim /etc/sysctl.conf
    vm.max_map_count=262144
    sysctl -p
    
    vi /etc/security/limits.d/90-nproc.conf       
    1024-2048
    
  2. 修改es配置elasticsearch.yml

    cluster.name: my-application
    node.name: node-1
    path.data: /var/elasticsearch/data
    path.logs: /var/elasticsearch/logs
    network.host: 192.168.2.200
    http.port: 9200
    discovery.zen.ping.multicast.enabled: false
    discovery.zen.fd.ping_timeout: 100s
    discovery.zen.ping.timeout: 100s
    discovery.zen.minimum_master_nodes: 2
    discovery.zen.ping.unicast.hosts: ["192.168.2.200"]
    http.host: 192.168.2.200
    http.cors.enabled: true
    http.cors.allow-origin: "*"
    

    ps:集群相关的两个配置,network.host和discovery.zen.ping.unicast.hosts。es本身就支持集群,配置这两个配置后就实现了集群

    参考文章:es安装和应用

    *该篇文章写有kibana和IK分词的安装和扩展哦,膜拜了。

    SpringBoot整合ES

    首先,我们先要了解SpringBoot与ES的对应版本

    Spring Boot Version (x)Spring Data Elasticsearch Version (y)Elasticsearch Version (z)
    x <= 1.3.5y <= 1.3.4z <= 1.7.2*
    x >= 1.4.x2.0.0 <=y < 5.0.0**2.0.0 <= z < 5.0.0**

    所以,我们需要注意的便是SpringBoot与ES的版本,不要因为版本报错找不到原因哦。

    1. 添加依赖

      <!--ElasticSearch-->
      <dependency>
      	<groupId>org.springframework.boot</groupId>
      	<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
      </dependency>
      <!--需要引入transport-netty3-client,否则会启动报错-->
      <dependency>
          <groupId>org.elasticsearch.plugin</groupId>
          <artifactId>transport-netty3-client</artifactId>
          <version>5.6.10</version>
      </dependency>
      
    2. 在yml脚本或properties脚本中修改配置

      #Es地址
      es.hostName=localhost
      
      #Es端口号
      es.transport=9300
      
      #配置es的集群名称,默认是elasticsearch,es会自动发现在同一网段下的es,如果在同一网段        下有多个集群,就可以用这个属性来区分不同的集群
      es.cluster.name=elasticsearch
      
    3. 添加配置类

      import org.elasticsearch.client.transport.TransportClient;
      import org.elasticsearch.common.settings.Settings;
      import org.elasticsearch.common.transport.InetSocketTransportAddress;
      import org.elasticsearch.common.transport.TransportAddress;
      import org.elasticsearch.transport.client.PreBuiltTransportClient;
      import org.slf4j.Logger;
      import org.slf4j.LoggerFactory;
      import org.springframework.beans.factory.annotation.Value;
      import org.springframework.context.annotation.Bean;
      import org.springframework.context.annotation.Configuration;
      import org.springframework.context.annotation.PropertySource;
      
      import java.net.InetAddress;
      import java.net.UnknownHostException;
      
      /**
       * @Author Conn
       * @Date 2018/10/15
       */
      @Configuration
      @PropertySource(value = "classpath:config/elasticsearch.properties")
      public class ElasticSearchConfig {
          private static final Logger logger = LoggerFactory.getLogger(ElasticSearchConfig.class);
      
          @Value("${es.hostName}")
          private String hostName;
      
          @Value("${es.transport}")
          private Integer transport;
      
          @Value("${es.cluster.name}")
          private String clusterName;
      
          @Bean
          public TransportClient transportClient() {
              logger.info("ElasticSearch初始化开始");
      
              TransportClient transportClient = null;
      
              try {
                  TransportAddress transportAddress = new InetSocketTransportAddress(InetAddress.getByName(hostName), Integer.valueOf(transport));
      
                  //配置信息
                  Settings es = Settings.builder().put("cluster.name", clusterName).build();
      
                  //配置信息Settings自定义
                  transportClient = new PreBuiltTransportClient(es);
      
                  transportClient.addTransportAddress(transportAddress);
              } catch (UnknownHostException e) {
                  logger.error("ES创建错误", e);
              }
              return transportClient;
          }
      }
      

      参考文章:

      SpringBoot整合ElasticSearch详细过程

      SpringBoot整合ElasticSearch实现多版本的兼容

      另外推荐:

      Elasticsearch实战篇——Spring Boot整合ElasticSearch

      Elasticsearch 基础理论 & 配置调优

      大佬写的高级ES入门

      以上便是所有的ES讲解了,如果有不对的地方或者需要补充的地方欢迎大家留言。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值