我正在尝试根据我网站上的用户定义关键字列表提取最相关的工作。因此,作为用户,如果我指定以下关键字:
builder
bricks
concrete
我想弄清楚如何搜索数据库中至少包含其中一个的所有作业,但是按包含所有这三个单词的作业排序。
我的数据库表如下 -
job_id INT
job_title VARCHAR
job_description TEXT
所以我想查看job_description字段,如果它找到所有这3个关键字,它会在顶部订购,那么3个中有2个在job_description中的那些作业然后是1。
答案 0 :(得分: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并且不会对总和做出贡献。
答案 1 :(得分: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
答案 2 :(得分:0)
如果没有提供有关表结构外观的更多详细信息,这只是值得回答的问题。
但是,如果您的数据基于类似字符串的数据类型,请考虑使用全文索引。
基本示例。 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;
可以找到更多信息here in the manual。