Elasticsearch构建全文搜索系统

前言

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

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

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

我们想像这是千万级别的表,最后需要实现传入关键字,返回相应的文章 例如:搜索运动返回页码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的结构为参考对照一下,如下

ElasticSearchMySQL
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 树索引,它的写入和更新性能都比较差,因此倒排索引也只是适合全文搜索,不适合更新频繁的交易类数据。

阅读终点,创作起航,您可以撰写心得或摘录文章要点写篇博文。去创作
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: Spring Boot是一个基于Java的开源框架,用于快速构建独立的、生产级别的应用程序。它简化了Spring框架的开发过程,提供了大量的默认配置,开发者只需关注业务逻辑的实现即可。 Elasticsearch是一个开源的分布式搜索和分析引擎,它使用倒排索引的方式进行高效的文本搜索。它提供了丰富、强大的查询语言和API,可以帮助我们构建高性能、可扩展的搜索应用。 要构建一个博客检索系统,可以使用Spring Boot和Elasticsearch的组合。首先,我们可以使用Spring Boot搭建一个简单的web应用,用于展示博客内容和处理用户请求。Spring Boot提供了快速开发的能力,可以方便地构建页面和处理数据。 然后,我们需要将博客的内容导入到Elasticsearch中进行索引。可以编写一个程序,通过Elasticsearch提供的API将博客内容导入到索引中。这样,我们就可以通过Elasticsearch的查询语言来搜索博客文章。 最后,我们可以在Spring Boot应用中编写一个搜索接口,通过接收用户的搜索关键字,调用Elasticsearch的API进行查询,并将查询结果返回给用户。用户可以根据搜索结果点击进入详细页面查看博客内容。 构建博客检索系统需要注意索引的更新问题,当博客内容发生变化时,需要及时同步到Elasticsearch的索引中,以确保数据的最新性。可以使用定时任务或者监听数据库变化的方式实现索引的更新。 总结来说,使用Spring Boot和Elasticsearch可以快速构建一个博客检索系统。Spring Boot提供了便捷的开发环境,而Elasticsearch提供了强大的搜索和分析引擎,帮助我们实现高性能的搜索功能。 ### 回答2: Spring Boot是一个用于简化Spring应用开发的框架,它通过提供默认的配置和约定来简化Java应用程序的开发过程。Elasticsearch是一个开源的分布式搜索和分析引擎,可以高效地存储、检索和分析大量结构化和非结构化数据。 通过使用Spring Boot和Elasticsearch,我们可以构建一个免费的博客检索系统。首先,我们可以使用Spring Boot框架来开发一个简单的博客应用,在其中包括博客的标题、内容、作者和发布时间等基本信息。我们可以使用Spring Data Elasticsearch来集成Elasticsearch搜索功能,并将博客的相关信息存储在Elasticsearch的索引中。 接下来,我们可以利用Elasticsearch的强大的搜索和查询功能来构建一个可靠和高效的博客检索系统。通过对博客索引进行全文搜索,用户可以根据关键词搜索博客,系统会返回与关键词相关的博客内容。 除了基本的搜索功能,我们还可以通过利用Elasticsearch的聚合功能来实现更复杂的检索需求。例如,我们可以计算某个时间段内博客的发布数量,或者根据作者分组计算每个作者的博客数量。这些聚合操作可以帮助我们快速获取博客数据的统计信息,以实现更细粒度的博客检索。 总之,利用Spring Boot和Elasticsearch,我们可以构建一个免费的博客检索系统,提供强大的全文搜索和聚合功能,帮助用户快速找到他们感兴趣的博客内容。这个系统不仅易于开发和维护,还能够处理大量的博客数据,提供稳定和高效的检索服务。 ### 回答3: Spring Boot是一种用于快速开发Java应用程序的框架,而Elasticsearch是一个开源的分布式搜索引擎。结合两者,可以构建一个强大的博客检索系统。 首先,我们可以使用Spring Boot框架来构建博客系统的后端。通过使用Spring Boot的自动配置和约定优于配置的设计原则,我们可以快速搭建一个可靠的后端应用程序。我们可以使用Spring MVC来处理前端请求,并使用Spring Data来与数据库进行交互和管理数据。通过使用Spring Security可以确保博客系统的安全性。 其次,我们需要集成Elasticsearch作为博客系统搜索引擎。Elasticsearch是一个分布式的实时搜索和分析引擎,具有强大的全文搜索能力和高性能。我们可以通过使用Spring Data Elasticsearch模块来简化与Elasticsearch的交互,它提供了丰富的API来执行各种搜索操作。 在博客系统中,我们可以使用Elasticsearch建立博客的全文索引。当用户进行搜索时,我们可以使用Elasticsearch的查询语言来执行搜索操作,并返回与查询相关的博客文章。我们可以使用Elasticsearch的分词、关键字匹配和模糊搜索等功能来提高搜索的准确性和效率。 为了提升用户体验,我们可以使用Elasticsearch的聚合功能来生成搜索建议和热门标签等。这样用户可以更方便地找到他们想要的博客内容。 综上所述,通过免费课程学习Spring Boot和Elasticsearch,我们可以构建一个功能强大的博客检索系统。这将使用户能够轻松搜索并获取他们所需的博客文章。同时,使用Spring Boot和Elasticsearch的优势,我们可以快速开发和部署这个系统,并保证其可靠性和性能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

WYP@LML

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值