поиск по фразе в поисковом пакете метеоров - PullRequest
0 голосов
/ 02 июля 2018

У меня есть приложение-метеор, для которого я добавил пакет поиска-источника для поиска в определенных коллекциях, и он работает частично. То есть, когда я ищу термин foo bar, он возвращает результаты для каждого из «foo» и «bar». Это нормально, но я также хочу иметь возможность заключать термины в кавычки следующим образом: "foo bar" и получать результаты только для точного соответствия. в тот момент, когда я делаю это, я получаю пустой набор. Вот мой код сервера:

//Server.js
SearchSource.defineSource('FruitBasket', function(searchText, options) {  
    // options = options || {}; // to be sure that options is at least an empty object
    if(searchText) {
    var regExp = buildRegExp(searchText);
    var selector = {$or: [
      {'fruit.name': regExp},
      {'fruit.season': regExp},
      {'fruit.treeType': regExp}
    ]};

    return Basket.find(selector, options).fetch();
  } else {
    return Basket.find({}, options).fetch();
  }
});

function buildRegExp(searchText) {
  // this is a dumb implementation
  var parts = searchText.trim().split(/[ \-\:]+/);
  return new RegExp("(" + parts.join('|') + ")", "ig");
}

и мой код клиента:

//Client.js
Template.dispResults.helpers({

  getPackages_fruit: function() {
    return PackageSearch_fruit.getData({
      transform: function(matchText, regExp) {
        return matchText.replace(regExp, "<b>$&</b>")
      },
      sort: {isoScore: -1}
    });
  }
});

Заранее спасибо!

1 Ответ

0 голосов
/ 02 июля 2018

Я изменил шаблон .split, чтобы он игнорировал все, что находится в двойных кавычках.

/[ \-\:]+(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)/

Таким образом, вы можете просто обернуть точный поиск фразы в двойные кавычки, и он не будет разбит.
Есть еще одна вещь; поскольку нам не нужны кавычки, они удаляются в следующей строке с помощью функции .map с регулярным выражением, которое заменяет двойные кавычки в начале или конце строковой части: /^"|"$/

Пример кода:

function buildRegExp(searchText) {
  // exact phrase search in double quotes won't get split  
  var arr = searchText.trim().split(/[ \-\:]+(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)/);
  var parts = arr.map(function(x){return x.replace(/^"|"$/g, '');});
  return new RegExp("(" + parts.join('|') + ")", "ig");
}
console.log(buildRegExp("foo bar"));
console.log(buildRegExp("\"foo bar\""));
...