例如,我需要创建类似谷歌搜索查询解析器的东西来解析这样的表达式:
飞行远足或游泳 - “**走进靴子**” **作者:** hamish **作者:** reid
或
$ 500000 带游泳池
我怎么会开始建立这样的东西?任何好的资源?
c#related ,请(如果可能)
答案 0 :(得分:5)
你有多少个关键词(比如'或','in','price over','with a')?如果你只有几个我建议用简单的字符串处理(regexes)。
但是,如果您有更多内容,您可能需要考虑为这些搜索表达式实现真正的解析器。 Irony.net可以帮助你(我发现它非常容易使用,因为你可以直接在代码中以近乎bnf形式表达你的语法)。
答案 1 :(得分:1)
Lucene/NLucene项目具有布尔查询和其他一些查询格式的功能。我不知道在你的情况下添加像作者这样的自己的扩展的可能性,但它可能值得检查出来。
答案 2 :(得分:1)
实现目标的方法很少,其中两种方式:
根据您的示例,语言非常基本,因此根据关键字拆分字符串可能是最佳解决方案。
string sentence = "house in new york priced over $500000 with a swimming pool";
string[] values = sentence.Split(new []{" in ", " priced over ", " with a "},
StringSplitOptions.None);
string type = values[0];
string area = values[1];
string price = values[2];
string accessories = values[3];
然而,可能出现的一些问题是:如何验证句子是否符合预期形式?如果某些关键字可以作为值的一部分出现,会发生什么?
如果遇到这种情况,可以使用一些库来使用定义的语法解析输入。其中两个与.Net一起使用的库是ANTLR和Gold Parser,两者都是免费的。主要的挑战是定义语法。
答案 3 :(得分:1)
语法对于您给出的第二个示例非常有效但第一个(任何顺序关键字/命令字符串)最好使用Split()和一个类来处理各种关键字和命令。在拆分之前,您必须进行初始处理以处理引用的区域(例如,使用稀有/未使用的字符替换带引号的区域内的空格)。
分割完成后,“:”命令很容易找到并拉出搜索字符串进行处理。只需遍历阵列即可。
+/-关键字也很容易找到,并作为AND / AND NOT子句添加到sql查询中。
您可能遇到问题的唯一地方是“或”,因为您必须定义它的处理方式。如果有多个“或”,该怎么办?但是数组中关键字的顺序与查询中的顺序相同,因此不会出现问题。
答案 4 :(得分:-1)
我认为你应该做一些字符串处理。没有聪明的方法可以做到这一点。
所以用您自己的或运算符(例如||)替换“OR”。据我所知,这里没有图书馆。
我建议你选择正则表达式。