【问题标题】:how to create a parser for search queries如何为搜索查询创建解析器
【发布时间】:2009-11-07 17:44:04
【问题描述】:

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

飞行远足游泳 -"**穿着靴子走路 **" **作者:**hamish **作者:**reid

房子纽约价格过高 $500000 有一个游泳池

我什至要如何开始构建类似的东西?有什么好的资源吗?

c#相关,请(如果可能)

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

【问题讨论】:

    标签: c# asp.net parsing logic


    【解决方案1】:

    您有多少个关键字(如“或”、“在”、“价格过高”、“与 a”)?如果您只有几个,我建议您也使用简单的字符串处理(正则表达式)。

    但如果你有更多的东西,你可能想考虑为这些搜索表达式实现一个 real 解析器。 Irony.net 可能会帮助您(我发现它非常易于使用,因为您可以直接在代码中以接近 bnf 的形式表达您的语法)。

    【讨论】:

    • 可能有数百个关键字,但并非一次都需要。
    • 这不是一个容易解决的问题,因为您必须为这数百个关键字分配“含义”。我想知道您的数据库架构可能是什么样的?
    • Irony.net 的绝佳链接,+1
    【解决方案2】:

    Lucene/NLucene 项目还具有布尔查询和其他一些查询格式的功能。我不知道在您的情况下添加自己的扩展(如作者)的可能性,但可能值得一试。

    【讨论】:

      【解决方案3】:

      有几种方法可以做到,其中两种:

      • 使用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,它们都是免费的。主要挑战是定义语法。

      【讨论】:

        【解决方案4】:

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

        “:”命令在拆分完成后很容易找到并从搜索字符串中提取出来进行处理。只需遍历数组查找。

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

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

        【讨论】:

          【解决方案5】:

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

          因此,将“OR”替换为您自己的或运算符(例如 ||)。据我所知,没有图书馆。

          我建议你使用正则表达式。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2021-06-01
            • 1970-01-01
            • 1970-01-01
            • 2011-05-30
            • 2010-09-06
            • 1970-01-01
            • 1970-01-01
            • 2018-11-29
            相关资源
            最近更新 更多