2010-10-16 172 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