2016-11-08 164 views
1

是否存在可用於使用撇號搜索執行部分字符串匹配搜索的設置(或代碼段)?例如:搜索「藍色」應該返回標題爲「Learning Management Blueprint」的項目。搜索部分字符串

+0

在我的測試,搜索的 「藍色」 部分串的工作原理: VAR光標= self.apos.docs.find(REQ, { lowSearchText:/藍/ } ) 但使該可變沒有。這不應該等同,並工作? var searchText ='blue'; var cursor = self.apos.docs.find(req, { lowSearchText:searchText } ) –

回答

0

你知道我撇在P'unk大道的首席開發人員。

你的解決方案確實有效,但是一個嚴重的問題是你不會逃避用戶的輸入,以防止像.*這樣的正則表達式元字符被解釋爲這樣。爲此,您可以使用apos.utils.regExpQuote(s),它將通過\返回帶有危險字符的字符串。

有一個更好的方法來做到這一點,但只是使用req.query.autocomplete來代替。撇號有一個內置的autocomplete光標過濾器,其工作方式與search過濾器不同。 autocomplete過濾器允許部分匹配(儘管僅在單詞的開頭),然後它通過常規的search提供它找到的單詞,以便結果仍按匹配質量排序。它還保持使用search的許多性能優勢。

像你這樣的正則表達式搜索將會掃描整個mongodb集合(至少是所有相關類型的文檔),這意味着如果有很多內容,就會出現性能問題。

autocomplete的一個注意事項是,它只能「看到」標題,標籤等高優先級字段中的單詞。它不像正則表達式搜索(或過濾器)可以看到文檔的全文。這是保持性能的必要權衡。

0

看起來像添加RegExp是需要的。如果任何人需要這個,這裏是有關的lib \模塊\撇號搜索\ 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'; 
       } 
      );