2

Java 程序员如何通过 ElasticSearch 构建极致的搜索体验?

 2 years ago
source link: http://www.justdojava.com/2021/12/19/java/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

Java 程序员如何通过 ElasticSearch 构建极致的搜索体验?

发表于 2021-12-19

| 分类于 Java

搜索引擎在任何人的日常生活和工作中都承担着很重要的角色,说到搜索大家想到的最多可能就是百度,谷歌,必应等搜索引擎。

这些确实是 PC 互联网时代的搜索先锋,但是现在移动互联网时代搜索已经很普及了,各大应用基本上都支持搜索,像抖音,微信,知乎等等应用程序,都会内置搜索引擎来实现自家内容的搜索。

Elasticsearch 是一个实时的分布式搜索分析引擎,它的搜索速度和规模,堪称前所未有。我们只需要把数据按照规定的索引格式去存储,后续就可以进行极致的搜索,因此 Elasticsearch 被广泛的应用于各大互联网公司。

根据 Elasticsearch 的官方介绍,WikipediaGithubStack Overflow 等大厂都在使用。

Wikipedia 使用 Elasticsearch 提供带有高亮片段的全文搜索,还有 search-as-you-typedid-you-mean 的建议。

卫报使用 Elasticsearch 将网络社交数据结合到访客日志中,为它的编辑们提供公众对于新文章的实时反馈。

Stack Overflow 将地理位置查询融入全文检索中去,并且使用 more-like-this 接口去查找相关的问题和回答。

GitHub 使用 Elasticsearch 对1300亿行代码进行查询。

Elasticsearch 提供了开箱即用的功能,我们通过在官网 https://www.elastic.co/downloads/elasticsearch 下载最新的符合自己电脑系统的稳定版本,然后解压后执行./bin/elasticsearch

image-20211219173320698

显示 successfully 表示启动成功,再通过执行命令curl 'http://localhost:9200/?pretty' 可以看到如下输出,表示 Elasticsearch 本地启动成功。

02.png

在使用 Elasticsearch 之前,我们先简单介绍一个 Elasticsearch 的存储结构,便于我们后面进行学习。首先我们知道一个事情那就是 Elasticsearch 是面向文档的,所谓文档就是一个 document,如果用过 MongoDB的话,小伙伴对文档应该比较熟悉,是一个 NoSQL 的形式,可以理解为一个 JSON 形式的结构,跟我们常用的 MySQL 关系型的结构不一样,目前基本上任何一门语言的对象都可以直接转化成 JSON 形式,这极大方便了我们的使用。

文档的形式

文档的组成由文档数据和元数据组成,其中元数据包括_index_type_id 三个特别重要的元数据,其中 _index 表示文档在哪存放,_type 表示文档的对象类别,_id文档唯一标识。虽然 Elasticsearch 是以文档形式存储的,但这里我们可以用关系型数据库作类比,比如这里的_index 可以类似于 MySQLdatabase_type 类似有 MySQLtable,其中_id 类似于 ID 字段。

与 Elasticsearch 进行交互

通过官方文档我们可以知道一个 Elasticsearch 请求和任何 HTTP 请求一样由若干相同的部件组成:curl -X<VERB> '<PROTOCOL>://<HOST>:<PORT>/<PATH>?<QUERY_STRING>' -d '<BODY>'

< > 标记的部分表示含义如下:

标记 含义 VERB 适当的 HTTP 方法谓词 : GETPOSTPUTHEAD 或者 DELETEPROTOCOL http 或者 https(如果你在 Elasticsearch 前面有一个 https 代理) HOST Elasticsearch 集群中任意节点的主机名,或者用 localhost 代表本地机器上的节点。 PORT 运行 Elasticsearch HTTP 服务的端口号,默认是 9200PATH API 的终端路径(例如 _count 将返回集群中文档数量)。Path 可能包含多个组件,例如:_cluster/stats_nodes/stats/jvmQUERY_STRING 任意可选的查询字符串参数 (例如 ?pretty 将格式化地输出 JSON 返回值,使其更容易阅读) BODY 一个 JSON 格式的请求体 (如果请求需要的话)

查看 Elasticsearch 集群中文档的个数:

 curl -XGET 'http://localhost:9200/_count?pretty' -H 'Content-Type:application/json' -d '
{
    "query": {
        "match_all": {}
    }
}'

返回如下,其中 count 为 0,表示我们集群中暂时还没有文档:

03.png

通过我们上面提到的内容,这里我们尝试进行一个文档的索引,语句如下,然后再查询一下文档的数据,结果如下

curl -XPUT 'http://localhost:9200/student/class1/1?pretty' -H 'Content-Type:application/json' -d '
{
  "name": "ziyou",
  "age":  "18",
  "date":  "2021/12/19"
}
'

04.png

这里我们通过像 student 索引 class1type 下面索引了一篇 id 为 1 的学生,通过 pretty 参数将返回美化查看,通过上面的操作,现在我们的 Elasticsearch 集群里面已经存在了一个 id 为 1 的学生了。

索引文档过后,我们再根据下面的语句进行文档的获取

curl -XGET 'http://localhost:9200/student/class1/1?pretty'

我们可以通过前面 PUT 语句再次执行,进行文档的更新,如下所示

curl -XPUT 'http://localhost:9200/student/class1/1?pretty' -H 'Content-Type:application/json' -d '
{
  "name": "ziyou",
  "age":  "20",
  "date":  "2021/12/19"
}

05.png

说明:可以看到 age 这个字段已经变更了,但是这里我们还看到多了一个 version 字段,正常这里应该是 2 ,阿粉只是多操作了几次所以这里是 7,需要说明的是,更新文档并不是更新原来的文档,Elasticsearch 底层帮我们把原来的文档标记成删除状态,然后创建了一个新的文档,再加上了一个版本号,因为文档 ID 是没有变化的。当随着我们索引数据的越来越多,Elasticsearch 底层会帮我们清理这些删除的文档数据,从我们的视角来看,就是文档已经更新了。

curl -XDELETE 'http://localhost:9200/student/class1/1

通过 DELETE 指令,我们可以将文档进行删除,删除也同更新一样,只是标记为删除状态,并不会立马从磁盘中删除,随着不断的索引更多的数据,Elasticsearch 将会在后台清理标记为已删除的文档。同时进行删除的时候,version 版本也会进行增加。

前面提到了都只是 Elasticsearch 作为搜索引擎的基本操作,还有很多更重要的功能都没有提到,包括索引分词,查询语法,健康检查,搜索匹配、搜索排序和聚合等很多高级功能。

本书从Elasticsearch的基本概念和原理讲起,然后系统介绍Elasticsearch的使用场景,带领读者近距离接触Elasticsearch。本书涵盖客户端的安装和使用、索引的创建、文档的操作、搜索匹配、搜索排序和聚合,可以帮助读者循序渐进地掌握Elasticsearch的相关知识。 本书共8章,分为3篇。第1篇“Elasticsearch基础”,主要介绍Elasticsearch的基础知识和基本用法;第2篇“Elasticsearch提高”,首先介绍文本搜索和排序原理,然后介绍聚合的使用方法;第3篇“Elasticsearch实战”,以酒店搜索为例,详细介绍Elasticsearch在实际搜索应用中涉及的相关技术,帮助读者全面了解搜索引擎,并提高开发水平。本书重点介绍Elasticsearch的核心功能——搜索匹配和排序,其中对中文匹配的实现用较大篇幅讲解,便于读者进行中文搜索的落地工作。另外,结合具体实例讲解排序功能,帮助读者更加透彻地理解Elasticsearch排序算法的原理。 本书内容丰富,语言通俗易懂,讲解图文并茂,案例典型而实用,适合Elasticsearch初学者和有一定基础而想提高水平的进阶人员阅读,另外还适合相关院校和培训机构作为教材。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK