如何为搜索查询创建解析器

时间:2009-11-07 17:44:05

标签: c# asp.net parsing logic

例如,我需要创建类似谷歌搜索查询解析器的东西来解析这样的表达式:

  

飞行远足游泳    - “**走进靴子**” **作者:** hamish **作者:** reid

  

  $ 500000 游泳池

我怎么会开始建立这样的东西?任何好的资源?

c#related ,请(如果可能)

  • 编辑:这是我应该以某种方式能够转换为SQL查询

5 个答案:

答案 0 :(得分:5)

你有多少个关键词(比如'或','in','price over','with a')?如果你只有几个我建议用简单的字符串处理(regexes)。

但是,如果您有更多内容,您可能需要考虑为这些搜索表达式实现真正的解析器。 Irony.net可以帮助你(我发现它非常容易使用,因为你可以直接在代码中以近乎bnf形式表达你的语法)。

答案 1 :(得分:1)

Lucene/NLucene项目具有布尔查询和其他一些查询格式的功能。我不知道在你的情况下添加像作者这样的自己的扩展的可能性,但它可能值得检查出来。

答案 2 :(得分:1)

实现目标的方法很少,其中两种方式:

  • 使用grammar进行解析(对复杂语言有用)
  • 使用regular expression进行解析和基本的字符串操作(对于更简单的语言)

根据您的示例,语言非常基本,因此根据关键字拆分字符串可能是最佳解决方案。

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一起使用的库是ANTLRGold Parser,两者都是免费的。主要的挑战是定义语法。

答案 3 :(得分:1)

语法对于您给出的第二个示例非常有效但第一个(任何顺序关键字/命令字符串)最好使用Split()和一个类来处理各种关键字和命令。在拆分之前,您必须进行初始处理以处理引用的区域(例如,使用稀有/未使用的字符替换带引号的区域内的空格)。

分割完成后,“:”命令很容易找到并拉出搜索字符串进行处理。只需遍历阵列即可。

+/-关键字也很容易找到,并作为AND / AND NOT子句添加到sql查询中。

您可能遇到问题的唯一地方是“或”,因为您必须定义它的处理方式。如果有多个“或”,该怎么办?但是数组中关键字的顺序与查询中的顺序相同,因此不会出现问题。

答案 4 :(得分:-1)

我认为你应该做一些字符串处理。没有聪明的方法可以做到这一点。

所以用您自己的或运算符(例如||)替换“OR”。据我所知,这里没有图书馆。

我建议你选择正则表达式。