Elasticsearch是什么?
Elaticsearch简称为ES,是一个开源的可扩展的分布式的全文检索引擎,它可以近乎实时的存储、检索数据。本身扩展性很好,可扩展到上百台服务器,处理PB级别的数据。ES使用Java开发并使用Lucene作为其核心来实现索引和搜索的功能,但是它通过简单的RestfulAPI和javaAPI来隐藏Lucene的复杂性,从而让全文搜索变得简单。
起源:Shay Banon。2004年失业,陪老婆去伦敦学习厨师。失业在家帮老婆写一个菜谱搜索引擎。封装了lucene,做出了开源项目compass。找到工作后,做分布式高性能项目,再封装compass,写出了elasticsearch,使得lucene支持分布式。现在是Elasticsearch创始人兼Elastic首席执行官
Elasticsearch的功能
分布式:Elasticsearch自动将海量数据分散到多台服务器上去存储和检索
提供模糊搜索等自动度很高的查询方式,并进行相关性排名,高亮等功能
电商网站,最近一周笔记本电脑这种商品销量排名top10的商家有哪些?新闻网站,最近1个月访问量排名top3的新闻板块是哪些
海量数据的处理:因为是分布式架构,Elasticsearch可以采用大量的服务器去存储和检索数据,自然而然就可以实现海量数据的处理。近实时指的是Elasticsearch可以实现秒级别的数据搜索和分析
Elasticsearch的特点
使用场景
如电商网站、招聘网站、新闻资讯类网站、各种app内的搜索。
经典的ELK组合(Elasticsearch/Logstash/Kibana),可以完成日志收集,日志存储,日志分析查询界面基本功能,目前该方案的实现很普及,大部分企业日志分析系统使用了该方案。
例如电商价格预警,在支持的电商平台设置价格预警,当优惠的价格低于某个值时,触发通知消息,通知用户购买。数据分析常见的比如分析电商平台销售量top 10的品牌,分析博客系统、头条网站top10关注度、评论数、访问量的内容等等。
比如大型零售超市,需要分析上一季度用户消费金额,年龄段,每天各时间段到店人数分布等信息,输出相应的报表数据,并预测下一季度的热卖商品,根据年龄段定向推荐适宜产品。Elasticsearch执行数据分析和挖掘,Kibana做数据可视化。
常见案例
Elasticsearch VS Solr
Lucene是Apache基金会维护的一套完全使用Java编写的信息搜索工具包(Jar包),它包含了索引结构、读写索引工具、相关性工具、排序等功能,因此在使用Lucene时仍需要我们自己进一步开发搜索引擎系统,例如数据获取、解析、分词等方面的东西。
注意:Lucene只是一个框架,我们需要在Java程序中集成它再使用。而且需要很多的学习才能明白它是如何运行的,熟练运用Lucene非常复杂。
Solr是一个有HTTP接口的基于Lucene的查询服务器,是一个搜索引擎系统,封装了很多Lucene细节,Solr可以直接利用HTTP GET/POST请求去查询,维护修改索引
Elasticsearch也是一个建立在全文搜索引擎 Apache Lucene基础上的搜索引擎。采用的策略是分布式实时文件存储,并将每一个字段都编入索引,使其可以被搜索。
总结:
https://www.elastic.co/cn/downloads/past-releases/elasticsearch-7-3-0
node.name: node-1network.host: 192.168.211.136## Set a custom port for HTTP:#http.port: 9200cluster.initial_master_nodes: ["node-1"]可以调整里面的Xms和Xmx
3. 添加es用户(es默认root用户无法启动)
useradd estest#修改密码passwd estestchown -R estest /usr/elasticsearch/#末尾添加vm.max_map_count=655360修改完执行sysctl -p,让其生效
sysctl -p#末尾添加* soft nofile 65536* hard nofile 65536* soft nproc 4096* hard nproc 4096#末尾添加* hard nproc 4096重新登录或重启服务器使配置生效。
#切换用户su estest#启动bin/elasticsearchhttp://192.168.56.115:9200/

