2015-06-03 19 views
2

Zope處理大搜索結果的傳統方式是批量輸出:第一個的批量大小項目被顯示出來,爲了獲得下一個數據塊,你點擊一個「next 「鏈接從服務器獲取下一個塊。提高Plone搜索結果的大表性能

現在有很酷的Javascript解決方案,它允許客戶端排序和過濾表, Datatables。這些工作正常;但是如果表格很大,並且Zope生成完整的HTML,那麼在頁面加載之前有時需要很長時間(似乎搜索速度相當快,但TAL引擎是性能瓶頸)。

那麼,這是如何解決最好的?

  • 從JSON生成整個表? (需要Javascript才能正常工作)
  • 使用標準分頁,如果有Javascript可用,請用客戶端表格解決方案替換它?
    • 化JSON提供的網頁2+數據
    • 通過JSON
    • 讓下個頁面或過濾
  • 表發動機負荷內容提供的所有數據是否有應用一些插件解決方案標準視圖(如文件夾內容)的這些增強功能?

我有一個網頁,其中包含約1600項,並採取60 +加載,這肯定需要改進......

任何指針和/或代碼段?謝謝!

+1

這是一個非常開放式的問題,這是不是最好的計算器。 https://community.plone.org可能會更好,因爲它允許進行對話。 – SteveM

+0

我不認爲這是開放式的;許多Zope/Plone開發者可能會遇到這種情況。也許有人有一個優雅的解決方案我在Plone社區網站註冊了,但我覺得那裏沒有可比的家(然而?)。當然,如果在堆棧交換中有更好的地方... – Tobias

+0

在這種情況下,請嘗試高級搜索解決方案Solr或ElasticSearch。具體的插件示例是collective.solr和collective.elasticsearch。但是,我還沒有使用它們,並且您的里程可能會有所不同。希望文檔能夠很快顯現出來。參考:http://github.com/collective/collective.solr/issues/60 – marr

回答

2

您必須推出自己的自定義設置。 plone 5中的新文件夾內容僅適用於json數據;但是,它一次不會返回整個文件夾結果集 - 它仍然會分頁服務器端。實際上,我沒有遇到任何將客戶端數千個結果進行排序的用例。我通常做那個服務器端並且帶有ajax的數據。

你會想從目錄結果(大腦)自己生成json數據結構。在某種意義上可能是這樣的:

import json 
from Products.CMFCore.utils import getToolByName 

catalog = getToolByName(context, 'portal_catalog') 
query = { 
    'path': { 
    'query': '/'.join(context.getPhysicalPath()), 
    'depth': 1 
    } 
} 
result = [] 
for brain in catalog(**query): 
    result.append({ 
    'id': brain.id, 
    'uid': brain.UID, 
    'title': brain.Title, 
    'url': brain.getURL() 
    }) 
return json.dumps(result) 

隨着JavaScript。有很多庫在表格中呈現json數據。

的事情,如果你有興趣,你可以調查:

+0

爲什麼有人想過濾和/或排序大表客戶端?因爲它很容易。你簡化渲染整個桌子並把它扔在一個很酷的桌子上。將這種工具與服務器進行尋呼和過濾非常困難;並且在大多數情況下它足夠快(加載頁面後,它非常快,因爲不需要網絡通信)。 – Tobias

+0

所以Plone 5將使用JSON(因此需要Javascript),但保持傳統的舊方式?!對於一個標準的解決方案,我希望能夠在沒有Javascript的情況下繼續工作,但是當啓用Javascript時,增加了便利功能(如客戶端排序和過濾)... – Tobias

+0

爲什麼?大多數情況下,分頁服務器端。我從來沒有與默認情況下返回數千條記錄的其餘API交互。要求客戶下載數千條記錄時,他們可能只關心前20個記錄對我來說似乎並不理想。僅僅因爲你有一些用例並不意味着所有其他的用例都是錯誤的。正如你所看到的,提供你自己的json結構可以很容易地完成你想要的巨大結果集,所以我不確定爲什麼你被我所期望的「標準解決方案」所激怒。 – vangheem