搜索部分字符串

Search for partial strings

是否有设置(或片段)可用于使用 apostrophe-search 执行部分字符串匹配搜索?例如:搜索 "blue" 应该 return 标题为 "Learning Management Blueprint" 的项目。

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

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

您的解决方案确实有效,但是一个严重的问题是您没有转义用户的输入以防止像 .* 这样的正则表达式 meta-characters 被解释为这样的。为此,您可以使用 apos.utils.regExpQuote(s),其中 returns 带有通过 \.

转义的危险字符的字符串

虽然有更好的方法来做到这一点:只需使用 req.query.autocomplete 即可。撇号有一个 built-in autocomplete 游标过滤器,其工作方式与 search 过滤器不同。 autocomplete 过滤器允许部分匹配(虽然只在单词的开头),然后它通过常规 search 提供它找到的单词,以便结果仍然按匹配质量排序。它还保留了使用 search.

的大部分性能优势

像您这样的正则表达式搜索将扫描整个 mongodb collection(好吧,至少是相关类型的所有文档),这意味着如果您有内容很多。

关于 autocomplete 的一个警告是,它在 high-priority 字段(如标题、标签等)中只有 "sees" 个单词。它不会像您的方式那样查看文档的全文正则表达式搜索(或 search 过滤器)可以。这是保持性能的必要权衡。