【问题标题】:Parsing a user submitted search query解析用户提交的搜索查询
【发布时间】:2014-06-21 18:34:38
【问题描述】:

在我的网络应用中,我希望允许我的用户搜索特定文章。

我需要支持以下运算符:

AND
OR
NOT
( )
" "

搜索查询可能类似于:

aaa AND bbb AND (ccc or ddd) NOT "eee fff"

如果可能,还应支持*? 等通配符。

如果可能的话,我希望得到一个 Linq 表达式,这将允许我查询 EF、ElasticLINQ 或 Linq2SQL。

你知道有哪些项目可以让我以某种简单的方式完成这项工作吗?

我一直在研究 Irony 和 Antlr,但它们似乎有点矫枉过正。

有什么想法吗?

编辑:
如果您对我如何自己编程有任何建议,我也会很感兴趣。但是以前一定有人担任过这个职位。

【问题讨论】:

  • 用户必须写AND, OR, ...吗?他们是程序员吗?你是不是有点过度设计了?你意识到你还需要做一些语法检查(AND AND AND AND(OR OR OR) NOT NOT NOT) 看不到任何 simple 解决方案。如果你真的需要做这样的搜索功能,试着让它不需要用户写任何东西(特别是如果他不是程序员)让他点击、选择、拖放,但不要写搜索查询。
  • 感谢您的评论。输入查询的人是网站管理员,熟悉语法。
  • 我同意这几乎可以肯定是过度设计。这样做的目的是使用高级查找不支持的语法查找文章,还是您试图让非 CRM 用户访问文章?

标签: c# linq search


【解决方案1】:

您可以按照 Microsoft Dynamics CRM 在其高级查找中处理此问题的方式来处理此问题:与其让用户手动输入自己的搜索字符串,他们有一个图形 UI,当您搜索时会转换为正确的字符串它。

我看到你正在为熟悉语法的人做这个。即使这个人知道查询是如何工作的,我仍然会采用这种方法:

  1. 从视觉表示中确定查询的工作方式要比从文本中容易得多。
  2. 即使您有语法经验,也更容易使用。
  3. 语法错误更难发生,因为语法是自动生成的。

【讨论】:

    【解决方案2】:

    我最近自己实现了一个类似的解析器,这是一项相当艰巨的任务。我必须定义语法,实现词法和句法分析,以及表达式评估逻辑。这里是:see Vb.Net code on Gist

    我在这里没有提供太多细节,因为恕我直言,这不是你的最佳选择,除非你有编写此类代码的经验。

    同时,我从未听说过任何工具可以自动执行此类句法和词法分析并且易于使用。

    我知道有 LexYaccBison,但这些都是针对 C++ 的,而且它们非常复杂。从来没有发现任何对 C# 感兴趣的东西。

    因此,我建议你再考虑一下,是否真的需要这样实现。

    UPD:我发现了一个不错的 SO 问题,如果您尝试实现自己的解析器,它可能对您有用:How to write a Parser in C#?

    【讨论】:

      【解决方案3】:

      解决方案:

      1. 使用你自己的 DSL(看看@http://www.antlr.org/

      2. 调用 odata Web 服务/wcf 数据服务以使用标准化查询 见例子@http://www.asp.net/web-api/overview/odata-support-in-aspnet-web-api/calling-an-odata-service-from-a-net-client

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-03-01
        • 2014-06-29
        • 1970-01-01
        • 2010-09-06
        • 1970-01-01
        • 1970-01-01
        • 2021-06-01
        • 1970-01-01
        相关资源
        最近更新 更多