Meilisearch v1.14 发布啦 ✨ 在我们的博客上阅读更多内容

返回首页Meilisearch 的标志
返回文章
2023 年 3 月 27 日

向 Nuxt 电子商务添加网站搜索的分步指南

想要为您的 Vue 电子商务添加网站搜索吗?在本 Nuxt 完整指南中,了解如何集成实时排序、筛选和分面搜索。

Laurent Cazanove
Laurent Cazanove开发者体验工程师StriftCodes
A step by step guide to adding site search to your Nuxt ecommerce

搜索是在线购物不可或缺的一部分。专注于客户体验的研究公司 Forrester 报告称,使用站内搜索的访客转化率几乎高出两倍,购物时间也更长。但是,糟糕的搜索结果会降低销售额和品牌信任度。电子商务网站搜索需要快速、相关,并根据您业务的特定需求量身定制。

在本指南中,我们将引导您使用 JavaScript 框架 Nuxt 3 为电子商务网站构建搜索体验。

本指南分为三个部分

  • 设置全文搜索数据库
  • 构建“边输入边搜索”体验
  • 使用过滤器和分面优化搜索结果

本指南中的代码也可在 GitHub 仓库中找到,其中包含不同的检查点,以帮助您跟进。在本指南结束时,我们的应用程序将如下所示

Ecommerce website with real time search

