-1

我正在尝试根据我网站上用户定义的关键字列表提取最相关的工作。因此,作为用户,如果我指定以下关键字:

builder
bricks
concrete

我想弄清楚如何在数据库中搜索至少具有其中一个的所有工作,但按包含所有这三个单词的工作对它们进行排序。

我的数据库表如下 -

job_id             INT
job_title          VARCHAR
job_description    TEXT

所以我想检查 job_description 字段,如果它找到所有 3 个关键字,它会在顶部排序,然后是 3 个中的 2 个在 job_description 某处的那些作业,然后是 1。

4

3 回答 3

1

可怕的 hack,但是通过对源数组的一些客户端处理,您可以动态构建一个如下所示的查询:

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 并且不会对总和做出贡献。

于 2013-08-16T19:12:37.427 回答
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
于 2013-08-16T19:02:25.270 回答
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;

更多信息可以在手册中找到。

于 2013-08-16T19:05:49.097 回答