如何在mySql中的完整索引搜索中传递select语句值


How to pass select statement values inside the full index search in mySql?

我想在AGAINST参数列表中传递select body from articles结果集,而不是database作为关键字。我该怎么做?。我想根据表中匹配的关键字查找相关文章。

SELECT * FROM articles
     WHERE MATCH (title,body)
     AGAINST ('database' IN NATURAL LANGUAGE MODE);

我想这样做:

SELECT * FROM articles
     WHERE MATCH (title,body)
     AGAINST ("select title,body from articles" IN NATURAL LANGUAGE MODE);

从评论编辑:
我想根据文章频道中匹配关键字的密度来获得相关文章。我已经创建了FULLTEXT索引,我的表是ISAM格式的。目前,文章频道包含字幕和正文自定义字段。由于一切都必须是动态的,所以我不能在AGAINST('Lorem Manager')中传递关键字,因为我们不知道当我们访问下一篇新闻文章时关键字是什么,所以我嵌入了select语句来提取标题和正文。我得到了结果,但不知何故,我的停止关键字没有被识别。

您到底希望实现什么?

为了更好地理解,或许可以举例说明;您的要求是什么,让我们用ExpressionEngine的说法来讨论,毕竟这就是您标记问题的内容。

使用敏捷记录表达引擎网站主题,让我们使用关于频道中的两个字段—机构和工作人员职务:

车身
自定义字段:{about_body}
MySQL列:field_id_4

工作人员职务
自定义字段:{about_staff_title}
MySQL列:field_id_6

首先,如果您还没有,您需要创建一个包含所有搜索列的FULLTEXT索引

使用上面的两列,从phpMyAdmin或您喜欢的MySQL GUI客户端执行以下SQL语句:

CREATE FULLTEXT INDEX related_articles
    ON exp_channel_data (field_id_4, field_id_6);

您可以使用以下查询验证新创建的INDEX:

SHOW INDEX FROM exp_channel_data;

要对文本集合(一个或多个数据库列)执行字符串(关键字)的自然语言搜索,请考虑以下。。。其中LoremManager是您的关键词:

SELECT * FROM exp_channel_data
    WHERE MATCH (field_id_4, field_id_6)
    AGAINST ('Lorem Manager' IN NATURAL LANGUAGE MODE);

它将返回如下结果集(为了可读性而简化):

+----------+-------------+------------------------+
| entry_id | field_id_4  | field_id_6             |
+----------+-------------+------------------------+
|        3 | Lorem ipsum |                        |
|        8 |             | Product Manager        |
|        4 |             | Co-Owner/Label Manager |
+----------+-------------+------------------------+

使用自然语言全文搜索时,要求MATCH()函数中命名的列与表中某个FULLTEXT索引中包含的列相同。

例如,在前面的示例中,请注意MATCH()函数中命名的列(field_id_4field_id_6)与项目表的FULLTEXT索引定义中命名的那些列相同。

如果要分别搜索,则需要为每列创建单独的FULLTEXT索引。


一些单词在全文搜索中被忽略:

  • 任何太短的单词都会被忽略。全文搜索可找到的默认最小单词长度为四个字符
  • 停止语列表中的单词将被忽略。停止语是一个单词,如"the"或"some",它非常常见,以至于被认为没有语义价值。有一个内置的停止语列表,但它可以被用户定义的列表覆盖

默认的停止词列表可以在11.9.4中查看。MySQL文档的全文停止语。