Elasticsearch 教程:从零开始构建搜索引擎 – wiki基地

Elasticsearch 教程:从零开始构建搜索引擎

Elasticsearch 是一款强大的、开源的分布式搜索和分析引擎,基于 Apache Lucene 构建。它以其速度、可扩展性和实时性而闻名,被广泛应用于日志分析、安全情报、电商搜索、网站搜索等领域。本教程将带领你从零开始,一步步构建一个简单的搜索引擎,让你对 Elasticsearch 的核心概念和基本操作有一个深入的了解。

第一部分:Elasticsearch 基础入门

1.1 Elasticsearch 的概念

在深入学习之前,我们先来了解一些 Elasticsearch 的核心概念:

  • Cluster (集群): 一个或多个 Elasticsearch 节点组成的集合,共同存储数据和提供搜索服务。
  • Node (节点): 集群中的一个 Elasticsearch 实例,负责存储数据、处理搜索请求和执行管理任务。节点可以分为不同的角色,如主节点、数据节点、协调节点等。
  • Index (索引): 类似于关系数据库中的数据库。它是文档的集合,拥有一些共同的特性,例如映射。
  • Document (文档): 类似于关系数据库中的行。它是可被索引的基本单元,通常以 JSON 格式表示。例如,一篇文章、一个产品信息、一条日志记录都可以是一个文档。
  • Field (字段): 类似于关系数据库中的列。它是文档中的一个属性,例如文章的标题、产品的价格、日志的时间戳。
  • Mapping (映射): 定义索引中文档的字段如何被存储和索引。它指定了每个字段的数据类型(如文本、数值、日期等)以及如何分析和处理这些数据。
  • Shards (分片): 索引在物理上被分割成多个分片。每个分片都是一个独立的 Lucene 索引。分片允许水平扩展 Elasticsearch 集群,并提高查询性能。
  • Replicas (副本): 每个分片可以有多个副本。副本提供冗余备份,提高可用性,并且可以参与搜索请求,提高查询吞吐量。

1.2 安装和启动 Elasticsearch