测试ok,安装成功!!!
什么是Kibana?
Kibana是一个基于Node.js的Elasticsearch索引库数据统计工具,可以利用Elasticsearch的聚合功能,生成各种图表,如柱状图、线状图、饼图等。而且还提供了操作Elasticsearch索引数据的控制台,并且提供了一定的API提示,非常有利于我们学习Elasticsearch的语法。
安装Kibana
https://www.elastic.co/cn/downloads/kibana
root账户下操作:
chown -R estest /usr/local/kibana-7.3.0-linux-x86_64chmod -R 777 /usr/local/kibana-7.3.0-linux-x86_64server.port: 5601server.host: "0.0.0.0"# The URLs of the Elasticsearch instances to use for all your queries.elasticsearch.hosts: ["http://192.168.211.136:9200"]su estestbin/kibana访问地址: http://192.168.56.115:5601
后续的操作我们可以使用kibana来访问es:
KAnalyzer是一个开源的,基于java语言开发的轻量级的中文分词工具包。从2006年12月推出1.0版开始,IKAnalyzer已经推出了3个大版本。最初,它是以开源项目Lucene为应用主体的,结合词典分词和文法分析算法的中文分词组件。新版本的IKAnalyzer3.0则发展为面向Java的公用分词组件,独立于
Lucene项目,同时提供了对Lucene的默认优化实现。
插件安装方式
bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.3.0/elasticsearch-analysis-ik-7.3.0.zip安装包安装方式
下载 https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.3.0/elasticsearch-analysis-ik-7.3.0.zip
在es安装目录下的plugins目录下新建analysis-ik目录
#新建analysis-ik文件夹mkdir analysis-ik#切换至 analysis-ik文件夹下cd analysis-ik#上传资料中的 elasticsearch-analysis-ik-7.3.0.zip#解压unzip elasticsearch-analysis-ik-7.3.3.zip#解压完成后删除ziprm -rf elasticsearch-analysis-ik-7.3.0.zip测试分词器
IK分词器有两种分词模式:ik_max_word和ik_smart模式
示例:
POST _analyze{"analyzer": "ik_max_word","text": "南京市长江大桥"}得到结果如下:
{ "tokens" : [ { "token" : "南京市", "start_offset" : 0, "end_offset" : 3, "type" : "CN_WORD", "position" : 0 }, { "token" : "南京", "start_offset" : 0, "end_offset" : 2, "type" : "CN_WORD", "position" : 1 }, { "token" : "市长", "start_offset" : 2, "end_offset" : 4, "type" : "CN_WORD", "position" : 2 }, { "token" : "长江大桥", "start_offset" : 3, "end_offset" : 7, "type" : "CN_WORD", "position" : 3 }, { "token" : "长江", "start_offset" : 3, "end_offset" : 5, "type" : "CN_WORD", "position" : 4 }, { "token" : "大桥", "start_offset" : 5, "end_offset" : 7, "type" : "CN_WORD", "position" : 5 } ]}扩展词典
分词结果没有我们想要的时候,可以自己扩展。如:南京市长江大桥,它的语义是南京市市长叫“江大桥”。
vim my_ext_dict.dic内容输入:江大桥
2. 将我们的自定义扩展文件配置上
vim IKAnalyzer.cfg.xml<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd"><properties> <comment>IK Analyzer 扩展配置</comment> <!--用户可以在这里配置自己的扩展字典 --> <entry key="ext_dict">my_ext_dict.dic</entry> <!--用户可以在这里配置自己的扩展停止词字典--> <entry key="ext_stopwords"></entry> <!--用户可以在这里配置远程扩展字典 --> <!-- <entry key="remote_ext_dict">words_location</entry> --> <!--用户可以在这里配置远程扩展停止词字典--> <!-- <entry key="remote_ext_stopwords">words_location</entry> --></properties>停用词配置同理。
同义词典使用
同一个东西有不同的词语来表示。我们搜索的时候期望输入"土豆",能搜出"洋芋",输入"西红柿"能搜出"番茄"等等。
Elasticsearch 自带一个名为 synonym 的同义词 filter。为了能让 IK 和 synonym 同时工作,我们需要定义新的analyzer,用IK做tokenizer,synonym做filter。
西红柿,番茄{ "settings":{ "analysis":{ "filter":{ "word_sync":{ "type":"synonym", "synonyms_path":"analysis-ik/synonym.txt" } }, "analyzer":{ "ik_sync_max_word":{ "filter":[ "word_sync" ], "type":"custom", "tokenizer":"ik_max_word" }, "ik_sync_smart":{ "filter":[ "word_sync" ], "type":"custom", "tokenizer":"ik_smart" } } } }, "mappings":{ "properties":{ "字段名":{ "type":"字段类型", "analyzer":"ik_sync_smart", "search_analyzer":"ik_sync_smart" } } }}以上配置定义了ik_sync_max_word和ik_sync_smart这两个新的analyzer,对应IK的ik_max_word和ik_smart两种分词策略。
示例如下:
PUT /test-synonym{ "settings":{ "analysis":{ "filter":{ "word_sync":{ "type":"synonym", "synonyms_path":"analysis-ik/synonym.txt" } }, "analyzer":{ "ik_sync_max_word":{ "filter":[ "word_sync" ], "type":"custom", "tokenizer":"ik_max_word" }, "ik_sync_smart":{ "filter":[ "word_sync" ], "type":"custom", "tokenizer":"ik_smart" } } } }, "mappings":{ "properties":{ "name":{ "type":"text", "analyzer":"ik_sync_smart", "search_analyzer":"ik_sync_smart" } } }}POST /test-synonym/_doc/1{ "name":"我喜欢吃番茄"}POST /test-synonym/_search{ "query":{ "match":{ "name":"西红柿" } }}