2015-09-06 74 views
1

我有一個數據庫加載了美國的geonames's data。我希望在該表上執行查詢,以便從與Google地圖功能差不多相同的單個輸入中找到最接近的匹配項(即,用戶可以輸入郵政編碼,逗號分隔的分層地址,如'Nevada,Las拉斯維加斯「或兩者的組合)。MySQL:使用單個輸入搜索多列(GoogleMaps樣式)

到目前爲止,我已經添加FULLTEXT索引表中的相關領域,並從這樣的輸入進行查詢:

SELECT * FROM places WHERE MATCH(country_code, postal_code, place_name, admin_name1, admin_code1, admin_name2, admin_code2) AGAINST (?); 

在哪裏?被php腳本的輸入所取代。雖然它有點奏效,但它並沒有像預期的那樣執行,它並沒有把最相關的匹配放在第一位,並且需要一個完整的詞來開始找到匹配(我嘗試過使用通配符但變得更糟)。我也試着拆分輸入,如果它有逗號,但查詢的邏輯開始變得混亂,並且不能產生更好的執行腳本。

有沒有辦法在匹配這樣的廣義術語中搜索這個數據庫?

我通過AJAX查詢數據庫,所以我需要它開始搜索,即使這個詞還沒有完成(我正在使用jQuery的typeahead)。

提前致謝!

回答

0

用您的文本替換string_to_be_searched文本。

SELECT * FROM places WHERE 
instr(concat_ws(" ",country_code, postal_code, place_name, admin_name1, 
admin_code1, admin_name2, admin_code2),"string_to_be_searched")>0; 
+0

它的伎倆!謝謝!我閱讀了INSTR和CONCAT_WS上的文檔頁面,雖然我設法瞭解他們分別做了什麼,但我還是不太明白這是如何實現我想要的。 你能解釋一下嗎? 謝謝! – Ewajs

+0

同樣在最終版本中,我更改了「」,以使其工作,我認爲這是預期的分隔符。 – Ewajs

0
FULLTEXT(country_code, postal_code, place_name, admin_name1...) 

會讓你MATCH工作。但是......請注意FULLTEXT的侷限性:它只搜索某些最小字長度的「字」,

+0

我已經聲明瞭這些索引,我的問題是關於如何預先執行搜索,並且事先不知道查詢的答案在哪個列中。 – Ewajs

+0

你有幾個1-col索引?還是一個索引多列? –

+0

我已經嘗試了兩種方法,現在我在多列上使用單個索引 – Ewajs

0

您正在做的是搜索匹配的寄存器,但您並未對它們進行排序。

嘗試這樣:

SELECT *, MATCH(country_code, postal_code, place_name, admin_name1, admin_code1, admin_name2, admin_code2) AGAINST (?) AS relevance FROM places WHERE MATCH(country_code, postal_code, place_name, admin_name1, admin_code1, admin_name2, admin_code2) AGAINST (?) ORDER BY relevance DESC; 
+0

務必檢查您的PHP腳本是否替換兩次? –