sphinx是支持結果聚類的


Coreseek 4.1 參考手冊 / Sphinx 2.0.1-beta

Sphinx--強大的開源全文檢索引擎,Coreseek--免費開源的中文全文檢索引擎

本地化服務

中文技術支持:http://www.coreseek.cn/contact/

中文文檔翻譯:http://www.coreseek.cn/products-install/#doc_cn

5.7. 結果分組(聚類)

有時將搜索結果分組(或者說“聚類”)並對每組中的結果計數是很有用的-例如畫個漂亮的圖來展示每個月有多少的blog日志,或者把Web搜索結果按站點分組,或者把找到的論壇帖子按其作者分組等等。

理論上,這可以分兩步實現:首先在Sphinx中做全文檢索,再在SQL服務器端對得到的ID分組。但是現實中在大結果集(10K到10M個匹配)上這樣做通常會嚴重影響性能。

為避免上述問題,Sphinx提供了一種“分組模式”,可以用API調用SetGroupBy()來開啟。在分組時,根據group-by值給匹配項賦以一個分組。這個值用下列內建函數之一根據特定的屬性值計算:

  • SPH_GROUPBY_DAY, 從時間戳中按YYYYMMDD格式抽取年、月、日;
  • SPH_GROUPBY_WEEK, 從時間戳中按YYYYNNN格式抽取年份和指定周數(自年初計起)的第一天;
  • SPH_GROUPBY_MONTH, 從時間戳中按YYYYMM格式抽取月份;
  • SPH_GROUPBY_YEAR, 從時間戳中按YYYY格式抽取年份;
  • SPH_GROUPBY_ATTR, 使用屬性值自身進行分組.

 

最終的搜索結果中每組包含一個最佳匹配。分組函數值和每組的匹配數目分別以“虛擬”屬性 @group 和 @count 的形式返回.

結果集按group-by排序子句排序,語法與SPH_SORT_EXTENDED 排序子句的語法相似。除了@id@weight,分組排序子句還包括:

  • @group (groupby函數值),
  • @count (組中的匹配數目).

 

默認模式是根據groupby函數值降序排列,即按照 "@group desc".

排序完成時,結果參數total_found會包含在整個索引上匹配的組的總數目。

注意: 分組操作在固定的內存中執行,因此它給出的是近似結果;所以total_found報告的數目可能比實際給出的個分組數目的和多。@count也可能被低估。要降低不准確性,應提高max_matches。如果max_matches允許存儲找到的全部分組,那結果就是百分之百准確的。

例如,如果按相關度排序,同時用SPH_GROUPBY_DAY函數按屬性"published"分組,那么:

  • 結果中包含每天的匹配結果中最相關的那一個,如果那天有記錄匹配的話,
  • 結果中還附加給出天的編號和每天的匹配數目,
  • 結果以天的編號降序排列(即最近的日子在前面).

 

從版本0.9.9-rc2開始, 當使用GROUP BY時,可以通過SetSelect() API調用聚合函數 (AVG(), MIN(), MAX(), SUM())

 

因此如下Sphinx調用

$cl->SetGroupBy ( "category", SPH_GROUPBY_ATTR, "@count desc" );
$cl->SetGroupDistinct ( "vendor" );

等價於如下的SQL語句:

SELECT id, weight, all-attributes,
	COUNT(DISTINCT vendor) AS @distinct,
	COUNT(*) AS @count
FROM products
GROUP BY category
ORDER BY @count DESC

在上述示例偽代碼中,SetGroupDistinct()調用只與COUNT(DISINCT vendor)對應。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM