我正试图根据我网站上用户定义的关键词列表提取最相关的工作。因此,作为用户,如果我指定以下关键字:
builder
bricks
concrete
我想知道如何在数据库中搜索至少有一个单词的所有作业,但按包含这三个单词的作业排序。
我的数据库表如下-
job_id INT
job_title VARCHAR
job_description TEXT
所以我想检查jobdescription字段,如果它找到了所有3个关键字,它会在顶部排序,然后是3个关键字中有2个在jobdescription中的作业,然后是1。
可怕的黑客攻击,但通过对源数组的一些客户端处理,您可以动态构建一个查询,看起来像:
SELECT
LOCATE('red', your_text_field) +
LOCATE('green', your_text_field) +
etc...
LOCATE('purple', your_text_field) AS color_count
FROM ...
ORDER BY color_count DESC
如果不存在特定的颜色,LOCATE将返回0,并且不会对总和产生影响。
我会对问题的第一部分进行全文搜索,而对唯一出现次数进行排名的第二部分则有点困难。
示例:
SELECT SQL_CALC_FOUND_ROWS
something_tbl.*,
MATCH(something_tbl.field_1, something_tbl.field_2)
AGAINST (:keywords) AS score
FROM something_tbl
WHERE MATCH(something_tbl.field_1, something_tbl.field_2)
AGAINST (:keywords IN BOOLEAN MODE)
ORDER BY score DESC
如果不提供更多关于表结构的详细信息,这只能是徒劳的回答。
但是,如果数据基于类似字符串的数据类型,请考虑使用全文索引。
基本示例。your_field
在全文索引中。
+----+-------------------------------------------------------------+
| id | your_field |
+----+-------------------------------------------------------------+
| 1 | red |
| 2 | green red |
| 3 | black red |
| 4 | yellow red green blue orange |
| 5 | black blue |
+----+-------------------------------------------------------------+
现在的SQL:
SELECT *,
MATCH (your_field)
AGAINST ('+yellow +red +green +blue +orange' IN BOOLEAN MODE) AS 'val'
FROM yourtable
WHERE MATCH (your_field)
AGAINST ('+yellow +red +green +blue +orange' IN BOOLEAN MODE)
ORDER BY val DESC;
更多信息可以在手册中找到。