需要帮助进行我自己的搜索引擎实现的基本SQL查询



>我正在用java(eclipse)做一个搜索引擎实现我有一个名为 tbl_index 的表,我在其中保存所有 keyWords 和一个名为 keyWord 的列,我根据该列将 URL 保存在列url中。

现在,如果一个搜索词由多个单词组成,我将如何编写查询来查找包含所有单词的所有 URL。

表信息:

专栏 1 : keyWord (nvarchar(50))

专栏 2 : url (varchar(800))

这两个统称为表的主键。请提出一种我不必改变我的 talbe 结构的方法。尽管指出我当前架构中的任何错误会有所帮助。

另外,请建议一些好的索引技术来索引我从网站的html(keyWord列)中获得的关键字。

试试这个:

select distinct
  url 
from 
  tbl_index a 
where 
  (select count(*) from tbl_index b where a.url=b.url and b.keyword in ('word 1', 'word 2' . . .)) = n

其中n是您正在搜索的关键字数量,"单词 1"、"单词 2"等是关键字。

我建议您创建三个表:一个表为每个唯一 URL 提供一行,带有数字 ID 和 url 名称,另一个表包含每个唯一关键字的一行,带有数字 id 和关键字,然后是包含所有对 url id - 关键字 id 的交叉引用表:

create table urls (
  url_id int identity,
  url varchar(800),
  primary key (url_id)
)
create table keywords (
  keyword_id int identity,
  keyword nvarchar(50),
  primary key (keyword_id)
)
create table urlkeys (
  url_id int,
  keyword_id int,
  primary key (url_id, keyword_id)
)

通过这种方式,您应该减小数据的大小。上面的查询变为如下所示:

select 
  url
from
  urls
where (select count(*) from urlkeys join keywords on urlkeys.keyword_id=keywords.keyword_id where urlkeys.url_id=urls.url_id and keywords.keyword in ('word 1', 'word 2' . . .)) = n
最好在

keyword列上有一个索引

附言这是一个简单SQL解决方案的大纲,但正如许多人在评论中已经指出的那样,这是一个最好使用全文搜索解决方案解决的问题。一旦您尝试执行词干提取、邻近搜索、部分单词搜索、通配符等操作,任何基于 SQL 的解决方案都将达不到要求。

这基本上是 2 步过程。

一个。首先将您的搜索词分解为单独的字词,如下所示:

String[] words = searchTerm.split("\W+");

二.然后通过迭代单词数组来构建查询,并创建如下所示的查询:

Select url from tbl_index where keyword in ('word1', 'word2', 'word3');

这里的word1,word2,word3基本上是words[0], words[1], words[2]等等。

PS:您可能不想在表中精确匹配关键字,在这种情况下,我建议在MySQL查询中使用rlike子句以获得正则表达式功能。

最新更新