2010-09-20 94 views
2

我試圖根據用戶輸入類型文本搜索一個SQL Server 2008表(包含大約700萬條記錄),用於引用和國家。我從用戶那裏得到的搜索字符串可以是任何類似的東西:如何根據用戶搜索查找城市和國家?

「舊金山,美國的酒店」或「紐約,紐約」或「巴黎sddgdfgxx」或「多倫多加拿大」的術語不會被逗號隔開而不是按照特定的順序,並且可能存在無用的數據。

這是我的嘗試:

方法1:FTS有載: 例如:SELECT * FROM其中包含cityNames(城市名, '字詞1和字詞2') - 有和 SELECT * FROM其中包含cityNames (cityname,'word1 or word2') - 與或

這並沒有很好地工作,因爲像'sddgdfgxx'這樣的術語在與'AND'一起使用時不會返回任何內容。方法2:這實際上是一個反向搜索,它的邏輯是搜索用戶是否輸入了字符串包含我桌子上的任何城市或國家。通過這種方式,我肯定會知道'艾克斯普羅旺斯'或'紐約'被搜索到。

例如:從cityCountryNames選擇*,其中「加拿大安大略省,多倫多就像cityCountryNames

筆記:我是不是能夠得到結果兩個字城市和查詢緩慢。

任何幫助表示讚賞。

回答

2

我強烈建議使用第三方API(如Google Geocoding API)來接收此類輸入並將其解析爲具有分立部分(街道地址,城市,州,國家等)的位置。然後,您可以使用這些分立部分在必要時搜索數據庫。

像谷歌和必應這樣的地圖服務已經解決了這個問題,比你或我曾經想過的要好,爲什麼不利用他們所做的所有工作?

+0

使用某些地理編碼API具有查詢限制,有些甚至禁止用於商業用途。所以一定要閱讀印刷精美的 – Mikos 2010-09-23 22:46:13

+0

@Mikos - 這當然是一個好主意。如果您要在地圖上顯示地理編碼點,Google允許使用其地理編碼API。看起來Bing可能有更嚴格的使用條款。 – 2010-09-24 17:58:15

0

SQL並非針對您正在執行的查詢類型而設計的,當然不是可擴展的。 我的建議如下:

  1. 指數所有的地方(城市+國家)成Solr指數。 Solr是使用Lucene構建的FOSS搜索服務器,可以毫秒或更短的時間輕鬆查詢7MM記錄索引。

  2. 用戶鍵入的字符串查詢solr和瞧,第一場比賽是最好的比賽。 因此,即使用戶輸入「Paris sddgdfgxx」,巴黎應該是您的第一次打擊。如果你想獲得真正複雜的使用正克的方法(​​又稱爲Lucene的Shingles

由於Solr的提供一個RESTful(HTTP)API應該很容易融入你是在什麼平臺。