2010-10-16 222 views
0

您將如何實現自定義搜索引擎?自定義搜索引擎

你怎麼看待這樣的事情是什麼:

SELECT * 
FROM jobs 
WHERE job_id IN (
     SELECT job_id 
      FROM job_words 
     WHERE word_id IN (SELECT word_id FROM words w WHERE text = 'carpenter')) 
    AND job_id IN (
     SELECT job_id 
      FROM job_words 
     WHERE word_id IN (SELECT word_id FROM words w WHERE text = 'buildings')) 

或本:

SELECT j.* 
     ,s.matches 
    FROM jobs as j INNER JOIN 
     (SELECT jw.job_id, count(*) as matches 
      FROM job_words AS jw 
       INNER JOIN (SELECT word_id FROM words w WHERE text IN ('carpenter', 'buildings')) AS w ON w.word_id = jw.word_id 
     GROUP BY jw.job_id) as s ON s.job_id = j.job_id 
+0

對於什麼數據庫? – 2010-10-16 17:08:35

+0

沒關係。我正在考慮創建自己的搜索方式,而不是使用內置函數的數據庫。 – Eduardo 2010-10-16 17:27:38

+1

實際上,它確實 - 「SQL」代表「結構化查詢語言」,而不是「標準化」。據我所知,全文搜索(FTS)不是ANSI--你必須使用像Sphinx這樣的第三方FTS工具才能在數據庫之間進行移植。字符串函數在數據庫之間也沒有標準化,所以祝你好運! – 2010-10-16 17:35:14

回答

0

你會更好建設與關鍵字的表提前。你的代碼效率很低。 每次運行此代碼時,基本上都會運行O(n(n + n))。相反,請事先製作所有「木匠」和「建築物」的表格,並且如果搜索查詢的表格不存在,則使用您發佈的代碼。

+0

「木匠」和「建築物」是工作描述中的詞。這個sql語句查找包含兩個單詞的作業。 – Eduardo 2010-10-16 17:30:56

+0

沒錯。我認爲你將獲得的最佳表現是在工作描述中爲所有關鍵詞製作表格。基本上是在發佈所有關鍵字時對其進行散列。這對您的項目來說可能是過度的,只有當您的工作發佈相對於您正在運行的搜索次數的發佈頻率低得多時纔是必要的。 – amccormack 2010-10-16 17:35:43

0
SELECT * FROM jobs WHERE 
    job_id in (SELECT job_id FROM job_words WHERE 
     word_id in (SELECT word_id FROM words WHERE text in ('carpenter', 'buildings')) 
+0

這樣我們將搜索包含'木匠'或'建築物'的工作。 – Eduardo 2010-10-16 17:32:21