搜索引擎AND OR NOT()查询解析器

时间:2019-06-29 20:55:37

标签: javascript parsing search

我正在构建一个小的搜索引擎,为此,我需要一个短语查询系统。我正在寻找解决该问题的好方法。

比方说,我们有以下查询:

[
  "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(获取数据库中的所有元素,但您好)开始,其结果与World(与所有World元素相交并相交) ),然后与其他两个单词及其结果进行“或”运算。

因此它在递归函数>中同时解析和使用一个函数。<< / p>

什么是解决该问题的好方法?非常感谢您的帮助!

亲切问候 TehEbil

1 个答案:

答案 0 :(得分:0)

我部分解决了我的问题。我在某个地方找到了一个计算器,并将其重写后可以用于我的用例解析器。

  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);

link to plunker here

如果搜索键使用相同的符号连接,例如&,我希望将它们连接起来,例如:

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

但改为:

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

与|混合时出现相同的问题。

简化的原因是-我要与搜索键相交。多个键的相交比相交的对及其与另一个世界/对的结果要快。

我希望我的解析器一方面可以帮助遇到相同问题的人,另一方面,我希望someoen能够为我解决下一个问题。