2016-10-02 79 views
0

我們都知道在Facebook上圖搜索存在。用戶可以搜索喜歡騎自行車和來自倫敦的人,例如喜歡瑜伽的朋友的朋友,或者某個月或某年的朋友或男朋友的照片。在我的網站上創建一個類似Facebook的搜索

所有這些數據都是從沒有過濾字段的單個搜索輸入中提取的。

我想從類似於PHP的東西開始,但我無法確切知道如何實現。

我想知道這是通過一個特定的數據庫設計方法(簡單的RDBMS)只應用...或者它是一種圖形節點結構,得到邏輯鏈接到數據庫表關鍵字...或混合RDBMS和NOSQL ......或其他任何方法。至於文本輸入本身,必須對特定關鍵字進行某種解析和匹配才能獲得數據的相關性並將其引導至適當的查詢執行。

什麼是在我的網站中實現php圖表搜索(或類似的至少)的最佳實踐,我有類似零售電子商務系統與分組相關數據?

+0

你的問題對於SO來說太寬泛了,因爲你沒有真正的問題陳述(比如哪個代碼不工作)。然而,你要找的就是實時搜索 - 並且有很多JS庫以及教程,可以幫助你基於文本輸入實現實時搜索。實時搜索需要考慮很多事情,比如數據庫設計以及如何查詢表格等。 – Terry

+0

如果您對Graph數據庫感興趣,可能需要使用Neo4j進行統計,我相信,一些自然語言處理已經出爐。儘管與@Terry同意。這不適用於SO。 – JNevill

+0

好吧,夥計們,謝謝你的信息:) – KAD

回答

0

您可以分別爲每個示例解決問題,但它可能會很乏味,而且很可能在性能方面遇到困難。

的人誰喜歡騎自行車和來自倫敦(SQL)

SELECT users.id 
    FROM users, posts, topics, locations 
    WHERE posts.topic_id = topics.id 
     AND users.id = posts.author_id 
     AND users.location_id = locations.id 
     AND locations.city = 'London' 
     AND topics.name = 'cycling'  
GROUP BY users.id 
ORDER BY COUNT(posts.id) DESC 

(使用 '倫敦' '喜歡騎自行車',併成爲一個真正寬鬆的定義)

關係數據庫不能很好地處理大量連接。你的表現將會在負載下或大數據集中受到影響。


然而,在圖形數據庫(如Neo4j的,或TitanDB),你可以遍歷相關實體的圖形和收集匹配實體節點在一個更通用的方法,在服務優化環境您正在考慮的用例類型。

相同的查詢(暗號 - Neo4j的)

MATCH (topic:Topics {name:'cycling'}) 
      <-[:POST_TOPIC]-(post:Posts) 
      -[:AUTHORED_BY]->(user:Users) 
    WHERE user-[:RESIDENT_OF]->(location:Location {city:'London'}) 
    RETURN user.id AS user_id, count(post) AS post_count 
ORDER BY post_count DESC 

這些也表達爲小鬼遍歷(泰坦和其他圖形DBS),但他們開始變得相當冗長,難以破譯。

有一些通用的方法可以用facebook風格的圖形搜索相關性來處理您描述的內容。就你而言,這聽起來像你可能想要個性化搜索,例如所有與搜索者分離幾度的相關頂點(使用任何邊緣關係:位置,興趣,朋友等等)。


如果你不能輕易地列舉你想建立今天的所有用例,你可能會用一個圖形數據庫快樂,這樣你就可以用你的想法實驗,並把它們發射到生產,而不必出於性能原因而偷工減料。

+0

聽起來不錯@彼得謝謝你。您如何看待關鍵字的定義,換句話說,我怎麼知道騎自行車應該針對主題和倫敦的位置進行查詢。是否有一種algortihm將關鍵字與數據庫中的實體聯繫起來,還是僅僅是一個反覆試驗的問題? – KAD

+0

你可以嘗試通過圖表距離(在搜索者和具有匹配關鍵字的節點之間)做一些通用的事情。但最終,您可能想要定製圍繞特定實體類型的邏輯。 –

+0

你能不能更好地解釋你的評論,這樣的想法更清楚,也許有一個小例子左右呢? – KAD