Поисковая система И ИЛИ НЕ () парсер запросов - PullRequest
0 голосов
/ 29 июня 2019

Я создаю небольшой поисковик, и для этого мне нужна система запросов фраз.Я ищу хорошее решение для его решения.

Допустим, у нас есть следующие запросы:

[
  "Hello",
  "Hello AND World",
  "Hello OR !World",
  "(!Hello AND World) OR (foo AND bar)"
]

Я бы искал термины в моей базе данных и затем пересек / объединил/ не т. д. им.Но проблема в том, чтобы найти хорошую функцию, которая запрашивает их.

Мой первый подход был с объединением строк, поиском и т. Д., Это работает, если шаблон не сильно меняется.Но я хочу разработать рекурсивную функцию, выполняющую весь синтаксический анализ, но, к сожалению, я отстой от рекурсивных функций и надеюсь, что вы мне поможете.

function regExingBrackets(s) {
    let res = [];
    let re = /\((.*?)\)/gm;
    let m;
    while (m = re.exec(s)) {
        res.push(m[1]);
    }
    return res;
}

function parseQuery(str) {
    let andorparser = /(.+)\s(OR|AND)\s(.+)/gm
    let res = andorparser.exec(str);
    // res[1] first term, 2 -> OR / AND, 3 -> second term
}

Эти функции должны быть как-то связаны, и это должносначала идти по пути вниз, как начинать с! Hello (получить все элементы в базе данных, кроме hello), его результата И с World (получить все элементы World и пересечь их), а также И с двумя другими словами и их результатамиИЛИ.

Итак, в рекурсивной функции одновременно выполняется синтаксический анализ и использование функции>. <</p>

Что было бы хорошим решением для этой проблемы?Я очень рад и благодарен за вашу помощь!

С уважением, TehEbil

1 Ответ

0 голосов
/ 11 июля 2019

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

  const ParserObj = new Parser();

  let resp = ParserObj.parse("((hel & lo) & World) & bar");  // not working
  //let resp = ParserObj.parse("((hel & lo) & World)"); //  working example
  let str = makeIntersect(resp);
  console.log("str", JSON.stringify(str, null, 2));
  let str2 = transformParseToIntersect(str);
  console.log("str2", str2);

ссылка на плункер здесь

, если ключи поиска связаны стот же символ, например &, я хочу, чтобы они были подключены, например:

["hel", "lo", "world", "bar", "&"]

, но вместо этого он становится:

[["hel", "lo", "&"], "world", "bar", "&"]

та же проблема при смешивании его с |.

Причина упрощения - я хочу пересечь ключи поиска.Пересечение нескольких ключей происходит быстрее, чем пересечение пар и их результаты с другим миром / парой.

Я надеюсь, что мой парсер может помочь кому-то, у кого такая же проблема, с одной стороны, а с другой стороны, я надеюсь, что кто-то сможетбыть в состоянии помочь мне с моей следующей проблемой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...