最终应用程序预览(查看在线演示

目录

  • 要求
  • 设置 Meilisearch 全文搜索数据库
  • 构建“边输入边搜索”体验
  • 具有排序、分面和分页功能的高级搜索模式

要求

为了构建连接到 Meilisearch 数据库的 Nuxt Web 应用程序,我们将使用

  • Node 18 或更高版本 — 我们建议使用 nvm 以便轻松切换版本
  • yarn 3 — Node.js 的包管理器
  • Nuxt 3 — 一个使用 Vue 3 和 TypeScript 构建生产应用程序的框架
  • Meilisearch 1.3 — 一个用于创建开箱即用的相关搜索体验的搜索引擎

为了专注于搜索相关的事项,我们将使用一个模板仓库。此仓库包含用于构建传统电子商务布局的 UI 组件。让我们从克隆它开始

git clone https://github.com/meilisearch/ecommerce-demo

然后,让我们安装我们的依赖项

# Navigate to the project directory
cd ecommerce-demo

# Make sure to use Node.js 18.x before installing dependencies!
# nvm use v18

# Install dependencies
yarn

安装完成后,我们就可以开始设置数据库了。

遇到任何问题?请在 Discord 上的帮助频道寻求帮助!

设置 Meilisearch 全文搜索数据库

在构建前端应用程序之前,我们将初始化 Meilisearch 数据库。在第一部分中,我们将

  • 启动 Meilisearch 数据库
  • 将我们的数据集导入到产品索引中
  • 为电子商务搜索配置我们的 Meilisearch 实例

如果您正在使用本教程的仓库,请检出 1-setup-database 分支

git checkout 1-setup-database

启动 Meilisearch 数据库

启动 Meilisearch 实例的最简单方法是使用 Meilisearch Cloud。有 14 天免费试用期,无需信用卡。Meilisearch 是开源的,因此如果您喜欢在本地运行它,可以参考有关 本地安装的文档。在本指南中,我们将使用 Meilisearch Cloud。

接下来,我们需要创建一个 Meilisearch Cloud 帐户。登录后,我们进入“项目”页面。从那里,创建一个项目以生成新的数据库(给它起一个很酷的名字,例如 awesome-ecommerce-tutorial 😏),选择引擎版本,然后单击“创建”——数据库应该在一分钟内准备就绪。让我们继续前进,同时 Meili 小精灵正在为我们插电缆!

项目准备就绪后,我们可以访问“项目概览”页面以检索将在后续部分中使用的信息

  • 数据库 URL
  • 默认搜索 API 密钥
  • 默认管理 API 密钥

搜索 API 密钥提供只读权限:我们将在前端应用程序中使用它来进行搜索。管理 API 密钥允许更新数据库及其设置——请务必保密!

导入我们的产品数据集

我们的仓库在 database/data.json 中包含电子商务产品的示例数据集。我们将通过在 database/setup.js 文件中创建 Meilisearch 客户端将其导入到我们的数据库中。

我们还需要为我们的应用程序提供必要的凭据。为此,我们使用位于项目根目录的 .env 文件。.env 文件是存储凭据变量的常用方法,并且将被我们添加到 database/setup.js 中的代码读取。

首先,复制现有的 .env.example 文件,并将其重命名为 .env。然后,更新变量以匹配在“项目概览”页面上找到的凭据。更新 Meilisearch 相关的变量,使您的 .env 文件如下所示

# .env

# Meilisearch configuration
MEILISEARCH_HOST="use the Database URL here"
MEILISEARCH_ADMIN_API_KEY="use the Default Admin API Key here"
MEILISEARCH_SEARCH_API_KEY="use the Default Search API Key here"

# …

现在我们的环境拥有我们的数据库凭据,我们可以创建一个 Meilisearch 客户端来向我们的数据库添加内容,这个过程称为 seeding(种子填充)。使用 Meilisearch,对数据库执行的操作是异步的——我们称之为任务。我们将使用 watchTasks 辅助函数来等待任务完成,然后再退出我们的脚本。

database/setup.js 中的以下代码将存储在 database/data.json 中的数据发送到 Meilisearch

// database/setup.js

import * as dotenv from 'dotenv'
import { MeiliSearch } from 'meilisearch'
import { watchTasks } from './utils.js'
import data from './data.json' assert { type: 'json' }

// Load environment
dotenv.config()

const credentials = {
  host: process.env.MEILISEARCH_HOST,
  apiKey: process.env.MEILISEARCH_ADMIN_API_KEY
}

const INDEX_NAME = 'products'

const setup = async () => {
  console.log('🚀 Seeding your Meilisearch instance')

  if (!credentials.host) {
    console.error('Missing `MEILISEARCH_HOST` environment variable')
    process.exit(1)
  }
  if (!credentials.apiKey) {
    console.error('Missing `MEILISEARCH_ADMIN_API_KEY` environment variable')
    process.exit(1)
  }

  const client = new MeiliSearch(credentials)

  console.log(`Adding documents to \`${INDEX_NAME}\``)
  await client.index(INDEX_NAME).addDocuments(data)

  await watchTasks(client, INDEX_NAME)
}

setup()

使用 Yarn 运行我们的设置脚本

yarn setup

您应该看到类似于以下的输出

🚀 Seeding your Meilisearch instance
Adding documents to `products`
Start update watch for products
-------------
products index: adding documents
-------------
All documents added to "products"
  Done in 2.92s.

如果成功,恭喜——我们已连接到 Meilisearch 并导入了我们的数据。 🎉

您可以通过在浏览器中导航到您的数据库 URL 来浏览 Meilisearch 实例的内容。

Meilisearch mini-dashboard

迷你仪表板允许您浏览数据库内容。

为电子商务配置 Meilisearch

Meilisearch 提供了出色的搜索默认设置,包括对拼写错误的容忍度和预定义的排名规则,以优化相关性。电子商务搜索的其他关键功能包括排序和筛选。此外,根据营销活动、合作伙伴关系或 <insert business reason>,您可能需要实施自定义排名规则。

您可以通过调整数据库设置来自定义 Meilisearch。我们将在 database/setup.js 文件中执行此操作。

首先,让我们确定一个配置

  • 筛选:我们希望产品可以按品牌、类别、标签、评分、评论数和价格进行筛选;
  • 排序:我们希望产品可以按价格或评分排序;
  • 排名:我们希望算法优先考虑排序(在真正的商店中,您可能希望精选产品优先显示。)

我们可以在 database/setup.js 文件中实现这一点。我们将更新我们的 setup() 函数体,使其如下所示

// database/setup.js

// …

const setup = async () => {
  // Credentials verification code…

  const client = new MeiliSearch(credentials);

  console.log(`Adding filterable attributes to \`${INDEX_NAME}\``);
  await client
    .index(INDEX_NAME)
    .updateFilterableAttributes([
      "brand",
      "category",
      "tag",
      "rating",
      "reviews_count",
      "price",
    ]);

  console.log(`Adding ranking rules to \`${INDEX_NAME}\``);
  await client
    .index(INDEX_NAME)
    .updateRankingRules([
      "sort",
      "words",
      "typo",
      "proximity",
      "attribute",
      "exactness",
    ]);

  console.log(`Adding sortable attributes to \`${INDEX_NAME}\``);
  await client.index(INDEX_NAME).updateSortableAttributes(["rating", "price"]);

  // Adding documents and watching tasks…
};

setup();

更新索引设置会触发文档的重新索引(即,完整的数据库重建),这可能会影响单线程环境中的搜索性能。为了避免这种情况,最好先配置设置,然后再导入数据。

在上面的代码中,我们更新了

  • 可筛选属性 — 这启用了筛选和分面搜索
  • 排名规则 — 我们保留了 Meilisearch 默认值,但将排序移到顶部;
  • 可排序属性 — 以启用结果排序。

虽然不在本指南的范围内,但正确配置您的可搜索属性也很重要。这可以大大提高 索引性能

至此,我们已经完成了 Meilisearch 数据库设置。✅ 那么,让我们开始构建我们的 Nuxt 3 电子商务网站,好吗?

构建“边输入边搜索”体验

如果您正在使用 git 仓库进行跟进,请检出 2-search-as-you-type 分支

git checkout "2-search-as-you-type"

在继续之前,请确保在我们的 .env 文件中定义了 MEILISEARCH_SEARCH_API_KEY

创建 Meilisearch 客户端

我们有一个正在运行的 Meilisearch 数据库,但我们仍然需要一个客户端应用程序来与之交互。如果我们看一下我们的 package.json,我们看到我们有两个库可以使用

  • vue-instantsearch (Vue InstantSearch) 用于构建与我们的搜索客户端交互的 UI 组件;
  • @meilisearch/instant-meilisearch (Instant Meilisearch) 用于创建与 InstantSearch 兼容的 Meilisearch 客户端。

我们需要一个组件来处理对我们数据库的身份验证,并在我们应用程序的其他部分提供搜索相关状态。让我们在我们的 MeiliSearchProvider.vue 组件中执行此操作。它将索引名称作为 prop,并包含一个 slot 来包装可以访问状态的子组件。

<!-- components/organisms/MeiliSearchProvider.vue -->

<script lang="ts" setup>
  import { instantMeiliSearch } from "@meilisearch/instant-meilisearch";
  import { AisInstantSearch } from "vue-instantsearch/vue3/es";

  const props = defineProps<{
    indexName: string;
  }>();

  const { indexName } = toRefs(props);

  const { host, searchApiKey, options } = useRuntimeConfig().meilisearch;

  const searchClient = instantMeiliSearch(host, searchApiKey, options);
</script>

<template>
  <AisInstantSearch :index-name="indexName" :search-client="searchClient">
    <slot name="default" />
  </AisInstantSearch>
</template>

我们的组件本质上是 AisInstantSearch 组件的包装器。AisInstantSearch 是基于 InstantSearch 的集成的基础:它处理身份验证并将状态提供给其他 InstantSearch 组件。我们的代码执行三件事

  • 从运行时配置中拉取凭据和选项
  • 创建一个 InstantMeilisearch 客户端(即,与 InstantSearch 兼容的 Meilisearch 客户端)
  • 实例化一个 Vue InstantSearch 组件

我们将在主页的根目录 HomeTemplate.vue 中使用此组件。但仅凭此组件无法做太多事情。因此,让我们在将所有内容联系起来之前,先实现我们的搜索栏和结果。

使用搜索栏发送查询我们的应用程序需要一个搜索栏,供用户输入查询。

我们将更新我们的 MeiliSearchBar.vue 组件来处理这个问题。在此组件中,我们将输入字段的内容作为查询发送到我们的 Meilisearch 数据库。由于现有的 SearchInput 组件,我们的代码可以非常简单

<!-- components/organisms/MeiliSearchBar.vue -->

<script lang="ts" setup>
  import { AisSearchBox } from "vue-instantsearch/vue3/es";
</script>

<template>
  <AisSearchBox>
    <template #default="{ currentRefinement, refine }">
      <SearchInput
        :value="currentRefinement"
        @input="refine($event.currentTarget.value)"
      />
    </template>
  </AisSearchBox>
</template>

我们的组件使用来自 AisSearchBox 的 slot props。Slot props 允许父组件访问在子作用域中管理的状态。在这里,这些 slot props 使我们能够访问搜索相关状态,从而使我们能够构建自定义 UI。有了这个,我们就能够向我们的 Meilisearch 数据库发送请求。这意味着现在只缺少一件事——显示搜索结果。

显示搜索结果

最后,让我们更新我们的 `MeiliSearchResults.vue` 组件以显示我们搜索的结果。我们将以标准网格布局显示结果。我们可以使用  ProductCard 组件

<!-- components/organisms/MeiliSearchResults.vue -->

<script lang="ts" setup>
  import { AisHits } from "vue-instantsearch/vue3/es";
</script>

<template>
  <AisHits>
    <template #default="{ items }">
      <div class="items">
        <ProductCard
          v-for="product in items"
          :key="product.id"
          :name="product.title"
          :brand="product.brand"
          :price="product.price"
          :image-url="product.images[0]"
          :rating="product.rating"
          :reviews-count="product.reviews_count"
        />
      </div>
    </template>
  </AisHits>
</template>

<style src="~/assets/css/components/results-grid.css" scoped />

将它们联系起来

我们构建了三个组件:搜索客户端提供程序搜索栏搜索结果网格。这些组件在 HomeTemplate.vue 中使用。使用这些组件的行当前被注释掉了。随着我们在本指南中前进,我们将取消注释相应的行以查看我们的组件在运行。

让我们通过取消注释使用 `<MeiliSearchProvider/>`、`<MeiliSearchBar/>` 和 `<MeiliSearchResults/>` 的行来检查我们的实现是否成功。我们的代码应如下所示

<!-- components/templates/HomeTemplate.vue -->

<script lang="ts" setup>
  const sortingOptions = [
    { value: "products", label: "Featured" },
    { value: "products:price:asc", label: "Price: Low to High" },
    { value: "products:price:desc", label: "Price: High to Low" },
    { value: "products:rating:desc", label: "Rating: High to Low" },
  ];
</script>

<template>
  <MeiliSearchProvider index-name="products">
    <TheNavbar class="mb-5 shadow-l">
      <template #search>
        <MeiliSearchBar />
      </template>
    </TheNavbar>
    <div class="container mb-5">
      <div class="filters">
        <!-- Removed for clarity -->
      </div>
      <div class="results">
        <div class="mb-5 results-meta">
          <!-- <MeiliSearchStats /> -->
          <!-- <MeiliSearchSorting /> -->
        </div>
        <MeiliSearchResults class="mb-5" />
        <!-- <MeiliSearchPagination /> -->
      </div>
    </div>
  </MeiliSearchProvider>
</template>

<style src="~/assets/css/components/home.css" scoped />

我们现在有了与 Meilisearch 集成的基本 Nuxt 3 应用程序的支架。要以开发模式启动我们的应用程序,请运行以下命令

yarn dev

默认情况下,开发服务器 URL 是 localhost:3000。我们可以在浏览器中打开它,然后… tada 🎉 我们应该能够在搜索框中输入内容并看到结果出现

Ecommerce app with search bar and results.

一个带有搜索栏和结果的基本电子商务网站。

好的。我们有了一个可以实时搜索产品的工作应用程序。让我们添加一些闪亮的功能,使其更适合真实的电子商务。✨

具有排序、分面和分页功能的高级搜索模式

如果您正在使用 git 仓库进行跟进,请检出 3-advanced-search-patterns 分支

git checkout "3-advanced-search-patterns"

排序结果

排序对于浏览搜索结果至关重要。例如,用户可能希望查看按价格或评分排序的产品。我们将更新我们的 MeiliSearchSorting.vue 组件,以允许用户使用我们现有的 BaseSelect 组件更改结果的排序方式。我们将使其排序选项作为 props 接收。

<!-- components/organisms/MeiliSearchSorting.vue -->

<script lang="ts" setup>
  import { AisSortBy } from "vue-instantsearch/vue3/es";

  const props = defineProps<{
    options: Array<{
      value: string;
      label: string;
    }>;
  }>();

  const { options } = toRefs(props);
</script>

<template>
  <AisSortBy :items="options">
    <template #default="{ items, refine }">
      <BaseSelect :options="items" @change="refine($event.target.value)" />
    </template>
  </AisSortBy>
</template>

如果我们回顾一下我们的 HomeTemplate.vue 文件,我们可以看到定义了以下数组用于 options prop

const sortingOptions = [
  { value: "products", label: "Featured" },
  { value: "products:price:asc", label: "Price: Low to High" },
  { value: "products:price:desc", label: "Price: High to Low" },
  { value: "products:rating:desc", label: "Rating: High to Low" },
];

要查看我们的排序组件的运行效果,请取消注释使用 `<MeiliSearchSorting/>` 的行。请注意,只有在您预先配置了可排序属性的情况下,排序才会起作用。

使用分面和过滤器缩小结果范围

排序结果很好。但是对于庞大的产品目录,电子商务网站还需要过滤器来优化搜索结果。这就是分面的用途。让我们首先添加一个细化列表,用于按产品类别或品牌进行筛选。然后,我们将添加组件以按价格范围和评分进行筛选。

分面过滤器

让我们更新我们的 MeiliSearchFacetFilter.vue 组件,以显示给定属性的所有可能值的复选框列表。我们将使 attribute 成为一个 prop,以便该组件可重用。在我们的例子中,我们将它用于类别品牌。组件代码应如下所示

<!-- components/organisms/MeiliSearchFacetFilter.vue -->

<script lang="ts" setup>
  import { AisRefinementList } from "vue-instantsearch/vue3/es";

  const props = defineProps<{
    attribute: string;
  }>();

  const { attribute } = toRefs(props);
</script>

<template>
  <AisRefinementList :attribute="attribute" operator="or">
    <template #default="{ items, refine }">
      <BaseTitle class="mb-3 text-valhalla-100"> {{ attribute }} </BaseTitle>
      <BaseCheckbox
        v-for="item in items"
        :key="item.value"
        :value="item.isRefined"
        :label="item.label"
        :name="item.value"
        :disabled="item.count === 0"
        @change="refine(item.value)"
      >
        <BaseText
          tag="span"
          size="m"
          :class="[ item.count ? 'text-valhalla-500' : 'text-ashes-900']"
        >
          {{ item.label }}
          <BaseText tag="span" size="s" class="text-ashes-900">
            ({{ item.count.toLocaleString() }})
          </BaseText>
        </BaseText>
      </BaseCheckbox>
    </template>
  </AisRefinementList>
</template>

在取消注释我们 HomeTemplate.vue 中的相关行后,我们的应用程序现在应该显示类别和品牌的列表。类别列表应如下所示

A multi-facets selection list for category

类别过滤器允许仅显示与给定类别匹配的产品。

🆕 可选 – 分面搜索 & 排序分面值

Meilisearch v1.3 引入了两个功能:搜索分面值排序分面值

搜索分面值

搜索分面值

按名称或计数排序分面值

排序分面值

查看仓库 main 分支上的 MeiliSearchFacetFilter.vue 组件,了解如何实现它。

价格过滤器

要添加价格范围过滤器,我们将更新我们的 MeiliSearchRangeFilter.vue 组件。我们将使用我们现有的 RangeSlider 组件来显示一个滑块,允许用户设置最小值和最大值

<!-- components/organisms/MeiliSearchRangeFilter.vue -->

<script lang="ts" setup>
  import { AisRangeInput } from "vue-instantsearch/vue3/es";

  interface Range {
    min: number;
    max: number;
  }

  const props = defineProps<{
    attribute: string;
  }>();

  const { attribute } = toRefs(props);

  const toValue = (
    currentValue: Range,
    boundaries: Range
  ): [number, number] => {
    return [
      typeof currentValue.min === "number" ? currentValue.min : boundaries.min,
      typeof currentValue.max === "number" ? currentValue.max : boundaries.max,
    ];
  };
</script>

<template>
  <AisRangeInput :attribute="attribute">
    <template #default="{ currentRefinement, range, refine }">
      <BaseTitle class="mb-3 text-valhalla-100"> {{ attribute }} </BaseTitle>
      <div class="slider-labels text-valhalla-500 mb-2">
        <BaseText size="m">
          <span class="text-ashes-900">$ </span>{{ currentRefinement.min ??
          range.min }}
        </BaseText>
        <BaseText size="m">
          <span class="text-ashes-900">$ </span>{{ currentRefinement.max ??
          range.max }}
        </BaseText>
      </div>
      <RangeSlider
        :model-value="toValue(currentRefinement, range)"
        :min="range.min"
        :max="range.max"
        @update:model-value="refine($event)"
      />
    </template>
  </AisRangeInput>
</template>

<style scoped>
  .slider-labels {
    display: flex;
    justify-content: space-between;
  }
</style>

删除 HomeTemplate.vue 中对应行之前的注释,瞧!

A range slider allowing to set minimum and maximum values

价格范围过滤器允许设置最低和最高价格。

评分过滤器

对于在线购物者来说,一种有用的筛选方法是删除低于给定平均评分的产品,因此让我们更新我们的 MeiliSearchRatingFilter.vue 组件来处理这个问题。我们将使用 vue-instantsearch 中的 AisRatingMenu 组件,它有一个限制:它只能使用整数值进行评分。因此,我们将为其提供 rating_rounded 属性而不是 rating。我们的组件将接受两个 props:attributelabel(可选)。

<!-- components/organisms/MeiliSearchRatingFilter.vue -->

<script lang="ts" setup>
  import { AisRatingMenu } from "vue-instantsearch/vue3/es";

  const props = defineProps<{
    attribute: string;
    label?: string;
  }>();

  const { attribute, label } = toRefs(props);
</script>

<template>
  <AisRatingMenu :attribute="attribute" :max="5">
    <template #default="{ items, refine }">
      <BaseTitle class="mb-3 text-valhalla-100">
        {{ label ?? attribute }}
      </BaseTitle>
      <a
        v-for="item in items"
        :key="item.value"
        class="rating-link"
        :class="[item.isRefined ? 'text-dodger-500' : 'text-valhalla-500']"
        href="#"
        @click.prevent="refine(item.value)"
      >
        <span class="rating-label">
          <StarRating :rating="Number(item.value)" />
          <BaseText tag="span" size="m" class="ml-1">
            & Up
            <BaseText tag="span" size="s" class="text-ashes-900">
              ({{ item.count.toLocaleString() }})
            </BaseText>
          </BaseText>
        </span>
      </a>
    </template>
  </AisRatingMenu>
</template>

<style src="~/assets/css/components/rating-filter.css" scoped />

然后,铛铛!

A list allowing users to filter out items by minimum rating

评分过滤器组件允许按最低评分进行筛选。

分页结果

我们将实现一个分页系统,以允许用户更轻松地查找结果。在电子商务场景中,编号分页是推荐的方法,因为它允许用户记住页面,从而在他们想要查找以前看过的产品时更容易返回到这些页面。让我们更新我们的 MeiliSearchPagination.vue 组件

<script lang="ts" setup>
  import { AisPagination } from "vue-instantsearch/vue3/es";
</script>

<template>
  <AisPagination>
    <template
      #default="{ currentRefinement, pages, refine, nbPages, isFirstPage, isLastPage }"
    >
      <!-- First page -->
      <PageNumber
        v-if="!isFirstPage && !pages.includes(0)"
        :has-gap-separator="!pages.includes(1)"
        :is-current="currentRefinement === 0"
        @page-click="refine(0)"
      >
        Page 1
      </PageNumber>
      <!-- Current page and 3 previous/next -->
      <PageNumber
        v-for="(page, index) in pages"
        :key="page"
        :show-separator="index < (pages.length-1)"
        :is-current="currentRefinement === page"
        @page-click="refine(page)"
      >
        Page {{ page + 1 }}
      </PageNumber>
      <!-- Last page -->
      <PageNumber
        v-if="!isLastPage && !pages.includes(nbPages-1)"
        separator="before"
        :has-gap-separator="!pages.includes(nbPages-2)"
        :is-current="currentRefinement === nbPages-1"
        @page-click="refine(nbPages-1)"
      >
        Page {{ nbPages }}
      </PageNumber>
    </template>
  </AisPagination>
</template>

在取消注释我们 HomeTemplate.vue 文件中的对应行后,我们现在将在结果下方看到页面列表。此列表将始终显示第一页和最后一页,以及当前页以及当前页之前和之后的最多 2 页。

A list of pages

分页组件显示页面列表。

至此,我们刚刚完成了我们的电子商务应用程序。恭喜您完成本指南。 🎉

我们的最终应用程序应如下所示

An ecommerce application with real time site search with filters, facets, and pagination

我们的最终应用程序(查看在线演示

总结

让我们回顾一下我们构建的内容

  • 一个 Nuxt 3 电子商务网站
  • 一个用于初始化我们的 Meilisearch 数据库以进行电子商务搜索的 Node.js 脚本
  • InstantSearch 集成,用于搜索产品以及显示、筛选和排序结果

所有代码都在演示仓库中提供:https://github.com/meilisearch/ecommerce-demo

仓库 main 分支包含一些小的差异,例如 Meilisearch 被实现为 Nuxt 模块。这种方法对于希望实施服务器端渲染以改善 SEO 的用户非常有用。为了简洁起见,本指南中省略了服务器端渲染和与路由器同步状态等高级主题。

感谢阅读!我希望本指南对您有所帮助。请在我们的 Discord 社区中告诉我!

以下是与我们联系的其他方式

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 日