用Drupal好些年了,英文站的搜索感覺還行,但中文站的搜索明顯不太好用,無論是性能、準确性等方面都體驗不佳。也曾經用過Apache Solr來彌補,不過配置起來有點麻煩,而且最後的搜索結果也并不一定很理想。
大數據量的站點要想生成搜索索引就比較困難,在字段也多的情況下更是索引起來很慢,而且容易造成MySQL超時報錯或者連接數堵塞。也想過減少一些不太必要索引的字段來降低索引負載,但大數據量的站點重新生成測試就需要等待很多天。這兩天幹脆拿一個數據量少的不重要站點來做測試,在“内容類型”的“管理顯示”設置中添加“自定義顯示設置”-“搜索索引”,然後把不需要索引的字段設置為“隐藏”,如果隻有标題需要索引,可以把所有字段都設置為“隐藏”,而标題是默認會被索引的,這個我在直接打開MySQL中相關搜索表查看可以确認。通過減少索引的字段,重新索引後數據庫中相應表的大小有所減少,證明這是一個有效降低負荷的辦法。
另外關于中文,在搜索設置中一般會開啟“簡單CJK(中日韓字符)處理”(是否啟用基于重疊排列的簡單CJK(中日韓)語言php文件分析器。如果您想使用一個外部的預處理器,則請将該選項關閉。該設置不影響其他語言。),再把“索引關鍵詞最小字數”進行修改,默認的3主要适合于英文站,而中文站很多人用2個甚至1個中文字來進行搜索,根據提示我怕設置過小會影響服務器性能,對于數據量稍大的站(例如數萬以上)我一般是設置為2,隻在個人博客等數據量很小的站設置為1。但在設置為2的站點上使用最小2個字來進行索引會導緻無法搜索到隻有1個特征值的内容(看後面補充的例子),我這兩天測試改為1然後重新索引,發現最後表的大小竟然降低,搜索體驗也更好,那以前的中文站點都可以準備改過來。批量設置的命令是:
drush vset minimum_word_size '1' drush vset search_cron_limit '100' drush search-reindex -y drush search-index
補充一個詳細例子:
在設置為2的情況下,搜索“武漢市和平裡”無結果,改為搜索“武漢市 和平裡”有結果,在數據庫中查找原因。
這是因為Drupal在對“武漢市江漢區和平裡”這個字段進行搜索索引的時候,以2個字來進行索引就有這些組合:“武漢”、“漢市”、“市江”、“江漢”、“漢區”、“區和”、“和平”、“平裡”8個2個字的組合,而用“武漢市和平裡”來搜索的時候,把“武漢市和平裡”劃分為“武漢”、“漢市”、“市和”、“和平”、“平裡”5個2個字的組合,其中的“市和”就在“武漢”、“漢市”、“市江”、“江漢”、“漢區”、“區和”、“和平”、“平裡”裡面找不到,所以搜索不到結果。
而人工加入一個空格進行分詞後搜索“武漢市 和平裡”,搜索詞就劃分為“武漢”、“漢市”、“和平”、“平裡”4個2個字的組合,在“武漢”、“漢市”、“市江”、“江漢”、“漢區”、“區和”、“和平”、“平裡”裡面可以全部找到,所以搜索就有結果。
但問題是一般中國人都不會去對中文搜索詞中間加入空格來進行人工分詞,Drupal自帶的簡單CJK也不像是Google、百度等搜索引擎那樣進行智能中文分詞,這樣就出現本來應該搜索得到,實際卻讓用戶失望的情況。
解決的辦法我想到的有三個:
- 嵌入Google、百度的站内搜索API,根本就不用Drupal自帶的搜索,但缺點是可能收錄不完整并且有搜索引擎的标記;
- 采用Apache Solr等專門的搜索插件取代Drupal自帶的搜索,缺點是設置麻煩、維護麻煩,服務器負載也有一定影響;
- 把Drupal自帶搜索的最小索引字符數改為1,缺點是可能搜索出來不太相關的内容,服務器負載依然比較大。
相比較來說,一些中小型網站采用第三個辦法比較簡單,也基本上可以解決多數問題。
评论