ASP.NET - 如何正确拆分字符串进行搜索?

时间:2010-08-21 18:19:56

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

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

有人能指出我如何正确捕捉输入吗?

5 个答案:

答案 0 :(得分:3)

你想做的不是那么微不足道。实现“类似于谷歌”的搜索远远不能解析搜索字符串。

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

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

根据您计划获得的花哨程度,您可能会考虑Irony附带的搜索语法/实现。

http://irony.codeplex.com/

答案 3 :(得分:0)

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

相反,有三种正确的方法可以解决这个问题:

  1. 使用像Lucene这样的第三方解决方案。
  2. 通过类似antlr的内容构建语法。
  3. 构建自己的状态机。
  4. 对于这个级别的问题(并且假设搜索的核心足以完成你自己想要实现的内容),我可能会选择选项3.当你意识到这个问题时,这会更有意义表达式本身就是如何设置状态机的说明。你正在做的就是在你的代码中构建它。这使您能够调整性能和功能,而无需在代码中添加更大的词法分析器组件。

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

答案 4 :(得分:-1)

我会选择正则表达式

  1. 过滤出模式“\”。+ \“”(“词组搜索”)
  2. 的所有匹配项
  3. 过滤掉“[。+]”([不同搜索])
  4. 的所有匹配项
  5. 用“”
  6. 分开其余部分