0

我正在尝试构建一个类似于 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 上的“标签”表。

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

4

4 回答 4

3

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

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

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

于 2010-08-21T18:30:45.160 回答
0

正则表达式是你的朋友。看到这个问题

于 2010-08-21T18:26:54.613 回答
0

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

http://irony.codeplex.com/

于 2010-08-21T18:36:26.950 回答
0

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

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

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

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

有关如何执行此操作的示例,请查看我对这个问题的回答:
Reading CSV files in C#
hat I would do is build a state machine to parse the string character by character. 这将是实现完全正确解决方案的最简单方法,并且还应该产生最快的代码。

于 2010-08-21T18:43:39.103 回答