前往首页Meilisearch 的标志
返回文章
2021 年 2 月 23 日

Meilisearch:一张崭新的画布

Carolina Ferreira
Carolina FerreiraMeilisearch 的开发者布道师@CarolainFG
Meilisearch: a blank canvas

大家好!正如大家所知,我最近加入了 Meilisearch 担任开发者布道师。我的部分职责是通过回答问题来帮助社区,所以过去几个月,我的首要任务是了解 Meilisearch。我认为学习新软件的最佳方式是像任何开发者一样使用它:构建一些东西。因此,我着手制作了一个演示。

此演示创建时 Meilisearch 的最新版本是 v0.19,由于 Meilisearch 更近版本中增加了新功能,本博客文章中描述的一些变通方法已不再必要。

Meilisearch x MoMA

第一步是找到一个我喜欢使用的数据集。在几次未能成功整理一些非结构化数据集后,我偶然发现了现代艺术博物馆 (MoMA) 的仓库。真是个幸运的发现!他们有两个数据集:艺术家和艺术品。我决定选择艺术品数据集,因为它包含了每件艺术品的所有基本信息:标题、艺术家、尺寸、媒介,甚至艺术家的生平。但最棒的是,它是 JSON 格式的!无需转换,无需恢复 MongoDB 转储,无需抓取:Meilisearch 准备就绪 😀

我使用Meilisearch JavaScript 来创建索引、添加文档并自定义设置。在前端方面,我决定使用Instant Meilisearch,并结合Vue InstantSearch,如meilisearch-vue 仓库中所述。我有点懒,所以如果我找到一个能轻松提供好结果的工具,我就会用它!幸运的是,InstantSearch 提供了所有前端工具,可以随意自定义搜索环境,因此您只需几行代码即可体验 Meilisearch 的强大功能及其“即时搜索”功能。最后,我尝试添加了一些像样的样式,但这并非我的强项 😅 对于视觉设计,我提前致歉!

您可以在 此处查看结果。

Web interface with searchbar and results for the query "Picasso"

解决问题

所以,我找到了一个数据集,在 Meilisearch 实例中为其建立了索引,并为搜索设置了前端。都完成了,对吗?不完全是;现在是时候迭代并优化搜索结果的体验了。

我很幸运能找到一个与 Meilisearch 轻松配合的结构化 JSON 数据集。尽管如此,我还是必须做一些小的改动,以便更好地显示结果。由于 Meilisearch 的自动高亮功能不适用于存储在数组中的查询结果,因此我必须在添加它们之前将数组值转换为字符串

我还希望允许用户按日期排序结果。由于日期字段没有标准格式,我必须提取年份并将其存储在一个新的 `sortByDate` 字段中。然后又出现了一个问题:Meilisearch 不支持查询时排序(至少目前不支持)!为了规避这一点并实现此功能,我创建了另外两个具有自定义排名规则 `desc(DateToSortBy)` 和 `asc(DateToSortBy)` 的索引。每次您在下拉菜单中更改排序选项时,Meilisearch 实际上都在一个完全不同的索引中搜索,但它的速度如此之快以至于肉眼无法察觉 🤯

您可以在此处看到排序的效果

Web interface with the query "Picasso" sorting by ascending and then descending date gif

🧐 您可能已经注意到,我说 Meilisearch 尚不支持查询时排序——那是因为它是我们公开路线图上最受请求的功能之一,并且目前正在考虑中 🥳 所以如果您还没有这样做,请查阅 Meilisearch 的路线图,为您最喜欢的功能投票或提交您自己的想法!👉 更新说明:查询时排序功能已随 Meilisearch v0.22 发布。

创建此演示最具挑战性的部分是处理一个包含 138,151 个文档的未知数据集,因为大量的文档使得很难了解不同字段的可能值和长度。我最初希望用户能够按“媒介”筛选结果(例如“照片”或“绘画”)。直到我意识到某些艺术品的“媒介”字段竟然有很长的多行内容!例如这个:

"H (第 IX 卷):封面正面有 Kliun 的石印手稿文本;1 幅 Terent'ev 的石印插画;石印手稿文本。L (第 XIII 卷):封面正面有 Kirill Zdanevich 的石印插画和手稿设计;石印手稿和打字文本。M (第 XIV 卷):封面正面有 Kirill Zdanevich 的石印手稿设计和插画;石印手稿和打字文本。P (第 XVII 卷):封面正面有 Goncharova 的石印手稿设计;以及 Mikhail Pustynin 和 Olga Olesha-Suok 的石印手稿文本"

你能想象把它作为分面筛选器吗?这对用户界面来说不太友好……

接近完美

制作此演示最容易的部分是设置 Meilisearch。一旦我决定了哪些属性要被显示可搜索,其余的都易如反掌。除了上面提到的高亮和排序问题,我最后更改的是属性排名顺序。默认情况下,属性排名顺序是根据属性在第一个索引文档中出现的顺序自动生成的。在我的案例中,第一个属性是“title”,这意味着标题字段中包含匹配查询词的艺术品会排在结果列表的首位。这提供了不错的结果,但我很确定我能做得更好。

我不仅要考虑哪些属性对这个特定数据集来说最重要;我还必须思考用户更可能进行哪种类型的查询。如果用户使用艺术品标题查询特定艺术品,他会得到相关结果,因为使用的词语不太可能在许多其他字段中找到。然而,如果用户查询著名艺术家的名字,则很有可能在艺术品标题中找到该名字,例如作为致敬。所以我决定将“artist”放在可搜索属性列表的顶部。在我做出更改之前,当搜索“梵高”时,您会在第一批结果中发现:

Information and image of a litograph called "Do You Leave without seeing the 150 Van Gogh's" by Willem Jacob Henri Berend Sandberg

如您所见,这是一件由名为 Willem Jacob Henri Berend Sandberg 的艺术家创作的艺术品,其中“梵高”的名字出现在标题中,但它并非真正的梵高作品。

现在,在更改了设置中可搜索属性的顺序后,第一个结果确实是文森特·梵高创作的一件艺术品。

Information and image of the litograph "The Potato Eaters" by Vincent van Gogh

像这样简单的更改能够对搜索结果产生如此大的影响,真是令人惊叹。Meilisearch 开箱即用,超高相关性,同时它还允许您根据您的需求调整结果的相关性,这对于为最终用户提供出色的体验至关重要。

开源博物馆体验

演示源代码在GitHub上可用。欢迎随意尝试并展示您的成果!😁

我们能够访问这个非凡的目录,这有多酷?感谢 MoMA 的慷慨,您可以在世界任何地方探索博物馆。现在,多亏了 Meilisearch,它距离您仅 50 毫秒之遥 🚀


图片由 Robert ByeUnsplash 上提供

Meilisearch indexes embeddings 7x faster with binary quantization

Meilisearch 通过二进制量化将嵌入索引速度提高 7 倍

通过与向量存储 Arroy 结合实现二进制量化,在保持搜索相关性和效率的同时,大幅减少了大型嵌入的磁盘空间使用和索引时间。

Tamo
Tamo2024 年 11 月 29 日
How to add AI-powered search to a React app

如何在 React 应用中添加 AI 驱动的搜索

使用 Meilisearch 的 AI 驱动搜索构建一个 React 电影搜索和推荐应用。

Carolina Ferreira
Carolina Ferreira2024 年 9 月 24 日
Meilisearch is too slow

Meilisearch 太慢了

在这篇博客文章中,我们探讨了 Meilisearch 文档索引器所需的改进。我们将讨论当前的索引引擎、其缺点以及优化性能的新技术。

Clément Renault
Clément Renault2024 年 8 月 20 日