为多个单词关键字创建索引mysql

时间:2018-06-03 13:42:50

标签: mysql

我有mysql数据库,我有一个包含多个列的表,其中一个包含我需要搜索的关键字。

关键字位于引号内的列中,如此

    ID                    keywords
    ------------------------------------------------------------
    row 1:         "one" "one two"  "one two three" "three four five" "two three one"
    row 2:         "four" "forty four"  "fifty four" "thirty four two" "three four five"

正如您所看到的,每个"关键字"可以是引号中的单个单词或一组单词,其中引号中的单词充当一个关键字。

我想找出哪些行包含所需的关键字组。

要匹配关键字,整个报价必须完美匹配。

例如,如果我想找到哪些行包含"两个"它应该返回ZERO比赛。如果我搜索"三四五"它应该返回第1行和第2行。

可能有数千行这样的行。

关键字列的类型为TEXT

  1. 我想制作一个索引来加速关键字列的搜索,我看到有不同类型的索引,如UNIQUE,INDEX,SPATIAL,PRIMARY,FULLTEXT等。我应该选择哪个索引关键字列。什么是MYSQL语句呢?

  2. 如何使用索引制作MYSQL语句以搜索关键字组

  3. 现在我有这个声明要做搜索,我不确定它是否是最好的方法。

      SET @find='three four five';
      SELECT * from table WHERE MATCH (keywords) AGAINST(find IN NATURAL LANGUAGE MODE);
    

2 个答案:

答案 0 :(得分:1)

这是糟糕的数据库结构。 但是,如果您现在无法更改数据库,并且需要获取结果:

SELECT * from table WHERE `keywords` LIKE '%"three four five"%'

如果此变量来自用户,请使用prepared statement。然后查询将如下所示:

SELECT * from table WHERE `keywords` LIKE '%"?"%'

答案 1 :(得分:0)

修复您的数据模型!不要将关键字存储在单个列中。 SQL具有用于存储列表的出色数据结构。它被称为

所以,请使用:

create table entityKeywords (
    entityKeywordId int auto_increment primary key,
    entityId int,
    keyword varchar(255),
    unique (entityId, keyword),
    index (keyword)
);

现在您可以使用此表来利用SQL并搜索关键字。

全文功能非常强大。 。 。但它们真的是为实际文本而设计的。关键字只是列上的一种属性,具有1:n关系。最好使用单独的表格对它们进行建模。