2011-12-22 126 views
4

我正在尋找在我們的網站內實施Sphinx搜索。使用Sphinx搜索ORM

與使用新庫等做奇怪的事情不同,使用SphinxQL進行集成對我來說更有意義,因爲它非常接近原生SQL 。但是,我擔心我們可能最終不得不重新發明輪子,以便我們可以在系統中使用Sphinx。

爲了防止這種情況發生,我想將獅身人面像拖入我們的ORM系統。

有沒有人試過這個,或者任何人可以遇到的問題,我們可能會遇到這樣做?

我們目前使用Zend框架的結構與行走

+0

如果您不確定如何使用它,那麼爲什麼要使用它呢?我問這個問題是因爲從你的問題來看,它不是很清楚a)你想做什麼,b)你沒有給出一個具體的例子,可以更好地解釋你運行的問題。 – hakre 2011-12-24 00:15:23

回答

2

長時間行走的用戶在這裏誰最近添加到獅身人面像使用Zend Framework應用程序了。在行走和MVC

我在發展,過去幾個月已經注意到

注意的是,我想我已經採取了抽象的Propel提供了更直接的優勢。正如你可能知道的那樣,Propel爲ORM創建基類,以及僅僅擴展基類的空類。

目前很多業務邏輯都依賴於不同的模型,當完全相同的邏輯可以簡單地實現爲擴展Propel類中的方法時。

你應該採用相同的方法來實現Sphinx搜索。嘗試使用擴展的ORM類來抽象它。在獅身人面像

  1. 說明創建視圖,以簡化索引:斯芬克斯不會有先進的子查詢踢好容易被通過MySQL的函數混淆。嘗試抽象您想要索引的數據,以便總SQL像一樣簡單SELECT id,field1,field2,field3 FROM MyView。如果您想要將每個Sphinx文檔與用戶帳戶或其他外部關鍵字關聯在一起,這非常有用。

  2. 獅身人面像也只能索引UINT:可能是一個沒有腦子在大多數情況下,但你不能使用的UUID或負數來解決各種奇怪的數據庫結構。

  3. 避免重複的文檔ID:在每個Sphinx索引中,每個文檔ID必須是唯一的。讓我們假設你想讓A類型的對象可搜索,但是你想通過搜索標籤,評論和地理位置來找到對象A.使用Sphinx做到這一點的正確方法是使索引A與關於對象的所有元數據以及註釋,標記和地理位置的單獨索引進行比較,並確保將屬性sql_attr_uint映射回對象A,然後找出在你的代碼中檢索什麼。

  4. 使用最近的獅身人面像的版本:獅身人面像正在快速發展,如Debian發行版往往有在倉庫一個非常過時的版本。如果可能並且您有時間來確保穩定性,請從源代碼進行編譯(Sphinx幾乎沒有依賴關係,因此在大多數情況下它不會成爲問題)。此外,PHP庫代碼具有故障保險功能,可防止客戶端代碼與最新版本的Sphinx搜索守護進程交談。

  5. 獅身人面像的程度:你已經完成搜索後,你仍然需要從數據庫中檢索相關信息,因爲獅身人面像只會給你匹配的條目的ID。在某些情況下,它可能是明智的使用類似:

    $ A = AQuery ::創建() - > findByPk(ID_FROM_SPHINX)

    在foreach循環

    。但是在某些情況下,依靠ORM獲取列表可能效率太低,特別是如果您只想列出幾列例如搜索結果。然後,您可以使用自定義優化的SQL選擇來獲取信息(可以在Propel類中執行)。