【问题标题】:How to implement Fuzzy search in strapi cms如何在strapi cms中实现模糊搜索
【发布时间】:2021-10-13 06:30:09
【问题描述】:

关于如何在strapi(使用mysql)中实现模糊搜索有什么想法吗?

示例:当我搜索“tvs ad”时,我想获取名称为“tv syd”的条目

【问题讨论】:

  • 如果您希望任何人能够提供帮助,请改进问题。我猜你的意思是 MySQL 的“全文搜索”

标签: mysql strapi fuzzy-search


【解决方案1】:

您可以在 Strapi 中创建一个自定义控制器并包含一个模糊搜索库,例如 fuse.js

如果您需要帮助创建自定义控制器或将其连接到端点see this page in the docs

这是一个简单的控制器,用于对名为films 的表进行模糊搜索 并使用搜索词搜索标题和概要字段

'use strict';
const Fuse = require('fuse.js');

module.exports = {
  async fuzzySearch(ctx) {
    
    const searchTerm = ctx.query._search;
    
    const allFilms = await strapi.services.films.find();
    
    const fuse = new Fuse(allFilms, {
      keys:["title", "synopsis"]
    });
    
    const searchedFilms = fuse.search(searchTerm);
    
    return searchedFilms;
  }
}

对于大型数据库表,您需要编写custom mysql query。但是我发现如果您的条目少于几千个,这个解决方案会非常有效,因为 fuze 为您提供了大量选项来查询多个字段并以不同方式加权字段( 即使电影标题比概要更重要) .

【讨论】:

    【解决方案2】:

    我猜你的意思是 MySQL 的“全文搜索”。 所以,我会试一试。

    如果这样做或类似的事情,可能会有两种方法。

    您可以利用 Strapi 过滤器的强大功能contains, ncontains, containss and ncontainss 将执行与全文搜索类似的操作。是的,它并不完全是完整的测试搜索,但它可以满足大多数情况。

    即:

    参考:https://strapi.io/documentation/developer-docs/latest/developer-resources/content-api/content-api.html#filters

    我还没有真正深入测试过这个,但它可能会起作用。 您可以创建一个控制器端点,并在控制器内部使用 Knex 构建一个复杂的查询并请求一个全文响应。

    即:

    const result = await knex('users')
                .orWhereRaw('MATCH(firstname_preferred,lastname_preferred,username) AGAINST(? IN BOOLEAN MODE)', params.search)
                .limit(lim)
    
    

    参考: https://strapi.io/documentation/developer-docs/latest/development/backend-customization.html#knex https://gist.github.com/cameronblandford/808ca0f66acffb8b50b4e3704d6063a1

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-05-17
      • 2013-05-30
      • 2015-02-18
      • 2012-10-13
      • 1970-01-01
      • 1970-01-01
      • 2022-08-19
      • 1970-01-01
      相关资源
      最近更新 更多