搜索部分字符串

时间:2016-11-08 01:25:47

标签: apostrophe-cms

我是否可以使用设置(或代码段)来使用撇号搜索执行部分字符串匹配搜索?例如:搜索“blue”应返回标题为“Learning Management Blueprint”的项目。

2 个答案:

答案 0 :(得分:0)

看起来需要添加一个RegExp。如果其他人需要这个,这里是相关的lib \ modules \ _撇号 - 搜索\ 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';
                }
            );

答案 1 :(得分:0)

如您所知,我是P' unk Avenue的Apostrophe的首席开发人员。

您的解决方案确实有效,但是一个严重的问题是您没有逃避用户的输入,以防止将.*等正则表达式元字符解释为这样。为此,您可以使用apos.utils.regExpQuote(s),它返回带有通过\转义的危险字符的字符串。

有一种更好的方法:只需使用req.query.autocomplete。 Apostrophe有一个内置的autocomplete光标过滤器,其工作方式与search过滤器不同。 autocomplete过滤器允许部分匹配(尽管仅在单词的开头),然后它通过常规search提供它找到的单词,以便结果仍按匹配质量排序。它还保留了使用search的大部分性能优势。

像你这样的正则表达式搜索会扫描整个mongodb集合(至少是所有相关类型的文档),这意味着如果你有很多内容,你会遇到性能问题。

autocomplete的一个警告是,它只会"看到"高优先级字段中的单词,如标题,标签等。它没有像正则表达式搜索(或search过滤器)那样查看文档的全文。这是保持绩效提升的必要权衡。