前言

Elasticsearch 是一个分布式、可扩展、实时的搜索与数据分析引擎,通过它我们可以构建出一个强大的全文搜索系统,解决诸如文章检索慢,商品检索慢、MySQL的like查询慢这样的问题。Elasticsearch是基于hadoop创始人道哥的另一杰作Lucene实现的,速度非常快,核心是使用了倒排索引这样的结构。接下来,就以这篇倒排索引中的例子,演示一下ElasticSearch的使用

假设我们有海量文章,如下

页码 内容
1 生命在于运动
2 运动是生命的源泉
3 日复一日地坚持练下去吧,只有活动适量才能保持训练的热情和提高运动的技能.——塞涅卡
4 活动是生活的基础!——歌德
5 人的健全,不但靠饮食,尤靠运动
6 奥林匹克的格言是“更高,更快,更强”
7 身体的健康因静止不动而破坏,因运动练习而长期保持.——苏格拉底
8 chenqionghe喜欢运动,绳命是如此的精彩,绳命是如此的辉煌

我们想像这是千万级别的表,最后需要实现传入关键字,返回相应的文章 例如:搜索运动返回页码1,2,3,5,7,8对应的文章、搜索chenqionghe返回页码为8的文章

一、安装

1.安装es

查看官网地址,直接下载安装就行了ElasticSearch DownloadDownload ElasticSearch - A distributed RESTful Java search engine with support for real-time search analytics, built specifically for cloud computing infrastructureshttps://webscripts.softpedia.com/script/Search-Engines/ElasticSearch-70590.html

es依赖java环境,需要指定jdk版本,我们加入一下java相关环境变量

export JAVA_HOME=/Users/chenqionghe/web/elk/elasticsearch-7.6.1/jdk.app/Contents/Home/
export PATH=$JAVA_HOME/bin:$PATH

启动一下看看

./bin/elasticsearch

看到启动报错

uncaught exception in thread [main]
ElasticsearchException[Failure running machine learning native code. This could be due to running on an unsupported OS or distribution, missing OS libraries, or a problem with the temp directory. To bypass this problem by running Elasticsearch without machine learning functionality set [xpack.ml.enabled: false].]

解决办法,修改./config/elasticsearch.yml添加

 xpack.ml.enabled: false

再次启动,成功运行,画风如下

默认启动的是9200端口,我们来测试一下

➜ ~ curl localhost:9200

可以看到,es可以正常运行起来了

2.启动集群

一般es都是以集群的方式存在,接下我们演示一下启动集群。编辑./config/elasticsearch.yml,指定集群名称,集群名称我指定成了chenqionghe

cluster.name: chenqionghe

指定节点名称

ode.name: chenqionghe-1

设置初始化的节点

cluster.initial_master_nodes: ["chenqionghe-1"]

设置监听的端口,这里不限定ip,指定为0.0.0.0

network.host: 0.0.0.0

端口默认9200

http.port: 9200

添加支持elasticsearch-head界面参数

http.cors.enabled: true
http.cors.allow-origin: "*"
http.cors.allow-methods: OPTIONS, HEAD, GET, POST, PUT, DELETE
http.cors.allow-headers: "X-Requested-With, Content-Type, Content-Length, X-User"

再次启动

./bin/elasticsearch

3.安装管理界面

elasticsearch-head可以很方便的查看es集群状态,查看官网地址:elasticsearch-head

git clone git://github.com/mobz/elasticsearch-head.git
cd elasticsearch-head
npm install
npm run start

打开http://localhost:9100/,如下

4.安装分词插件

插件我们使用的是elasticsearch-analysis-ik,参考地址:elasticsearch-analysis-ik/

./bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.6.1/elasticsearch-analysis-ik-7.6.1.zip

验证一下分插件

curl -X POST "localhost:9200/_analyze?pretty" -H 'Content-Type: application/json' -d '{ "analyzer": "ik_smart", "text": "chenqionghe徒手健身" }'

可以看到,已经可以分词了,oh yeah~

二、使用

ES中有index、document、filed、mapping这样的概念,我们以MySQL的结构为参考对照一下,如下

ElasticSearch MySQL
index
document
field
mapping 表结构

Elasticsearch主要还是使用API,具体使用请参考:Document APIs

1.创建索引

这里index我取名叫book

➜ ~ curl -X PUT "localhost:9200/book" -H 'Content-Type: application/json' -d '{"mappings": {"properties": {"page": {"type": "long"},"content": {"type": "text","analyzer": "ik_max_word","search_analyzer": "ik_max_word"}}}
}'
{"acknowledged":true,"shards_acknowledged":true,"index":"book"}

