安装Elasticsearch 全文搜索/大数据分析

发布时间:2026/7/24 17:37:53
安装Elasticsearch 全文搜索/大数据分析 ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎基于RESTful web接口。Elasticsearch是用Java开发的并作为Apache许可条款下的开放源码发布是当前流行的企业级搜索引擎。设计用于云计算中能够达到实时搜索稳定可靠快速安装使用方便。Elasticsearch的应用场景一个线上商城系统用户需要搜索商城上的商品。在这里你可以用es存储所有的商品信息和库存信息用户只需要输入”空调”就可以搜索到他需要搜索到的商品。一个运行的系统需要收集日志用这些日志来分析、挖掘从而获取系统业务未来的趋势。你可以用logstashELK中的一个产品elasticsearch/logstash/kibana收集、转换你的日志并将他们存储到es中。一旦数据到达es中就你可以在里面搜索、运行聚合函数等操作来挖掘任何你感兴趣的信息。如果你有想基于大量数据数百万甚至数十亿的数据快速调查、分析并且要将分析结果可视化的需求。你可以用es来存储你的数据用kibana构建自定义的可视化图形、报表为业务决策提供科学的数据依据。安装ElasticSearch版本说明ES5 需要 Java 8 及以上的版本。ES7 开始内置了 Java 环境首先确认下jdk有没有安装java -version下载源文件解压重新建一个用户将目录的所属组修改为此用户因为 elasticsearch 无法用 root 用户启动。wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.3.0.tar.gz tar zxvf elasticsearch-6.3.0.tar.gz useradd elasticsearch passwd elasticsearch chown -R elasticsearch:elasticsearch elasticsearch-6.3.0 cd elasticsearch-6.3.0 ./bin/elasticsearch // 启动 ./bin/elasticsearch -d //后台启动 cd config vim jvm.options # 修改参数如下(服务器小不配大容量) -Xms256m -Xmx256m可能存在问题Exception in thread main java.nio.file.AccessDeniedException: /usr/local/src/elasticsearch-6.3.0/config/jvm.options at sun.nio.fs.UnixException.translateToIOException(UnixException.java:84) at sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:102) at sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:107) at sun.nio.fs.UnixFileSystemProvider.newByteChannel(UnixFileSystemProvider.java:214) at java.nio.file.Files.newByteChannel(Files.java:361) at java.nio.file.Files.newByteChannel(Files.java:407) at java.nio.file.spi.FileSystemProvider.newInputStream(FileSystemProvider.java:384) at java.nio.file.Files.newInputStream(Files.java:152) at org.elasticsearch.tools.launchers.JvmOptionsParser.main(JvmOptionsParser.java:58)报这个错是因为用户的权限不足因此在配置和启动ElasticSearch节点的时候要注意给用户赋予对应的权限chown -R myuser:myuser /usr/local/src/elasticsearch-6.3.0连接Elasticsearch1、Elasticsearch开启之后可以直接通过http://127.0.0.1:9200/查看基本信息。{ name: iEX7av1, cluster_name: elasticsearch, cluster_uuid: 8TMqWFwnTLiBlRKtU7a8YQ, version: { number: 6.3.0, build_flavor: default, build_type: tar, build_hash: 424e937, build_date: 2018-06-11T23:38:03.357887Z, build_snapshot: false, lucene_version: 7.3.1, minimum_wire_compatibility_version: 5.6.0, minimum_index_compatibility_version: 5.0.0 }, tagline: You Know, for Search }安装中文分词 elasticsearch-analysis-ikik有两种分词模式ik_max_word,和ik_smart模式ik_max_word: 会将文本做最细粒度的拆分比如会将“中华人民共和国国歌”拆分为“中华人民共和国,中华人民,中华,华人,人民共和国,人民,人,民,共和国,共和,和,国国,国歌”会穷尽各种可能的组合ik_smart: 会做最粗粒度的拆分比如会将“中华人民共和国国歌”拆分为“中华人民共和国,国歌”。索引时为了提供索引的覆盖范围通常会采用ik_max_word分析器会以最细粒度分词索引搜索时为了提高搜索准确度会采用ik_smart分析器会以粗粒度分词。使用ik_max_word会占用更多的存储空间#在线安装 ./bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v6.3.0/elasticsearch-analysis-ik-6.3.0.zip #本地安装 ./bin/elasticsearch-plugin install file:///usr/local/src/elasticsearch-analysis-ik-6.3.0.zip安装好后 重启es会看到 加载了 ik分词了安装完毕后发现在ES的安装目录下的plugins目录下多了一个analysis-ik目录内容是ik的zip包解压后根目录下的所有文件一共是5个jar文件和1个properties配置文件另外ES的安装目录下的config目录下多了一个analysis-ik目录内容是ik的zip包解压后根目录下的config目录下所有文件用于放置ik的自定义词库可视化Elasticvue平台Windows / Mac / Linux 三端原生桌面 App 浏览器插件费用完全免费、开源 MIT 协议无任何功能阉割核心能力完美适配你的阿里云 ES支持账号密码认证、HTTPS、阿里云公网 ES 连接、IP 白名单环境索引可视化浏览、文档表格 / JSON 双视图、单条文档增删改查DSL 编辑器语法高亮、自动格式化、保存常用查询语句Mapping 查看 / 编辑、集群健康监控、分片状态、批量 Bulk 操作支持 ES 7.x/ 8.x 全版本兼容 OpenSearch适合人群日常查 CRM 客户文档、调试 DSL、多环境集群切换90% 开发者首选缺点重度集群监控图表不如 Kibana 专业安装KibanaKibana是一个针对Elasticsearch的开源分析及可视化平台用来搜索、查看交互存储在Elasticsearch索引中的数据。安装Kibana要装与ES相同的版本wget https://artifacts.elastic.co/downloads/kibana/kibana-6.3.0-linux-x86_64.tar.gz tar -zxvf kibana-6.3.0-linux-x86_64.tar.gz cd kibana-6.3.0-linux-x86_64 #启动Kibana ./bin/kibanahttp://localhost:5601访问web页面使用POSTMAN工具发送PUT请求创建ES的基本用法ES以RESTFul风格来命名API的, 其API的基本格式如下http://ip:port/索引/类型/文档idES的动作是以http方法来决定的: 常用的http方法: GET/PUT/POST/DELETEes支持多字段结构例如我们将常用的搜索条件和排序字段(销量时间)配置到mappings.properties中{ settings:{ number_of_shards: 3, number_of_replicas: 1 }, mappings:{ man:{ properties:{ word_count:{ type: integer }, author:{ type: keyword }, title:{ type: text }, publish_date:{ type: date, format: yyyy-MM-dd HH:mm:ss || yyyy-MM-dd || epoch_millis } } } } }如下图观察返回结果已经成功。插入文档PUT 127.0.0.1:9200/people/man{ name: chenjie, country: China, age: 30, date: 1994-09-27 }修改文档POST 127.0.0.1:9200/people/man/1/_update{ doc:{ name:chenjie_update } }删除文档DELETE 127.0.0.1:9200/people/man/1批量操作批量操作 bulk支持在一次 API 调用中对不同的索引进行操作支持四种类型操作Index/Create/Update/Delete可以在 URI 中指定 Index也可以在请求的 Payload 中进行单条操作失败并不会影响其他操作返回结果包括了每一条操作执行的结果测试命令POST _bulk { index : { _index : test, _id : 1 } } { field1 : value1 } { delete : { _index : test, _id : 2 } } { create : { _index : test2, _id : 3 } } { field1 : value3 } { update : {_id : 1, _index : test} } { doc : {field2 : value2} }使用PHPAPi构建和查询创建表和测试数据索引相当于MySQL中的表文档相当于 MySQL 中的行记录。程序在新增/修改/删除记录的时候调用ES的接口对ES文档进行同步的新增/修改/删除操作。同步构建有很大缺陷。比如ES宕机或者ES处理文档消耗了很长的时间影响用户的体验。可以使用KaFka中间件来进行异步构建文档。在 composer.json 文件中引入 elasticsearch-php{ require: { elasticsearch/elasticsearch: ~6.0 } }CREATE TABLE articles ( id INT NOT NULL PRIMARY KEY auto_increment, title VARCHAR ( 200 ) NOT NULL COMMENT 标题, content text COMMENT 内容 ); INSERT INTO articles ( title, content ) VALUES ( Laravel 测试1, Laravel 测试文章内容1 ), ( Laravel 测试2, Laravel 测试文章内容2 ), ( Laravel 测试3, Laravel 测试文章内容3 );实例化require ./vendor/autoload.php; use Elasticsearch\ClientBuilder; $client ClientBuilder::create()-build();elasticsearch的动态性质在添加第一个文档的时候自动创建了索引和一些默认设置。创建索引$params[index] articles_index; $params[body][settings][number_of_shards] 2; $params[body][settings][number_of_replicas] 0; $client-indices()-create($params);将文档加入索引foreach ($lists as $row) { $params [ body [ id $row[id], title $row[title], content $row[content] ], id article_ . $row[id], //maping db id index articles_index, type articles_type ]; $client-index($params); }从索引中获取文档$params [index articles_index, type articles_type, id articles_1]; $res $client-get($params); print_r($res);删除索引$params [ index articles_index ]; $res $client-indices()-delete($params); print_r($res);搜索文档,如果需要获取更多明细信息可以根据mysql表ID获取?php $params [index articles_index, type articles_type]; $params[body][query][match][content] Laravel; $params[body][size] 10; $params[body][from] 200; $params[body][sort] [content [order desc]]; $res $client-search($params); print_r($res); //相当于sql语句select * from articles where contentLaravel limit 200,10 order by content desc;从索引中删除文档$params [index articles_index, type articles_type, id articles_1]; $res $client-delete($params); print_r($res);Elasticsearch更新和删除文档的过程。删除和更新也都是写操作但是Elasticsearch中的文档是不可变的因此不能被删除或者改动以展示其变更磁盘上的每个段都有一个相应的.del文件。当删除请求发送后文档并没有真的被删除而是在.del文件中被标记为删除。该文档依然能匹配查询但是会在结果中被过滤掉。当段合并时在.del文件中被标记为删除的文档将不会被写入新段。在新的文档被创建时Elasticsearch会为该文档指定一个版本号当执行更新时旧版本的文档在.del文件中被标记为删除新版本的文档被索引到一个新段。旧版本的文档依然能匹配查询但是会在结果中被过滤掉。ElasticSearch搜索term和terms的区别在查询的字段只有一个值的时候应该使用term而不是terms在查询字段包含多个的时候才使用terms(类似于sql中的in、or)使用terms语法JSON中必须包含数组。第一种(单个值,term){ query:{ bool:{ must:[ { range:{ update_time:{ gt:1488556800000 } } }, { term:{ lang:1 } }, { terms:{ domain:[ dailymasala.co, goldenmob.com ] } }, { prefix:{ user_id:errVideo_setInterval_ } } ] } }, from:0, size:10 }第二种(数组形式,terms){ query: { bool: { must: [ { range: { update_time: { gt: 1488556800000 } } }, { terms: { lang: [1] } }, { terms: { domain: [ dailymasala.co, goldenmob.com ] } }, { prefix: { user_id: errVideo_setInterval_ } } ] } }, from: 0, size: 10 }elasticsearch 中term与match区别term是代表完全匹配也就是精确查询搜索前不会再对搜索词进行分词所以我们的搜索词必须是文档分词集合中的一个。比如说我们要找标题为北京奥运的所有文档match查询会先对搜索词进行分词,分词完毕后再逐个对分词结果进行匹配因此相比于term的精确搜索match是分词匹配搜索。要搜索词的分词集合中的一个或多个存在于文档中即可例如当我们搜索中国杭州搜索词会先分词为中国和杭州,只要文档中包含搜索和杭州任意一个词都会被搜索到。对于match搜索可以按照分词后的分词集合的or或者and进行匹配默认为orcurl -XGET http://localhost:9200/index/doc/_search?pretty -d { query: { match: { content: { query: 中国世界, operator: and } } } }ES性能优化{ settings:{ number_of_shards: 3, number_of_replicas: 1, index.store.type: niofs, index.query.default_field: content, index.unassigned.node_left.delayed_timeout: 5m, }, mappings:{ man:{ dynamic:true, _all:{enabled:false}, properties:{ } } } }安全控制可以使用apache/nginx的http认证在 Elasticsearch 中写入和打开一个新段的轻量的过程叫做refresh。 默认情况下每个分片会每秒自动刷新一次。这就是为什么我们说 Elasticsearch 是近实时搜索: 文档的变化并不是立即对搜索可见但会在一秒之内变为可见.更新延迟问题:搜索时加上?refreshwait_for表示如果1秒内有请求立即更新并可见。