索引(index)是由一组文档及其相关设置构成的集合。它类似于 SQL 中的表(table)或 MongoDB 中的集合(collection)。

一个索引通过 uid 标识,包含以下信息:

示例

假设您管理着一个类似IMDb的电影数据库。您可能需要存储多种类型的文档,如电影、电视剧、演员、导演等。在 Meilisearch 中,每个类别都将由一个索引来表示。

通过索引设置,您可以自定义该索引的搜索行为。例如,movies 索引可能包含具有 movie_idtitlegenreoverviewrelease_date 等字段的文档。通过设置,您可以使电影的 title 对搜索结果的影响大于 overview,或者使 movie_id 字段不可搜索。

一个索引的设置不会影响其他索引。例如,即使在同一服务器上,您也可以为 movies 索引和 costumes 索引使用不同的同义词列表。

索引创建

隐式创建索引

如果您尝试向不存在的索引添加文档或设置,Meilisearch 会自动为您创建该索引。

显式创建索引

您可以使用创建索引端点显式创建索引。创建后,您可以通过添加文档端点来添加文档。

虽然隐式创建索引更方便,只需一次 API 请求即可完成,但在生产环境中显式创建索引更为安全。这是因为隐式创建索引将多个操作捆绑在单个任务中。如果其中一个操作成功而另一个失败,问题可能难以诊断。

索引 UID

uid 是索引的唯一标识符。它在创建索引时设置,必须是一个整数或仅包含字母数字字符 a-z A-Z 0-9、连字符 - 和下划线 _ 的字符串。

一旦定义,uid 就无法更改,且不能创建具有相同 uid 的另一个索引。

{
  "uid": "movies",
  "createdAt": "2019-11-20T09:40:33.711324Z",
  "updatedAt": "2019-11-20T10:16:42.761858Z"
}

主键

每个索引都有一个主键:这是索引中所有文档必须包含的必要属性。每个文档都必须有一个与该属性关联的唯一值。

主键用于标识每个文档,因此索引中的两个文档永远不会完全相同。如果添加两个主键值相同的文档,它们将被视为同一文档:后添加的会覆盖之前的。如果尝试添加文档时,即使只有一个文档缺少主键,所有文档都不会被存储。

您可以手动设置索引的主键,或让 Meilisearch 自动推断。了解更多关于设置主键的信息。

了解更多关于主键字段的信息

索引设置

索引设置可以看作是一个 JSON 对象,包含许多用于自定义搜索行为的不同选项。

您可以自定义以下索引设置:

要更改索引设置,请使用更新设置端点或其任何子路由。

显示属性和可搜索属性

默认情况下,每个文档字段都是可搜索的,并且会在搜索响应中显示。但您可以选择将某些字段设置为不可搜索、不显示或两者兼具。

您可以通过更新设置端点,或分别使用显示属性端点可搜索属性端点来调整这些字段属性。

了解更多关于显示属性和可搜索属性的信息。

去重属性

如果您的数据集中包含多个相似文档,您可能希望搜索时只返回其中一个。假设您的costumes索引中有许多不同尺码的黑色夹克。将costume_name设为去重属性意味着Meilisearch不会返回具有相同costume_name的多件黑色夹克。

使用更新设置端点更新去重属性端点来指定去重属性。每个索引只能设置一个字段作为去重属性。

了解更多关于去重属性的信息。

分面搜索

分面(Facet)是 Meilisearch 中过滤器的一种特殊应用场景:某个属性是作为分面还是过滤器使用,取决于您的 UI 和 UX 设计。与过滤器类似,您需要先将分面属性添加到 filterableAttributes 中,然后使用 filter 搜索参数进行查询。

默认情况下,Meilisearch 为每个分面字段返回 100 个分面值。您可以通过更新设置端点更新分面设置端点来修改这个数值。

了解更多关于分面搜索的内容。

可过滤属性

过滤功能允许您根据不同类别细化搜索结果。例如,您可以搜索特定 genre(如 Science Fiction)且 rating 高于 8 的所有电影。

在对任何文档属性进行过滤之前,您必须通过更新设置端点更新可过滤属性端点将其添加到 filterableAttributes 中。然后使用 filter 搜索参数进行查询。

了解更多关于过滤的内容。

分页

为防止恶意抓取,Meilisearch 对单个搜索查询最多只返回 1000 条结果。您可以通过更新设置端点更新分页设置端点来修改这个限制。

了解更多关于分页的内容。

排序规则

Meilisearch 使用排序规则来对匹配文档进行排序,确保最相关的结果显示在顶部。所有索引创建时都带有相同的内置排序规则,并按默认顺序执行。这些规则的顺序非常重要:第一条规则影响最大,最后一条规则影响最小。

您可以通过 更新设置端点更新排序规则端点 来修改这个顺序或定义自定义排序规则,从而优先返回特定结果。

了解更多关于排序规则的内容。

可排序属性

默认情况下,Meilisearch 根据相关性对结果进行排序。您可以修改这种排序行为,使特定结果优先显示。

使用 更新设置端点更新可排序属性端点 将需要排序的属性添加到 sortableAttributes 中。然后您可以使用 sort 搜索参数 按升序或降序排列结果。

了解更多关于排序的内容。

停用词

您的数据集中可能包含一些希望在搜索时忽略的词语,例如因为它们不包含语义价值或出现频率过高(如英语中的 theof)。您可以将这些词添加到 停用词列表 中,Meilisearch 在搜索时会忽略它们。

使用 更新设置端点更新停用词端点 修改索引的停用词列表。除了提升相关性外,将常见词设为停用词还能显著提高性能。

了解更多关于停用词的内容。

同义词

您的数据集中可能包含含义相似的词语。对于这些词语,您可以定义同义词列表:这些词语在搜索时会被视为相同或相似。由于拼写错误和查询分词等因素,设置为同义词的词语不一定会返回完全相同的结果。

由于同义词是针对特定索引定义的,它们不会应用于同一 Meilisearch 实例上的其他索引。您可以使用更新设置端点更新同义词端点来创建同义词列表。

了解更多关于同义词的信息。

错字容忍度

错字容忍度是一项内置功能,即使您的搜索查询包含拼写错误(例如输入 chickne 而不是 chicken),也能帮助您找到相关结果。此设置允许您为索引执行以下操作:

  • 启用或禁用错字容忍功能
  • 配置允许错字的最小词长
  • 对特定词语禁用错字容忍
  • 对特定文档属性禁用错字容忍

您可以使用更新设置端点更新错字容忍设置端点来修改错字容忍度设置。

了解更多关于错字容忍度的信息。

索引交换

假设您在生产环境中有一个名为 movies 的索引,用户正在通过该索引进行搜索查询。您想要部署一个具有不同设置的新版本 movies,但常规更新可能会导致用户服务中断。这个问题可以通过索引交换来解决。

要使用索引交换功能,您需要创建第二个索引 movies_new,其中包含您希望对 movies 进行的所有更改。

这意味着 movies 的文档、设置和任务历史将与 movies_new 的文档、设置和任务历史进行交换,而不会对搜索客户端造成任何服务中断。处于 enqueued 状态的任务历史不会被修改。

交换完成后,用户仍然会向 movies 索引发送搜索请求,但此时该索引将包含 movies_new 的数据。您可以在交换后删除 movies_new,或者保留它以防出现问题需要回滚。

索引交换是一个原子事务:要么所有索引都成功交换,要么都不交换

更多信息,请参阅交换索引端点