创建成功,但是查看head界面,但是这个黄色不怎么优雅呀,原因是虽然启用了集群,但是还是单节点运行的,群集无法放置副本。

集群的健康状况为 yellow 则表示全部主分片(number_of_shards)都正常运行,但是副本分片没有全部处在正常状态,单节点无论有多少个副本分片(number_of_replicas)都是 unassigned ,它们都没有被分配到任何节点。在同一个节点上既保存原始数据又保存副本是没有意义的,因为一旦失去了那个节点,我们也将丢失该节点上的所有副本数据。我们需要把这个副本设置为0,因为索引一旦建立,分片数量不能变,我们需要删除再重新建立一下索引

curl -XDELETE http://localhost:9200/book
curl -X PUT "localhost:9200/book" -H 'Content-Type: application/json' -d '{"settings":{"number_of_shards": "1","number_of_replicas": "0"},"mappings": {"properties": {"page": {"type": "long"},"content": {"type": "text","analyzer": "ik_max_word","search_analyzer": "ik_max_word"}}}
}'

再次查看,健康了

2.插入数据

curl -X POST "localhost:9200/book/_doc/" -H 'Content-Type: application/json' -d '{"page":1,"content": "生命在于运动"
}'

我们可以看到已经成功插入一条数据

3.批量插入数据

curl -X POST "localhost:9200/book/_doc/_bulk?pretty"  -H 'Content-Type: application/json' -d'
{ "index":{} }
{ "page":2 , "content": "运动是生命的源泉"}
{ "index":{} }
{ "page":3 , "content": "日复一日地坚持练下去吧,只有活动适量才能保持训练的热情和提高运动的技能.——塞涅卡"}
{ "index":{} }
{ "page":4 , "content": "活动是生活的基础!——歌德"}
{ "index":{} }
{ "page":5 , "content": "人的健全,不但靠饮食,尤靠运动"}
{ "index":{} }
{ "page":6 , "content": "奥林匹克的格言是“更高,更快,更强”"}
{ "index":{} }
{ "page":7 , "content": "身体的健康因静止不动而破坏,因运动练习而长期保持.——苏格拉底"}
{ "index":{} }
{ "page":8 , "content": "chenqionghe喜欢运动,绳命是如此的精彩,绳命是如此的辉煌"}
'

可以看到成功批量插入

4.查询数据

  • 搜索chenqionghe

curl -s -X GET 'localhost:9200/book/_search?pretty' -H 'Content-Type: application/json' -d '{"query" : { "match" : { "content" : "chenqionghe" }}
}'|jq

可以看到匹配到了

  • 搜索运动,应该是会返回1,2,3,5,7,8这几条

curl -s -XGET 'localhost:9200/book/_search?pretty' -H 'Content-Type: application/json' -d '{"query" : { "match" : { "content" : "运动" }}
}'|jq .hits.hits|jq '.[]._source'

可以看到,验证通过

5.修改数据

拉下来,我们将chenqionghe这条记录的绳命改为生命

curl -X POST "localhost:9200/book/_doc/HFn_2XABkofzJYzpQIy4" -H 'Content-Type: application/json' -d '{"page":8,"content": "chenqionghe喜欢运动,生命是如此的精彩,生命是如此的辉煌"
}'

可以看到,更新成功

6.删除数据

  • 根据id删除

curl -X DELETE "localhost:9200/book/_doc/GFn_2XABkofzJYzpQIy4"
  • 根据条件删除

curl -X POST "localhost:9200/book/_delete_by_query?pretty" -H 'Content-Type: application/json' -d'
{"query": {"match": {"content": "chenqionghe"}}
}
'

7.索引关闭和开启

如果关闭了一个索引,就无法通过ES来读取和写入其中的数据,直到道再次打开它

# 关闭
curl -XPOST 'localhost:9200/book/_close'
# 开启
curl -XPOST 'localhost:9200/book/_open'

总结

通过Elasticsearch,我们可以快速构建出一个强大的全文搜索系统,安装简单,通过API使用也简单。倒排索引为搜索而生,先对需要索引的字段进行分词,再通过词直接匹配出文档,速度非常快,这是优点。但是,相比数据库采用的 B 树索引,它的写入和更新性能都比较差,因此倒排索引也只是适合全文搜索,不适合更新频繁的交易类数据。

