什么是elasticsearch?
    elasticsearch是一款非常强大的开源搜索引擎,可以帮助我们从海量数据中快速找到需要的内容
    elasticsearch结合kibana、Logstash、Beats,也就是elastic stack(ELK)。被广泛应用在日志数据分析、实时监控等领域
    elasticsearch是elastic stack的核心,负责存储、搜索、分析数据

    1999年一个秃顶研发了Lucence
    Lucene是一个Java语言的搜索引擎类库,是Apache公司的顶级项目
    Lucene的优势:
    •易扩展
    •高性能(基于倒排索引)
    Lucene的缺点:
    •只限于Java语言开发
    •学习曲线陡峭
    •不支持水平扩展

    一个光头基于Lucene开发了Elasticsearch
    相比与lucene,elasticsearch具备下列优势:
    •支持分布式,可水平扩展
    •提供Restful接口,可被任何语言调用

    搜索引擎技术排名:
    1.Elasticsearch:开源的分布式搜索引擎
    2.Splunk:商业项目
    3.Solr:Apache的开源搜索引擎

    什么是elastic stack(ELK)?
    是以elasticsearch为核心的技术栈,包括beats、Logstash、kibana、elasticsearch
    什么是Lucene?
    是Apache的开源搜索引擎类库,提供了搜索引擎的核心API

    正向索引和倒排索引
    正向索引
    传统数据库(如MySQL)采用正向索引,•基于文档id创建索引。查询词条时必须先找到文档,而后判断是否包含词条

    倒排索引
    elasticsearch采用倒排索引:
    •文档(document):每条数据就是一个文档
    •词条(term):文档按照语义分成的词语
    •对文档内容分词,对词条创建索引,并记录词条所在文档的信息。查询时先根据词条查询到文档id,而后获取到文档

    elasticsearch中的一些概念
    文档:
    elasticsearch是面向文档存储的,可以是数据库中的一条商品数据,一个订单信息。
    文档数据会被序列化为json格式后存储在elasticsearch中。

    索引(index):相同类型的文档的集合
    映射(mapping):索引中文档的字段约束信息,类似表的结构约束
    image.png
    CRUD是指增Create 删Delete 改Updete 查Retrieve

    elasticsearch与数据库的关系:
    •数据库负责事务类型操作
    •elasticsearch负责海量数据的搜索、分析、计算

    安装elasticsearch(9200)、kibana(5601)
    参考课前资料中的文档
    kibana可以给我们提供一个elasticsearch的可视化界面
    登陆之后菜单列表下拉找Dev Tools选项用来执行DSL语句
    es默认的standard分词器对中文分词不友好(词语无法识别)
    在es容器里安装ik分词插件
    IK分词器包含两种模式:

    • ik_smart:最少切分
    • ik_max_word:最细切分

    ik分词器-拓展词库
    要拓展ik分词器的词库,只需要修改一个ik分词器目录中的config目录中的IkAnalyzer.cfg.xml文件
    image.png
    然后在名为ext.dic的文件中,添加想要拓展的词语即可:
    传智播客
    奥力给

    ik分词器-停用词库
    也是在那个文件里添加一条配置
    image.png
    然后在名为stopword.dic的文件中,添加想要拓展的词语即可

    分词器的作用是什么?
    •创建倒排索引时对文档分词
    •用户搜索时,对输入的内容分词
    IK分词器有几种模式?
    •ik_smart:智能切分,粗粒度
    •ik_max_word:最细切分,细粒度
    IK分词器如何拓展词条?如何停用词条?
    •利用config目录的IkAnalyzer.cfg.xml文件添加拓展词典和停用词典
    •在词典中添加拓展词条或者停用词条

    索引库操作
    mapping属性
    mapping是对索引库中文档的约束,常见的mapping属性包括:
    •type:字段数据类型
    •index:是否创建索引,默认为true
    •analyzer:使用哪种分词器
    •properties:该字段的子字段

    type常见的简单类型有:
    •字符串:text(可分词的文本)、keyword(精确值,例如:品牌、国家、ip地址)
    •数值:long、integer、short、byte、double、float、
    •布尔:boolean
    •日期:date
    •对象:object

    创建索引库:PUT /索引库名称
    查看索引库:GET/索引库名
    删除索引库:DELETE/索引库名
    修改索引库:PUT /索引库名/_mapping
    索引库和mapping一旦创建无法修改,但是可以添加新的字段
    PUT /索引库名/_mapping
    {
    “properties”: {
    “新字段名”:{
    “type”: “integer”
    }
    }
    }

    文档操作
    •创建文档:POST /索引库名/_doc/文档id { json文档 }
    •查询文档:GET /索引库名/_doc/文档id
    •删除文档:DELETE /索引库名/_doc/文档id
    •修改文档:
    •全量修改:PUT /索引库名/_doc/文档id { json文档 }
    •增量修改:POST /索引库名/_update/文档id { “doc”: {字段}}

    RestClient操作索引库和文档
    什么是RestClient?
    RESTClient是一款用于测试各种Web服务的插件,它可以向服务器发送各种HTTP请求(用户也可以自定义请求方式),并显示服务器响应。
    利用JavaRestClient实现创建、删除索引库,判断索引库是否存在

    索引库操作的基本步骤:
    •初始化RestHighLevelClient
    •创建XxxIndexRequest。XXX是Create、Get、Delete
    •准备DSL( Create时需要)
    •发送请求。调用RestHighLevelClient#indices().xxx()方法,xxx是create、exists、delete
    image.png
    image.png
    文档操作的基本步骤:
    •初始化RestHighLevelClient
    •创建XxxRequest。XXX是Index、Get、Update、Delete
    •准备参数(Index和Update时需要)
    •发送请求。调用RestHighLevelClient#.xxx()方法,xxx是index、get、update、delete
    •解析结果(Get时需要)

    MySQL与Elasticsearch有什么差别呢?

    两者都是数据库,都能提供数据的CRUD
    mysql是关系型数据库,具有ACID的事务特性能够保证数据的一致性,
    不过当数据量大 并发量高时 性能较差 无法应对高效复杂的查询业务
    es主要就是为海量数据的实时搜索而设计的,底层采用倒排索引 能够快速的实现
    海量数据复杂搜索 ,但不支持事务
    所以在我们项目中, mysql用于维护项目中的核心数据
    而 es则用于项目中核心数据搜索实现
    也可以 用于存储项目中的所有日志信息

    Elasticsearch的文档操作API有什么样的规律?

    思考面试题:
    es介绍及作用?
    基于lucene开发的全文搜索引擎
    并且操作API简单 易于上手
    扩展性强, 天生的分布式集群架构

    es和lucene的关系?
    ES是基于Lucene的,他的很多基础性组件都是由ApacheLucene提供的,而es则提供了更高层次的封装以及分布式方面的增强与扩展。

    倒排索引介绍?

    根据要检索的内容,创建词汇表,查询时 先查询词汇表,根据关键词得到对应的内容
    减少磁盘IO的次数
    词汇表一次创建 多次查询受益

    中文分词器介绍?
    IK Analyzer是一个开源的,基于java语言开发的轻量级的中文分词工具包
    IK分词器 有两种类型可选:
    ik_smart 精简切分 (搜索条件分词使用)
    ik_max_word 最细切分 (存储内容分词使用)
    不过IK分词器是基于词典来分词的, 一些新的热点词汇可能不认识,或者有些敏感词需要忽略 可以通过配置 扩展词词典 、 停顿词词典来实现

    如何扩展新词 如何忽略停顿词?

    这些词典用户都可以自行扩展,只需要配置IKAnalyzer.cfg.xml文件即可
    添加一条忽略字典的配置字典文件名加后缀
    在对应的文件里添加需要忽略的词语
    重启es和kibana服务

    mysql和es 对比?

    两者都是数据库,都能提供数据的CRUD
    mysql是关系型数据库,具有ACID的事务特性能够保证数据的一致性,
    不过当数据量大 并发量高时 性能较差 无法应对高效复杂的查询业务
    es主要就是为海量数据的实时搜索而设计的,底层采用倒排索引 能够快速的实现
    海量数据复杂搜索 ,但不支持事务
    所以在我们项目中, mysql用于维护项目中的核心数据
    而 es则用于项目中核心数据搜索实现
    也可以 用于存储项目中的所有日志信息

    java中如何操作es?

    es官方提供了java的客户端 ,引入后即可使用

    1. // 1. 引入依赖:<br /> <dependency><br /> <groupId>org.elasticsearch.client</groupId><br /> <artifactId>elasticsearch-rest-high-level-client</artifactId><br /> </dependency><br /> <br /> <br /> // 2. 初始化客户端: <br /> client = new RestHighLevelClient(RestClient.builder(<br /> HttpHost.create("http://192.168.200.130:9200")<br /> ));<br />
    2. // 3.1. 先创建请求对象 CreateIndexRequest<br /> CreateIndexRequest request = new CreateIndexRequest("hotel");<br /> // 请求设置参数: 索引库名称 映射json字符串<br /> // 3.2. 调用客户端执行对应得请求 client.indices().create(); client.delete()<br /> CreateIndexResponse response = client.indices().create(request, RequestOptions.DEFAULT);<br /> // 3.3. 解析相应结果<br /> System.out.println(response.isAcknowledged()?"创建成功":"创建失败");