我正在构建一个小的搜索引擎,为此,我需要一个短语查询系统。我正在寻找解决该问题的好方法。
比方说,我们有以下查询:
[
"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
答案 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);
如果搜索键使用相同的符号连接,例如&,我希望将它们连接起来,例如:
["hel", "lo", "world", "bar", "&"]
但改为:
[["hel", "lo", "&"], "world", "bar", "&"]
与|混合时出现相同的问题。
简化的原因是-我要与搜索键相交。多个键的相交比相交的对及其与另一个世界/对的结果要快。
我希望我的解析器一方面可以帮助遇到相同问题的人,另一方面,我希望someoen能够为我解决下一个问题。