Apostrophe cms 搜索部分字符串
是否有一个设置(或代码段)可用于使用撇号搜索执行部分字符串匹配的搜索?例如:搜索“蓝色”应返回标题为“学习管理蓝图”的项目。看起来需要添加RegExp。如果其他任何人需要,以下是相关的lib\modules\撇号search\index.js代码:Apostrophe cms 搜索部分字符串,apostrophe-cms,Apostrophe Cms,是否有一个设置(或代码段)可用于使用撇号搜索执行部分字符串匹配的搜索?例如:搜索“蓝色”应返回标题为“学习管理蓝图”的项目。看起来需要添加RegExp。如果其他任何人需要,以下是相关的lib\modules\撇号search\index.js代码: module.exports = { perPage: 15, construct: function(self, options) { self.indexPage = function(req, callback) {
module.exports = {
perPage: 15,
construct: function(self, options) {
self.indexPage = function(req, callback) {
req.query.search = req.query.search || req.query.q;
var allowedTypes;
var defaultingToAll = false;
var cursor = self.apos.docs.find(req, { lowSearchText: new RegExp(req.query.search, 'i') } )
.perPage(self.perPage);
if (self.filters) {
var filterTypes = _.filter(
_.pluck(self.filters, 'name'),
function(name) {
return name !== '__else';
}
);
看起来需要添加一个RegExp。如果其他任何人需要,以下是相关的lib\modules\撇号search\index.js代码:
module.exports = {
perPage: 15,
construct: function(self, options) {
self.indexPage = function(req, callback) {
req.query.search = req.query.search || req.query.q;
var allowedTypes;
var defaultingToAll = false;
var cursor = self.apos.docs.find(req, { lowSearchText: new RegExp(req.query.search, 'i') } )
.perPage(self.perPage);
if (self.filters) {
var filterTypes = _.filter(
_.pluck(self.filters, 'name'),
function(name) {
return name !== '__else';
}
);
如你所知,我是庞克大道撇号的首席开发者 您的解决方案确实有效,但是一个严重的问题是您没有逃避用户的输入,以防止像
和*
这样的正则表达式元字符被解释为这样。为此,您可以使用apos.utils.regExpQuote
,它返回包含通过\
转义的危险字符的字符串
但是有一种更好的方法:只需使用req.query.autocomplete
。撇号有一个内置的自动完成
光标过滤器,其工作方式与搜索
过滤器不同。autocomplete
过滤器允许部分匹配(尽管只在单词的开头),然后它通过常规的搜索
提供它找到的单词,因此结果仍然按匹配质量排序。它还保留了使用搜索的大部分性能优势
像您这样的正则表达式搜索将扫描整个mongodb集合(至少是所有相关类型的文档),这意味着如果您有大量内容,您将遇到性能问题
autocomplete
的一个警告是,它只“看到”高优先级字段中的单词,如标题、标签等。它不会像正则表达式搜索(或search
过滤器)那样看到文档的全文。这是保持性能的必要折衷。正如您所知,我是蓬克大道撇号的首席开发人员
您的解决方案确实有效,但是一个严重的问题是您没有逃避用户的输入,以防止像
和*
这样的正则表达式元字符被解释为这样。为此,您可以使用apos.utils.regExpQuote
,它返回包含通过\
转义的危险字符的字符串
但是有一种更好的方法:只需使用req.query.autocomplete
。撇号有一个内置的自动完成
光标过滤器,其工作方式与搜索
过滤器不同。autocomplete
过滤器允许部分匹配(尽管只在单词的开头),然后它通过常规的搜索
提供它找到的单词,因此结果仍然按匹配质量排序。它还保留了使用搜索的大部分性能优势
像您这样的正则表达式搜索将扫描整个mongodb集合(至少是所有相关类型的文档),这意味着如果您有大量内容,您将遇到性能问题
autocomplete
的一个警告是,它只“看到”高优先级字段中的单词,如标题、标签等。它不会像正则表达式搜索(或search
过滤器)那样看到文档的全文。这是保持性能的必要折衷。在我的测试中,搜索部分“blue”字符串是有效的:var cursor=self.apos.docs.find(req,{lowSearchText:/blue/}),但将其设为变量并不有效。这不应该是等效的吗?var searchText='蓝色';var cursor=self.apos.docs.find(req,{lowSearchText:searchText})在我的测试中,搜索部分“blue”字符串有效:var cursor=self.apos.docs.find(req,{lowSearchText:/blue/})但是把它变成一个变量并不是。这不应该是等效的吗?var searchText='蓝色';var cursor=self.apos.docs.find(req,{lowSearchText:searchText})