首先,你需要下载并安装 Elasticsearch。你可以从 Elasticsearch 官方网站 (https://www.elastic.co/downloads/elasticsearch) 下载适合你操作系统的版本。

安装完成后,你可以通过以下命令启动 Elasticsearch:

“`bash

Linux/macOS

./bin/elasticsearch

Windows

.\bin\elasticsearch.bat
“`

Elasticsearch 默认监听 9200 端口用于 HTTP 请求,以及 9300 端口用于节点间的通信。启动成功后,你可以通过浏览器访问 http://localhost:9200 来验证 Elasticsearch 是否正常运行。如果看到包含集群信息的 JSON 响应,则表示 Elasticsearch 已经成功启动。

1.3 安装 Kibana (可选,但强烈推荐)

Kibana 是 Elasticsearch 的可视化工具,它可以让你更容易地查询、分析和可视化 Elasticsearch 中的数据。你可以从 Elasticsearch 官方网站下载 Kibana (版本需要与 Elasticsearch 兼容)。

安装完成后,你可以通过以下命令启动 Kibana:

“`bash

Linux/macOS

./bin/kibana

Windows

.\bin\kibana.bat
“`

Kibana 默认监听 5601 端口。启动成功后,你可以通过浏览器访问 http://localhost:5601 来使用 Kibana。

1.4 使用 Dev Tools 与 Elasticsearch 交互

Kibana 提供了一个名为 “Dev Tools” 的界面,允许你直接与 Elasticsearch API 进行交互。你可以使用 Dev Tools 发送各种 HTTP 请求到 Elasticsearch,例如创建索引、添加文档、执行搜索等。

第二部分:索引和文档操作

2.1 创建索引

使用 PUT 方法和 /_index_name 路径来创建索引。你可以在请求体中指定索引的设置,例如分片数和副本数:

json
PUT /my_index
{
"settings": {
"number_of_shards": 3,
"number_of_replicas": 1
}
}

这个请求将在 Elasticsearch 中创建一个名为 my_index 的索引,它有 3 个主分片和 1 个副本。

2.2 定义 Mapping (映射)

在创建索引之前或之后,你可以定义索引的 mapping。 Mapping 定义了索引中文档的字段类型以及如何分析这些字段。 使用 PUT 方法和 /_index_name/_mapping 路径来定义 mapping:

json
PUT /my_index/_mapping
{
"properties": {
"title": {
"type": "text"
},
"content": {
"type": "text"
},
"author": {
"type": "keyword"
},
"publish_date": {
"type": "date",
"format": "yyyy-MM-dd"
}
}
}

在这个例子中,我们定义了四个字段:titlecontent 是文本类型,author 是关键词类型,publish_date 是日期类型。

  • text 类型适用于需要进行全文搜索的字段。Elasticsearch 会将文本类型的字段进行分词,以便于搜索。
  • keyword 类型适用于不需要进行全文搜索的字段,例如作者姓名、标签等。Elasticsearch 会将关键词类型的字段作为一个整体进行存储和搜索。
  • date 类型用于存储日期和时间。你可以指定日期的格式,例如 yyyy-MM-dd

2.3 添加文档

使用 POST 方法和 /_index_name/_doc 路径来添加文档:

json
POST /my_index/_doc
{
"title": "Elasticsearch Tutorial: Building a Search Engine from Scratch",
"content": "This tutorial will guide you through the process of building a simple search engine using Elasticsearch.",
"author": "John Doe",
"publish_date": "2023-10-27"
}

这个请求将在 my_index 索引中创建一个新的文档。 Elasticsearch 会自动为每个文档生成一个唯一的 _id。 如果你希望指定文档的 _id,可以使用 PUT 方法和 /_index_name/_doc/_id 路径:

json
PUT /my_index/_doc/1
{
"title": "Elasticsearch Tutorial: Building a Search Engine from Scratch",
"content": "This tutorial will guide you through the process of building a simple search engine using Elasticsearch.",
"author": "John Doe",
"publish_date": "2023-10-27"
}

2.4 获取文档

使用 GET 方法和 /_index_name/_doc/_id 路径来获取文档:

json
GET /my_index/_doc/1

这个请求将返回 my_index 索引中 _id1 的文档。

2.5 更新文档

使用 POST 方法和 /_index_name/_doc/_id/_update 路径来更新文档:

json
POST /my_index/_doc/1/_update
{
"doc": {
"content": "This tutorial has been updated with new information."
}
}

这个请求将更新 my_index 索引中 _id1 的文档的 content 字段。

2.6 删除文档

使用 DELETE 方法和 /_index_name/_doc/_id 路径来删除文档:

json
DELETE /my_index/_doc/1

这个请求将删除 my_index 索引中 _id1 的文档。

2.7 删除索引

使用 DELETE 方法和 /_index_name 路径来删除索引:

json
DELETE /my_index

这个请求将删除 my_index 索引。 请注意,删除索引是一个不可逆的操作,请谨慎操作。

第三部分:搜索操作

3.1 简单搜索

使用 GET 方法和 /_index_name/_search 路径来执行搜索:

json
GET /my_index/_search
{
"query": {
"match_all": {}
}
}

这个请求将返回 my_index 索引中的所有文档。 match_all 查询是最简单的查询,它匹配所有文档。

3.2 Match Query

match 查询是最常用的查询类型。它会根据字段类型进行不同的分析和处理。 对于文本类型的字段,match 查询会先将查询字符串进行分词,然后匹配分词后的每个词项。

json
GET /my_index/_search
{
"query": {
"match": {
"content": "search engine"
}
}
}

这个请求将返回 my_index 索引中 content 字段包含 “search” 和 “engine” 的文档。

3.3 Term Query

term 查询用于匹配精确的词项。它不会对查询字符串进行分词,而是直接匹配字段中的词项。 term 查询通常用于匹配关键词类型的字段。

json
GET /my_index/_search
{
"query": {
"term": {
"author": "John Doe"
}
}
}

这个请求将返回 my_index 索引中 author 字段的值为 “John Doe” 的文档。

3.4 Range Query

range 查询用于匹配指定范围内的值。它通常用于匹配数值类型或日期类型的字段。

json
GET /my_index/_search
{
"query": {
"range": {
"publish_date": {
"gte": "2023-10-01",
"lte": "2023-10-31"
}
}
}
}

这个请求将返回 my_index 索引中 publish_date 字段的值在 2023 年 10 月 1 日到 2023 年 10 月 31 日之间的文档。

3.5 Bool Query

bool 查询用于组合多个查询条件。它可以包含以下子句:

  • must: 必须匹配的查询条件。
  • should: 应该匹配的查询条件。
  • must_not: 必须不匹配的查询条件。
  • filter: 用于过滤结果的查询条件,不影响评分。

json
GET /my_index/_search
{
"query": {
"bool": {
"must": [
{ "match": { "content": "search engine" } }
],
"should": [
{ "term": { "author": "John Doe" } }
],
"must_not": [
{ "term": { "title": "Advanced Elasticsearch" } }
],
"filter": {
"range": {
"publish_date": {
"gte": "2023-10-01"
}
}
}
}
}
}

这个请求将返回 my_index 索引中满足以下条件的文档:

  • content 字段必须包含 “search engine”。
  • author 字段应该包含 “John Doe” (不影响评分)。
  • title 字段不能包含 “Advanced Elasticsearch”。
  • publish_date 字段必须大于等于 2023 年 10 月 1 日。

3.6 Highlighting

Highlighter 可以在搜索结果中高亮显示匹配的关键词。

json
GET /my_index/_search
{
"query": {
"match": {
"content": "search engine"
}
},
"highlight": {
"fields": {
"content": {}
}
}
}

这个请求将返回 my_index 索引中 content 字段包含 “search engine” 的文档,并且会在搜索结果中高亮显示匹配的 “search engine”。 默认情况下,高亮显示的标签是 <em></em>。 你可以通过 pre_tagspost_tags 参数来自定义高亮显示的标签。

第四部分:高级特性

4.1 Analyzers 和 Tokenizers

Analyzer (分析器) 用于将文本类型的字段进行分词和处理,以便于搜索。 Analyzer 由一个 Tokenizer (分词器) 和多个 Token Filter (词项过滤器) 组成。

  • Tokenizer: 将文本分割成单个的词项。
  • Token Filter: 修改、删除或添加词项。

Elasticsearch 提供了多种内置的 Analyzer,例如 standardsimplewhitespace 等。 你也可以自定义 Analyzer。

4.2 Aggregations

Aggregations (聚合) 允许你从 Elasticsearch 中提取统计信息和分析结果。 Elasticsearch 提供了多种聚合类型,例如 termsrangehistogram 等。

4.3 Performance Tuning

Elasticsearch 的性能受到多种因素的影响,例如硬件配置、索引设置、查询语句等。 你可以通过调整这些因素来提高 Elasticsearch 的性能。

结论

本教程涵盖了 Elasticsearch 的基本概念和核心操作,包括索引、文档、搜索和一些高级特性。 通过学习本教程,你应该能够理解 Elasticsearch 的工作原理,并能够使用 Elasticsearch 构建简单的搜索引擎。 Elasticsearch 的功能非常强大,还有很多高级特性值得学习和探索。 希望本教程能够帮助你入门 Elasticsearch,并为你的后续学习奠定基础。 祝你在 Elasticsearch 的学习之旅中取得成功!

发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注

滚动至顶部