【问题标题】:ASP.NET - How to properly split a string for search?ASP.NET - 如何正确拆分字符串以进行搜索?
【发布时间】:2010-08-22 02:43:39
【问题描述】:

我正在尝试构建一个类似于 Google 上的搜索(关于封装在双引号中的完全匹配)。

让我们以下面的短语为例

“词组搜索”单个词[不同词组]

目前如果我使用以下代码

        Dim searchTermsArray As String() = searchTerms.Split(New String() {" ", ",", ";"}, StringSplitOptions.RemoveEmptyEntries)

        For Each entry In searchTermsArray
            Response.Write(entry & "<br>")
        Next

我的输出是

“短语
搜索”
单人
条款
[不同
短语]

但我真正需要的是构建一个键值对

phrase search     |  table1  
single            |  table1  
terms             |  table1  
different phrase  |  table2

其中 table1 是包含一般信息的表,table2 是类似于 stackoverflow 上的“标签”表。

谁能指出我如何正确捕获输入的正确方向?

【问题讨论】:

  • 对“类似于谷歌”做出尖刻评论的冲动是如此强烈。
  • 我只是将其用作参考点。我希望能够搜索用双引号括起来的多个单词,而不是将它们分成单个单词。

标签: asp.net linq-to-sql search key-value


【解决方案1】:

你想要做的并不是那么微不足道。实现“类似于 Google”的搜索远远超出了解析搜索字符串的范围。

我建议您不要重新发明轮子,而是使用可用于生产的解决方案,例如 Apache Lucene.NET 或 Apache Solr。那些处理解析和全文搜索。

但如果你只需要解析这种字符串,那么你真的应该考虑皮特指出的解决方案。

【讨论】:

  • 如果你真的想要类似于“谷歌搜索”的搜索能力,绝对推荐 lucene.net
  • 搜索是我的应用程序的一个非常小的部分。基本上该网站是一个活动列表网站,我需要能够搜索关键词(如乐队或场地名称 - 包括带空格的名称),但如果它们使用方括号,还可以按标签过滤。
  • 好吧...在研究了 Lucene.NET 之后,它看起来对我来说是正确的解决方案。感谢您的指导。
【解决方案2】:

正则表达式是你的朋友。见this question

【讨论】:

  • 虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接的答案可能会失效。
【解决方案3】:

根据您的计划,您可以考虑 Irony 中包含的搜索语法/实现。

http://irony.codeplex.com/

【讨论】:

    【解决方案4】:

    搜索字符串解析是一个非常规问题。这意味着虽然正则表达式可以看似接近,但它不会在不使用专有扩展的情况下将你带到那里,构建一个无法维护的表达式混乱,留下令人讨厌的边缘情况,无法按照你的方式工作,或三者的某种组合。

    相反,有三种正确的方法来处理这个问题:

    1. 使用第三方解决方案,例如 Lucene。
    2. 通过 antlr 之类的工具构建语法。
    3. 构建您自己的状态机。

    对于这个级别的问题(并假设搜索对于你正在做的事情来说足够核心,以至于你真的想自己实现它),我可能会选择选项 3。当你意识到常规的时候,这更有意义表达式本身就是如何设置状态机的指令。您所做的就是将其构建到您的代码中。这也应该使您能够调整性能和功能,而无需在代码中添加更大的词法分析器组件。

    有关如何执行此操作的示例,请查看我对这个问题的回答:
    Reading CSV files in C#
    我要做的就是构建一个状态机来逐个字符地解析字符串。这将是实现完全正确的解决方案的最简单方法,并且还应该产生最快的代码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多