ElasticSearch 学习笔记

如题所述

前言:

作为一名追求全栈web工程师的大龄程序员,ElasticSearch(ES)的学习是必不可少的。近期项目需要用到ES,于是我在网上查找视频教程,却发现大部分教程都是照本宣科,对全文检索和倒排索引的解释模糊不清。安装和集群配置等内容也让我感到困惑,这些并不适合一线程序员快速入门。因此,我决定自己到官网学习,并在此记录学习笔记,以便日后查阅。

学习技术最重要的是动手实践。在了解了ES的基本用途后,我首先在官网上找到了ES的地址:https://www.elastic.co/cn/,以及中文版的文档地址:elastic.co/guide/cn/。这是一本权威指南,内容繁多,但我会从quick start开始学习。

安装过程如下:

首先,我使用了Docker进行安装,只需执行五行命令即可。通过访问http://localhost:9200,我可以看到版本信息。Elasticsearch提供了一个可以直接访问的_cat api,如localhost:9200/_cat,可以通过这个api查看健康状况。至此,Elasticsearch的安装就完成了。

顺利的话,访问localhost:5601即可看到Kibana的首页。虽然一大堆内容看起来难以理解,但我还是直接打开了左侧菜单中的Management下的Dev tool,输入GET /即可查看版本信息。

接下来,我将开始学习Elasticsearch。对于开发者来说,最重要的三个部分是:第一个是RestApi,第二个是Java客户端,第三个是SpringData相关api。

然而,在学习过程中我遇到了一些问题。昨天我还顺利运行,但今天Kibana却出现了问题。没关系,我决定使用curl来练习一下手。由于ES的接口是基于HTTP的,所以任何能发送HTTP请求的客户端都可以用来测试。

在学习之前,我还需要介绍一下Apache下的一个开源全文检索工具包——lucene。lucene有两个实现:一个是solr,另一个就是Elasticsearch。

lucene的存储结构设计为:index、type、document。在一个lucene中可以有多个index,一个index中可以有多个type,而type存储的是相同类型的数据document。

Elasticsearch基于lucene,但它弱化了type的概念。可以有多个index,但一个index中只有一个默认的type叫做_doc,而在_doc中可以随意放置数据,无需按照固定格式。它会自动映射之前未出现过的字段。

例如,无需定义index也无需定义_doc,只需发送PUT请求发送JSON数据,就能成功保存。它将count自动映射为数字类型。使用curl -X GET "localhost:9200/data?pretty"命令可以看到mapping属性。之后,这个字段只能是数字,否则会报错。

自动映射文档类型方便测试,但要将它写进代码,还是应该定义index的文档类型,即ES中的mapping。mapping是文档字段的类型映射,下面的命令可以生成相应mapping的index,并设置"dynamic":false规定不能动态生成mapping。虽然数据可以保存,但mapping不会发生变化。

记录一下,创建索引只能使用PUT,而创建数据可以使用POST自动生成ID(新增),而PUT创建数据必须指定ID(更新)。

新的一天开始了,我使用Docker安装了新版本的Elasticsearch和Kibana,并顺利启动。我决定再次使用Kibana,因为它更方便一些。我需要手动编写一些代码。

mapping可以直接修改,注意路径和参数的变化。

那么,mapping具体如何使用呢?它实际上定义了字段名与类型的映射关系,字段名是开发者自己定义的,如name、age等,而类型是ES规定的。我了解到有二三十个类型,如keyword、数字类型等。

以下是一些常见的类型:

keyword可以用于排序、聚合和term-level查询。排序和聚合功能非常强大。term-level查询可以简单理解为相等的数据,不一定是完全相等,与text的match查询相对应。

text类型的数据会被分词器分词,然后可以根据单个词匹配包含该词语的文档。建议存储那些非结构化的但人类可读的数据,如邮件内容、产品描述等。

通常情况下,如果你既想要排序和聚合,又想要分词查询,那么应该将同一个内容放在两个字段上。

mapping映射除了属性的类型外,还包括属性上的配置。例如,analyzer分词器、文档提示等。除了选择合适的分词器插件外,在上线之前要详细测试分词器的分词效果。还有boost相关性分数计算的系数等。尽管功能很多,配置很多,但直接上手并不复杂。

Elasticsearch还支持别名,即为index或属性另外起一个名字。具体用途还不清楚。

接下来,我将介绍Elasticsearch的查询功能,这是关键所在,因为使用Elasticsearch就是用来检索数据的。

首先是查询语法,它既支持GET也支持POST,非常灵活。参数可以拼在URL中,也可以放在请求体中。内容很多,但我认为学习POST请求就足够了,因为有些复杂的查询参数很多,放在body中更易于阅读。

查询操作除了根据字段查询响应的数据外,还支持聚合、分页、排序和异步查询。接下来,我会整理这些内容。

关于查询,还有许多特性,如过滤查询、高亮查询等。以下是一个示例:

创建一个index并插入一条数据,然后:

以下是一个更复杂的示例:

Elasticsearch使用Query DSL来配置查询条件,DSL是domain specific language的缩写,只需知道这玩意是基于JSON来配置查询条件即可。

我已经编写了一些示例来熟悉Query DSL。

内容太多,看一些关键的吧?

官网有一些建议,第一个是Elasticsearch是一个搜索引擎,擅长搜索最符合条件的文档,不建议查询所有文档,而且文档不建议太大,默认的http传输限制为100M,虽然可以调整。

等等,还有更多内容,接下来我将学习如何在项目中使用Elasticsearch,这对于开发者来说是最关键的。

Elasticsearch提供了一个专门的Java客户端,用于连接ES服务器。

首先,我需要添加依赖项。

以下是一个示例代码:

然后,我与Spring进行整合。

Spring还提供了一个实体类与index的映射,使用注解,例如:

到这里,基本上就可以使用了。要想熟练掌握,肯定需要去实践。
温馨提示:答案为网友推荐,仅供参考
相似回答
大家正在搜