对于如何在strapi (使用mysql)中实现模糊搜索,有什么想法吗?
例如:当我搜索“电视广告”时,我想得到一个名为“tv syd”的条目
发布于 2021-11-20 09:37:25
您可以在Strapi中创建一个自定义控制器,并包括像fuse.js这样的模糊搜索库。
如果需要帮助创建自定义控制器或将其连接到端点请参阅文档中的此页面
这是一个简单的控制器,用于对一个名为“电影”的表进行模糊搜索,并使用搜索项搜索标题和概要字段。
'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;
}
}
对于大型数据库表,您需要编写一个自定义mysql查询。但是我发现,如果条目少于几千条,这个解决方案非常有用,因为fuze为您提供了大量的选项,可以不同地查询多个字段和加权字段(即使电影标题比概要更重要)。
发布于 2021-08-10 13:59:36
我猜你的意思是MySQL的“全文搜索”。所以,我会试一试。
如果这样做或类似的事情,可能会有两种方法。
您可以利用Strapi过滤器的功能,contains, ncontains, containss and ncontainss
将做一件与全文搜索类似的事情。是的,这并不是完全的测试搜索,但它可以满足大多数情况。
即:
我还没有对这个做过深入的测试,但可能会成功的。您可以创建一个控制器端点,并且在控制器内部使用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
https://stackoverflow.com/questions/68714157
复制相似问题