ElasticSearch 学习笔记
发布网友
发布时间:2024-10-02 13:08
我来回答
共1个回答
热心网友
时间:2024-10-03 20:43
前言:
作为一名追求全栈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的映射,使用注解,例如:
到这里,基本上就可以使用了。要想熟练掌握,肯定需要去实践。