iT邦幫忙

0

ajax search 多個條件搜尋?

https://www.google.com.tw/search?safe=active&ei=E4rBW4mRHImB8gXG7IHYCg&q=ajax+search+like+function+google&oq=ajax+search+like+function+google&gs_l=psy-ab.3...12344.13400.0.13580.9.9.0.0.0.0.130.769.6j3.9.0....0...1c.1.64.psy-ab..2.2.167...35i304i39k1j0i13i5i30k1j0i8i13i30k1.0.23dM1_9JkNI

我在谷歌上搜尋了一下
我發現 ajax search 都是單一條件搜尋
後端接收都是 %{XXX}% 有點模糊搜尋
卻不能像谷歌搜尋那樣
我輸入越多條件 能搜得越精準
例如 「台北 美食 火鍋」
就可以透過這三個關鍵字去找到更精準的結果
我想問說ajax 能怎麼寫,也能夠有這樣的效果?

搜尋這件事並不是下個語法,資料庫吐東西出來這麼簡單的事情

不考慮效能和結果的關聯性的話,用土法煉鋼去組合like語法是可以的

各家db引擎還有一個叫**全文檢索**的技術可用,但是又有中文分詞的問題要解決...
(業界已經有公司在提供這種搜尋的服務了,當然商業邏輯是不會跟你說的)

所以真的要深入下去就是要設計出一套自己的演算法應用在db引擎上
google就是屬於這一種
4
Homura
iT邦研究生 3 級 ‧ 2018-10-13 15:19:07
最佳解答

這個其實蠻有趣
我沒想過這個問題
但是你仔細觀察google的querystring
以這為例

https://www.google.com.tw/search?safe=active&ei=E4rBW4mRHImB8gXG7IHYCg&q=ajax+search+like+function+google&oq=ajax+search+like+function+google&gs_l=psy-ab.3...12344.13400.0.13580.9.9.0.0.0.0.130.769.6j3.9.0....0...1c.1.64.psy-ab..2.2.167...35i304i39k1j0i13i5i30k1j0i8i13i30k1.0.23dM1_9JkNI

你會發現q這個變數是由多個字串變成
就是說你搜尋打ajax search like function google
關鍵字用空格隔開
代表他在你按下搜尋的同時
他把你的搜尋字串把空格取代成+然後丟進q這個變數裡
這樣做應該是querystring不能有空格

再來當後端接到時
正常來說我們後端要先定義好有那些變數
所以這邊就代表用q來接收
在做字串切割變成陣列

SQL條件再用一個for迴圈讀出
我後端用C#的
所以我隨便寫個C#範例

string[] q = request.queryString("q").split('+');
strgin sql = "SELCT * FROM Table WHERE 0=0 AND (";
for(int i = 0;i < q.length ;i++)
{
  sql += " OR 條件欄位 = " + q[i];
}
sql += ")";

大概這樣

小魚 iT邦好手 1 級 ‧ 2018-10-14 09:17:51 檢舉

理論上是這樣沒錯,
但是Google在實際運作上還有很多步驟,
而且針對幾十種語言應該都是分開處理的,
而且不是每個字都會顯示出來,
有"跟沒有"又會有差,
總之很多的眉角啊...

Homura iT邦研究生 3 級 ‧ 2018-10-14 10:20:59 檢舉

小魚
google的當然比較厲害囉/images/emoticon/emoticon12.gif

1
小魚
iT邦好手 1 級 ‧ 2018-10-13 14:51:56

ajax不會有這樣的效果,
ajax只是接收後端傳過來的資料,
重點是你的後端API怎麼樣寫,
才會有這樣的效果,
這個要寫看起來很複雜了...

froce iT邦高手 1 級 ‧ 2018-10-15 08:30:36 檢舉

https://transbiz.com.tw/google%E6%90%9C%E5%B0%8B-search-tips/
單純做第一項的話,只是基於資料庫的實現應該還好,問題是如果資料量大,搜尋效能、背後如何評分網頁是最符合的,那就是google為何是google的原因了。

0
犬千賀
iT邦新手 5 級 ‧ 2018-10-18 14:21:14

我也來試試看...

// 先對搜尋字串做點處理...(略
SELECT * FROM `table`
WHERE `column` REGEXP '(台北|美食|火鍋)'
ORDER BY `column`='台北' DESC, `column`='美食' DESC, `column`='火鍋' DESC
0
orzzro
iT邦新手 5 級 ‧ 2018-10-19 09:52:12

首先這和ajax沒關係,這是前端你要怎麼實作的問題
那就不提這個

你想要的應該是要找一個適合全文檢索引擎,用傳統RMDBS的查詢SELECT指令是很難達到的
不過後來DB 都有支援 你可以search "full text search",目前sql server 及 mysql
如果你想要實現簡單的全文檢索,這樣可以很容易達到

但如果要更好的效能,可能就要引入全文檢索引擎

還有全文檢索不單單只有找出來這樣,像如何斷詞斷字,相關性如何定義 等
以上簡單的藥引子,提供給你 希望對你有幫助

我要發表回答

立即登入回答