2014-06-22 26 views
1

我有一個擁有超過6000萬記錄的數據庫,由SphinxQL 2.1.1索引。每個記錄都有一個標題和一個catid(等等)。當新記錄被插入到數據庫中時,我試圖讓獅身人面像根據標題中的文本猜測catid。在SphinxQL中使用標題來確定可能的類別

我設法得到它的工作單的話,像這樣:

SELECT @groupby, catid, count(*) c FROM sphinx WHERE MATCH('*LANDLORDS*') group by catid order by c desc 

但是實際的標題很可能是這樣的:

Looking for Landlords - Long term lease - No fees!!! 

有什麼辦法,只是轉儲將整個標題字符串轉換成獅身人面像,並分解每個單詞並執行某種模糊匹配,返回最可能的類別?

回答

2

那麼這樣的獅身人面像不是'神奇'的,它沒有'模糊匹配'功能。

但可以近似一個:)兩個主要步驟...

  1. 從要求所有「單詞」,改爲只需要一些

  2. 改變排名,要儘量做到最好查詢和標題之間的「交集」,得到很高的權重,因此'泡沫'到頂部。

然後就可以取得最好的結果,並將其作爲「最佳猜測」。

(實際上有三分之一的詞語'for'和'the'很可能會導致大量的誤報,所以可能希望排除它們,或者在索引中使用停用詞,或者從查詢中刪除)

這樣的查詢的原型可能是這樣的使用羣體影響的匹配,並選擇不同的排序器

SELECT catid FROM sphinx WHERE MATCH('"Looking Landlords Long term lease No fees"/1') OPTION ranker=wordcount LIMIT 1; 

那。


與分組一起使用此版本,可能不會工作,因爲會包含大量低質量的匹配項。雖然可能試圖使用平均值,或總和來獲得綜合體重?

SELECT SUM(WEIGHT()) as w, catid FROM sphinx WHERE MATCH('"Looking Landlords Long term lease No fees"/1') GROUP BY catid ORDER BY w DESC OPTION ranker=wordcount LIMIT 1 

有很多方法來調整這個...

你可以嘗試其他rankers,如matchany。甚至有些自定義排名表達式。

或者更改法定人數,例如排名需要1個字,可能會導致至少幾個。

或者如果可以提取短語,例如

'「尋找房東」| 「長期租賃」| 「不收費」'

可能工作?

也可以不僅僅是取得最好的結果,取得前5-10名的結果,並將它們全部展示給用戶,因爲結果非常接近。

相關問題