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

本文涉及的产品
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
简介: 搜索引擎在任何人的日常生活和工作中都承担着很重要的角色,说到搜索大家想到的最多可能就是百度,谷歌,必应等搜索引擎。这些确实是 PC 互联网时代的搜索先锋,但是现在移动互联网时代搜索已经很普及了,各大应用基本上都支持搜索,像抖音,微信,知乎等等应用程序,都会内置搜索引擎来实现自家内容的搜索。Elasticsearch 是一个实时的分布式搜索分析引擎,它的搜索速度和规模,堪称前所未有。我们只需要把数据按照规定的索引格式去存储,后续就可以进行极致的搜索,因此 Elasticsearch 被广泛的应用于各大互联网公司。

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

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

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

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

  1. Wikipedia 使用 Elasticsearch 提供带有高亮片段的全文搜索,还有 search-as-you-typedid-you-mean 的建议。
  2. 卫报使用 Elasticsearch 将网络社交数据结合到访客日志中,为它的编辑们提供公众对于新文章的实时反馈。
  3. Stack Overflow 将地理位置查询融入全文检索中去,并且使用 more-like-this 接口去查找相关的问题和回答。
  4. GitHub 使用 Elasticsearch 对1300亿行代码进行查询。

安装使用

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

79.jpg

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

80.jpg

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

示例

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

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

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

81.jpg

索引文档

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

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


82.jpg

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


相关实践学习
使用阿里云Elasticsearch体验信息检索加速
通过创建登录阿里云Elasticsearch集群,使用DataWorks将MySQL数据同步至Elasticsearch,体验多条件检索效果,简单展示数据同步和信息检索加速的过程和操作。
ElasticSearch 入门精讲
ElasticSearch是一个开源的、基于Lucene的、分布式、高扩展、高实时的搜索与数据分析引擎。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr(也是基于Lucene)。 ElasticSearch的实现原理主要分为以下几个步骤: 用户将数据提交到Elastic Search 数据库中 通过分词控制器去将对应的语句分词,将其权重和分词结果一并存入数据 当用户搜索数据时候,再根据权重将结果排名、打分 将返回结果呈现给用户 Elasticsearch可以用于搜索各种文档。它提供可扩展的搜索,具有接近实时的搜索,并支持多租户。
相关文章
|
17天前
|
Java 程序员
JAVA程序员的进阶之路:掌握URL与URLConnection,轻松玩转网络资源!
在Java编程中,网络资源的获取与处理至关重要。本文介绍了如何使用URL与URLConnection高效、准确地获取网络资源。首先,通过`java.net.URL`类定位网络资源;其次,利用`URLConnection`类实现资源的读取与写入。文章还提供了最佳实践,包括异常处理、连接池、超时设置和请求头与响应头的合理配置,帮助Java程序员提升技能,应对复杂网络编程场景。
41 9
|
1月前
|
存储 自然语言处理 BI
|
13天前
|
人工智能 前端开发 Java
基于开源框架Spring AI Alibaba快速构建Java应用
本文旨在帮助开发者快速掌握并应用 Spring AI Alibaba,提升基于 Java 的大模型应用开发效率和安全性。
基于开源框架Spring AI Alibaba快速构建Java应用
|
1天前
|
SQL 存储 Java
面向 Java 程序员的 SQLite 替代品
SQLite 是轻量级数据库,适用于小微型应用,但其对外部数据源支持较弱、无存储过程等问题影响了开发效率。esProc SPL 是一个纯 Java 开发的免费开源工具,支持标准 JDBC 接口,提供丰富的数据源访问、强大的流程控制和高效的数据处理能力,尤其适合 Java 和安卓开发。SPL 代码简洁易懂,支持热切换,可大幅提高开发效率。
|
8天前
|
存储 缓存 固态存储
Elasticsearch高性能搜索
【11月更文挑战第1天】
23 6
|
6天前
|
API 索引
Elasticsearch实时搜索
【11月更文挑战第2天】
14 1
|
14天前
|
SQL Java 程序员
倍增 Java 程序员的开发效率
应用计算困境:Java 作为主流开发语言,在数据处理方面存在复杂度高的问题,而 SQL 虽然简洁但受限于数据库架构。SPL(Structured Process Language)是一种纯 Java 开发的数据处理语言,结合了 Java 的架构灵活性和 SQL 的简洁性。SPL 提供简洁的语法、完善的计算能力、高效的 IDE、大数据支持、与 Java 应用无缝集成以及开放性和热切换特性,能够大幅提升开发效率和性能。
|
14天前
|
Java 数据库连接 数据库
如何构建高效稳定的Java数据库连接池,涵盖连接池配置、并发控制和异常处理等方面
本文介绍了如何构建高效稳定的Java数据库连接池,涵盖连接池配置、并发控制和异常处理等方面。通过合理配置初始连接数、最大连接数和空闲连接超时时间,确保系统性能和稳定性。文章还探讨了同步阻塞、异步回调和信号量等并发控制策略,并提供了异常处理的最佳实践。最后,给出了一个简单的连接池示例代码,并推荐使用成熟的连接池框架(如HikariCP、C3P0)以简化开发。
33 2
|
19天前
|
IDE Java 程序员
C++ 程序员的 Java 指南
一个 C++ 程序员自己总结的 Java 学习中应该注意的点。
20 5
|
30天前
|
人工智能
云端问道12期-构建基于Elasticsearch的企业级AI搜索应用陪跑班获奖名单公布啦!
云端问道12期-构建基于Elasticsearch的企业级AI搜索应用陪跑班获奖名单公布啦!
172 2