2010-08-21 59 views
0

我在嘗試構建與Google上的搜索類似的搜索(關於使用雙引號封裝的精確匹配)。ASP.NET - 如何正確拆分字符串以進行搜索?

讓我們用下面的語句爲例

「搜索短語」 單項[不同的短語]

目前,如果我用下面的代碼

 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 

,其中表1是包含常規信息的表格,而table2是與「stackoverflow」上的「標籤」類似的表格。

任何人都可以指出我如何正確捕捉輸入的正確方向?

+0

對「類似於谷歌」做出尖銳評論的衝動非常強烈。 – 2010-08-21 18:23:49

+0

我只是用它作爲參考點。我希望能夠搜索用雙引號括起來的多個單詞,而不是將它們拆分爲單個單詞。 – 2010-08-21 18:25:38

回答

3

你想要做什麼並不是那麼簡單。實現搜索「類似於谷歌的」遠遠超出解析搜索字符串。

我建議你不要重新發明輪子,而應使用生產準備好的解決方案,如Apache Lucene.NETApache Solr。那些應付解析和全文搜索。

但是,如果你只需要解析這種類型的字符串,那麼你應該真的考慮皮特指出的解決方案。

+0

絕對推薦lucene.net,如果你真的想搜索類似於「谷歌搜索」 – 2010-08-21 18:32:54

+0

搜索是我的應用程序的一個非常小的部分。基本上,該網站是一個活動列表網站,我需要能夠搜索關鍵詞(如樂隊或場地名稱 - 包括帶空格的名稱),但如果使用方括號,也可以使用標籤過濾。 – 2010-08-21 20:23:07

+0

好吧......在研究了Lucene.NET之後,它對我來說看起來是正確的解決方案。感謝您的指導。 – 2010-08-23 16:51:15

0

正則表達式是你的朋友。見this question

+0

儘管此鏈接可能回答問題,但最好在此處包含答案的重要部分,並提供供參考的鏈接。如果鏈接頁面更改,則僅鏈接答案可能會失效。 – ProgramFOX 2014-03-08 10:06:25

0

我會去的正則表達式

  1. 過濾出模式的所有匹配「\」 + \「」(「搜索短語」)
  2. 過濾掉所有匹配「[+] 「([不同的搜索])
  3. 分割剩下的由」「
0

根據您獲得計劃多麼花哨,你可能會考慮到已經被包含反諷的搜索語法/執行。

http://irony.codeplex.com/

0

搜索字符串分析是一種非正規的問題。這意味着,雖然正則表達式可能會看起來很親密,但如果不使用專有擴展名,構建不可維護的表達式混亂,則不會將您帶到一路,而是讓討厭的邊緣案例處於打開狀態,無法滿足您的需求,或三者的某種組合。

相反,有三種正確的方式來處理這個問題:

  1. 使用像Lucene的第三方解決方案。
  2. 通過像antlr這樣的東西構建語法。
  3. 建立你自己的狀態機。

對於這個級別的問題(並假設搜索足夠核心,你正在做什麼真的想自己實現它),我可能會去選擇3.這更有意義,當你意識到正則表達式本身就是如何設置狀態機的說明。你所做的只是把你的代碼編譯進去。這應該使您可以調整性能和功能,而無需在代碼中添加更大的詞法分析器組件。

對於你可能是如何做到這看看我的回答這個問題的例子:
Reading CSV files in C#
帽子我會做的是建立一個狀態機的字符來解析字符串的字符。這將是實現完全正確的解決方案的最簡單方法,並且應該導致最快的代碼。