【发布时间】:2009-11-07 17:44:04
【问题描述】:
例如,我需要创建类似谷歌搜索查询解析器的东西来解析这样的表达式:
飞行远足或游泳 -"**穿着靴子走路 **" **作者:**hamish **作者:**reid
或
房子在纽约价格过高 $500000 有一个游泳池
我什至要如何开始构建类似的东西?有什么好的资源吗?
c#相关,请(如果可能)
- 编辑:这是我应该能够以某种方式转换为 sql 查询的东西
【问题讨论】:
例如,我需要创建类似谷歌搜索查询解析器的东西来解析这样的表达式:
飞行远足或游泳 -"**穿着靴子走路 **" **作者:**hamish **作者:**reid
或
房子在纽约价格过高 $500000 有一个游泳池
我什至要如何开始构建类似的东西?有什么好的资源吗?
c#相关,请(如果可能)
【问题讨论】:
您有多少个关键字(如“或”、“在”、“价格过高”、“与 a”)?如果您只有几个,我建议您也使用简单的字符串处理(正则表达式)。
但如果你有更多的东西,你可能想考虑为这些搜索表达式实现一个 real 解析器。 Irony.net 可能会帮助您(我发现它非常易于使用,因为您可以直接在代码中以接近 bnf 的形式表达您的语法)。
【讨论】:
Lucene/NLucene 项目还具有布尔查询和其他一些查询格式的功能。我不知道在您的情况下添加自己的扩展(如作者)的可能性,但可能值得一试。
【讨论】:
有几种方法可以做到,其中两种:
根据您的示例,该语言非常基础,因此根据关键字拆分字符串可能是最佳解决方案。
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,它们都是免费的。主要挑战是定义语法。
【讨论】:
语法对于您给出的第二个示例非常有效,但第一个(任何顺序关键字/命令字符串)最好使用 Split() 和一个处理各种关键字和命令的类来处理。您必须在拆分之前进行初始处理以处理带引号的区域(例如用稀有/未使用的字符替换带引号的区域中的空格)。
“:”命令在拆分完成后很容易找到并从搜索字符串中提取出来进行处理。只需遍历数组查找。
+/- 关键字也很容易找到并作为 AND/AND NOT 子句添加到 sql 查询中。
您可能会遇到问题的唯一地方是“或”,因为您必须定义如何处理它。如果有多个“或”怎么办?但是数组中关键字的顺序与查询中的顺序相同,所以不会有问题。
【讨论】:
我认为你应该只做一些字符串处理。没有聪明的方法可以做到这一点。
因此,将“OR”替换为您自己的或运算符(例如 ||)。据我所知,没有图书馆。
我建议你使用正则表达式。
【讨论】: