2011-05-04 66 views
1

在我的應用程序(PHP/MySQL/JS)中,我有一個內置的搜索功能。其中一個搜索條件包含各種選項的複選框,因此,某些結果會比其他結果更相關,如果它們包含更多每個選項更少。設計「基於相關性」的搜索?

即選項是A和B,如果我搜索選項A和B,則只包含選項A的結果1爲50%相關,而包含選項A和B的結果2爲100%相關。

之前,我只是在基於表單輸入的基礎上進行簡單的SQL查詢,但這樣做有點難,因爲它不像數據LIKE「%query%」那麼簡單,而是有些結果更多對一些搜索查詢有價值,有些則不是。

我完全不知道從哪裏開始......有沒有人有相關的(哈!)閱讀材料指導我?

編輯:幾番思索,我想一些涉及到一個SQL腳本,以獲得原始數據,其次是許多多輪解析後是我必須做...

但是什麼都不緩存? :(

+0

選項A和B如何存儲在表中? – Khez 2011-05-04 02:52:21

+0

在基於選項的1或0表中。但這最終會混合到其他搜索條件中...... – 2011-05-04 03:01:16

+0

已添加答案,請務必查看並回答問題。 – Khez 2011-05-04 04:12:19

回答

2

看看在lucence項目 它在許多語言

可用這是PHP端口 http://framework.zend.com/manual/en/zend.search.lucene.html

它的索引項進行搜索,並返回相關的加權搜索結果,例如最好從y選擇x,其中像%pattern%這樣的名稱搜索

+0

看起來像全文搜索,這不是我正在尋找的... – 2011-05-04 03:08:01

+0

@ julian,我只是以爲你可以從他們使用的加權過程中收集一些東西,因爲這基本上是你想要做的。加重你的結果,所以最相關的就是最重要的 – bumperbox 2011-05-04 04:35:10

1

你需要的是一個強大的搜索引擎,就像solr一樣,雖然你可以在mysql上實現它,但它已經提供了開箱即用其他工具。

1

這裏有一個想法:做比較和總結結果。總和越高,標準越匹配。

怎麼樣(愚蠢)表是這樣的:

  • dob_year
  • dob_month
  • dob_day

找到誰分享最多三個日期的人與3/15/1980組件:

SELECT (dob_year = 1980) + (dob_month = 3) + (dob_day = 15) as strength, name 
from user 
order by strength desc 
limit 1 

良好的WHERE子句和索引將被要求阻止你做一個表掃描,但是......

你甚至可以添加一個權重列,例如

SELECT ((dob_year = 1980)*2) 

祝你好運。

0

鑑於你的答案,我的意見,這裏是你將如何做到這一點的例子:

首先表:

CREATE TABLE `items` (
`id` int(11) NOT NULL, 
`name` varchar(80) NOT NULL 
); 
CREATE TABLE `criteria` (
`cid` int(11) NOT NULL, 
`option` varchar(80) NOT NULL, 
`value` int(1) NOT NULL 
); 

隨後的一些項目和標準的例子:

INSERT INTO items (id, name) VALUES 
(1,'Name1'), 
(2,'Name2'), 
(3,'Name3'); 

INSERT INTO criteria VALUES 
(1,'option1',1) ,(1,'option2',1) ,(1,'option3',0), 
(2,'option1',0) ,(2,'option2',1) ,(2,'option3',1), 
(3,'option1',1) ,(3,'option2',0) ,(3,'option3',1); 

這將創建3個項目和3個選項併爲其分配選項。

現在有多種方式可以通過某種「強度」來訂購。其中最簡單的是:

SELECT i . * , c1.value + c3.value AS strength 
FROM items i 
JOIN criteria c1 ON c1.cid = i.id AND c1.option = 'option1' 
JOIN criteria c3 ON c3.cid = i.id AND c3.option = 'option3' 
ORDER BY strength DESC 

這會告訴你所有具有選項1或選項3,但那些用這兩個選項會出現排「的項目更高

這種運作良好,如果你。我們假設你對所有3個選項進行搜索,現在所有的項目都具有相同的強度,這就是爲什麼爲選項分配「權重」很重要的原因。你的優勢的價值,但是如果你的查詢不總是把相同的權重分配給任何地方的相同選項,那可能無法幫到你。 y通過以下查詢在每個查詢的基礎上實現:

SELECT i.* , IF(c1.value, 2, 0) + IF(c3.value, 1, 0) AS strength 
FROM items i 
JOIN criteria c1 ON c1.cid = i.id AND c1.option = 'option1' 
JOIN criteria c3 ON c3.cid = i.id AND c3.option = 'option3' 
ORDER BY strength DESC 

嘗試查詢,看看它是否是你需要的。

我還想指出,這不是處理能力方面的最佳解決方案。我建議你添加索引,使選項字段爲整數,儘可能緩存結果。

如果您有任何問題或需要添加任何內容,請發表評論。