如何在MySQL中实现关键字搜索?

san*_*anu 34 mysql sql search

我是SQL编程的新手.

我有一个表的工作,其中字段是id,position,category,location,salary range,description,refno.

我想从前端实现关键字搜索.关键字可以驻留在上表的任何字段中.

这是我尝试过的查询,但它包含很多重复的行:

SELECT
    a.*,
    b.catname
FROM
    job a,
    category b
WHERE
    a.catid = b.catid AND
    a.jobsalrange = '15001-20000' AND
    a.jobloc = 'Berkshire' AND
    a.jobpos LIKE '%sales%' OR
    a.jobloc LIKE '%sales%' OR
    a.jobsal LIKE '%sales%' OR
    a.jobref LIKE '%sales%' OR
    a.jobemail LIKE '%sales%' OR
    a.jobsalrange LIKE '%sales%' OR
    b.catname LIKE '%sales%'
Run Code Online (Sandbox Code Playgroud)

Gre*_*reg 54

对于VARCHAR字段上的单个关键字,您可以使用LIKE:

SELECT id, category, location
FROM table
WHERE
(
    category LIKE '%keyword%'
    OR location LIKE '%keyword%'
)
Run Code Online (Sandbox Code Playgroud)

对于描述,您通常最好添加全文索引并进行全文搜索(仅限MyISAM):

SELECT id, description
FROM table
WHERE MATCH (description) AGAINST('keyword1 keyword2')
Run Code Online (Sandbox Code Playgroud)

  • 你只需要括起你的OR:WHERE a = b AND c = d AND(e like f or g like like i) (3认同)
  • 我不认为它只是MYISAM了. (3认同)
  • MySQL 5.6.4及更高版本支持InnoDB全文搜索.http://dev.mysql.com/doc/refman/5.6/en/fulltext-restrictions.html (2认同)

Jon*_*ght 7

SELECT 
    *
FROM 
    yourtable
WHERE 
    id LIKE '%keyword%' 
    OR position LIKE '%keyword%'
    OR category LIKE '%keyword%'
    OR location LIKE '%keyword%'
    OR description LIKE '%keyword%'
    OR refno LIKE '%keyword%';
Run Code Online (Sandbox Code Playgroud)


pax*_*blo 6

理想情况下,有一个包含字段的关键字表:

Keyword
Id
Count (possibly)
Run Code Online (Sandbox Code Playgroud)

关键字索引.在另一个表上创建一个插入/更新/删除触发器,以便在更改行时,提取每个关键字并将其放入(或替换)此表中.

您还需要一个单词表,不计入关键字(if,and,so,but,...).

通过这种方式,您可以获得想要查找关键字的查询的最佳速度,并且可以(相对容易地)实现更复杂的查询,例如"包含Java和RCA1802".

"LIKE" 查询将起作用,但它们也不会扩展.


Cal*_*vin 5

就个人而言,我不会LIKE在ID字段或任何其他数字字段上使用字符串比较.它没有意义的搜索编号" 216 "返回16 216,216 51 3 216 087 53 216 68 ...,等等等等; 同样有薪水.

此外,如果要使用预准备语句来阻止SQL注入,则可以使用以下查询字符串:

SELECT * FROM job WHERE `position` LIKE CONCAT('%', ? ,'%') OR ...
Run Code Online (Sandbox Code Playgroud)


小智 5

我将解释我通常喜欢的方法:

首先,您需要考虑到,对于这种方法,您将牺牲内存以提高计算速度。其次,您需要拥有编辑表结构的权限。

1)添加一个字段(我通常称之为“摘要”),您可以在其中存储表中的所有数据。

该字段将如下所示:

"n-n1-n2-n3-n4-n5-n6-n7-n8-n9" 等等.. 其中 n 是一个单词

我使用正则表达式 thar 将“”替换为“-”来实现这一点。该字段是所有表数据在一个字符串中“消化”的结果。

2) 在摘要字段上使用 LIKE 语句 %keyword%:

SELECT * FROM table WHERE digest LIKE %keyword%
Run Code Online (Sandbox Code Playgroud)

你甚至可以用一个小循环构建一个查询,这样你就可以同时搜索多个关键字,如下所示:

SELECT * FROM table WHERE 
 digest LIKE %keyword1% AND 
 digest LIKE %keyword2% AND 
 digest LIKE %keyword3% ... 
Run Code Online (Sandbox Code Playgroud)


rap*_*hie 5

你可以在这里的一个帖子中找到另一个更简单的选项:Match Against ...11.9.2中的更详细帮助.布尔全文搜索

这是为了防止有人需要更紧凑的选项.这将需要在表中创建一个索引FULLTEXT,这可以很容易地完成.

有关如何创建索引(MySQL)的信息:MySQL FULLTEXT索引和搜索

FULLTEXT索引中,您可以列出多个列,结果将是一个SQL语句,其索引名为search:

SELECT *,MATCH (`column`) AGAINST('+keyword1* +keyword2* +keyword3*') as relevance  FROM `documents`USE INDEX(search) WHERE MATCH (`column`) AGAINST('+keyword1* +keyword2* +keyword3*' IN BOOLEAN MODE) ORDER BY relevance;
Run Code Online (Sandbox Code Playgroud)

我试过多列,没有运气.即使索引中允许多个列,您仍然需要为每个列使用一个索引来与Match/Against语句一起使用.

根据您的标准,您可以使用任一选项.