Elasticsearch构建全文搜索系统相关推荐

  1. Elasticsearch构建商品搜索系统

    搜索这个特性可以说是无处不在,现在很少有网站或者系统不提供搜索功能了,所以,即使你不是一个专业做搜索的程序员,也难免会遇到一些搜索相关的需求.搜索这个东西,表面上看功能很简单,就是一个搜索框,输入关键 ...

  2. Python 和 Elasticsearch 构建简易搜索

    Python 和 Elasticsearch 构建简易搜索 作者:白宁超 2019年5月24日17:22:41 导读:件开发最大的麻烦事之一就是环境配置,操作系统设置,各种库和组件的安装.只有它们都正 ...

  3. 笔记13:Python 和 Elasticsearch 构建简易搜索

    Python 和 Elasticsearch 构建简易搜索 1 ES基本介绍 概念介绍 Elasticsearch是一个基于Lucene库的搜索引擎.它提供了一个分布式.支持多租户的全文搜索引擎,它可 ...

  4. ElasticSearch中全文搜索(单词搜索、多次搜索、组合搜索和权重搜索)

    全文搜索两个最重要的方面是: 相关性(Relevance) 它是评价查询与其结果间的相关程度,并根据这种相关程度对结果排名的一种能力,这种计算方式可以是 TF/IDF 方法.地理位置邻近.模糊相似,或 ...

  5. Laravel 使用 scout 集成 elasticsearch 做全文搜索

    安装需要的组件 composer require tamayo/laravel-scout-elastic composer require laravel/scout 如果composer requ ...

  6. Elasticsearch系列——全文搜索控制精准度

    作者专注于Java.架构.Linux.小程序.爬虫.自动化等技术. 工作期间含泪整理出一些资料,微信搜索[程序员高手之路],回复 [java][黑客][爬虫][小程序][面试]等关键字免费获取资料. ...

  7. 【Elasticsearch】全文搜索

    全文搜索是ES的关键特性之一,平时我们使用SQL的like语句,搜索一些文本.字符串是否包含指定的关键词,但是如果两篇文章,都包含我们的关键词,具体那篇文章内容的相关度更高? 这个SQL的like语句 ...

  8. springcloud集成Elasticsearch实现全文搜索的功能

    1.申明RestHighLevelClient //RestHighLevelClient声明的bean注入进来,用于访问elasticsearch @Autowired private RestHi ...

  9. 使用elasticsearch文件搜索系统助力亚马逊解决方案架构师认证考试

    当真没想到随手写的一个文章 使用elasticsearch搭建文件搜索系统(带界面),居然会有这么多的点赞.哈哈,应该是贫穷限制了我的想象力,感谢30多位同学的赞.总之趁热打铁,围绕这个话题,趁我还有 ...

  10. Flask 教程 第十六章:全文搜索

    本文转载自:https://www.jianshu.com/p/56cfc972d372 这是Flask Mega-Tutorial系列的第十六部分,我将在其中为Microblog添加全文搜索功能. ...

最新文章

  1. python爬虫教程i-Python 爬虫速成教程,还有35个实战项目送给你!
  2. 关于格雷码的规律、转换
  3. 补补算术基础:编程中的进制问题
  4. 微信小程序 PDF下载打印
  5. delphi刷新界面所选行丢失问题
  6. react创建项目报错unexpected end of json while parsing near xxx
  7. 单片机——电子密码锁设计报告
  8. 前端核心工作内容有哪些?
  9. zmq xsub/xpub 实现消息订阅(一)
  10. 北京周边骑行路线总结
  11. 计算32768晶体的负载电容,与晶体手册电容匹配
  12. 手绘板的制作——重置与橡皮擦(2)
  13. gre模考软件java.exe_【模考】GRE模考软件逆天版(考G神器)
  14. Spring Boot 3.x特性-JSON(gson,jackson,json-b,fastjson)
  15. 【shapely】自相交问题
  16. 第二证券|11天9板,“超级面料”概念火爆,高管却偷偷减持
  17. PR曲线,ROC曲线和AUC的区别
  18. 经典PID控制器的缺陷
  19. python 2 入门
  20. 你觉得java与嵌入式学哪个好?

热门文章

  1. 全球每日被黑站点一览表!
  2. java时间转换为标准时间
  3. 一步一个脚印——开启博客
  4. 指纹识别的原理和方法
  5. 2021人工智能状况分析报告
  6. 从未相识——只愿下一世安好
  7. 电影《中国合伙人》中的管理知识
  8. 简信CRM:CRM科学服务体系,促进企业销售增长
  9. ubuntu 20.04 安装腾讯官方微信
  10. 诺基亚、罗永浩,中国手机2014八大关键词