第一个问题:有没有文档描述MariaDB构建全文索引词(针对InnoDB)的规则?
我设置
innodb_ft_min_token_size=1
在索引中也包含一个字母单词。但这对于像“D'Artagnan”这样的单词似乎不起作用:在information_schema.INNODB_FT_INDEX_TABLE
中找不到“d”字母。它适用于“D Artagnan”。
所以我假设在构建索引时忽略后跟引号的单个字母? 您也可以发布源代码文件的链接,但我不知道我的 C 知识是否足够;-)
第二个问题:文档(https://mariadb.com/kb/en/information-schema-innodb_ft_index_table-table/)指出
information_schema.INNODB_FT_INDEX_TABLE.doc_id
与原始表的id列匹配:“DOC_ID:文档新添加的行的 ID,可以是适当的 ID 列,也可以是内部 InnoDB 值。”但这对我来说并没有发生 - doc_id 值与我的 ID 列不匹配。我尝试了数据类型“int”和“bigint”。
这是一个演示我的问题的脚本:
create table FulltextTest
(
textid int not null,
text varchar(254) not null
) ENGINE=INNODB CHARACTER SET utf8;
alter table FulltextTest add primary key FulltextTest_PK (textid);
insert into FulltextTest (textid, text) values (100, 'D''Artagnan, Lucas');
insert into FulltextTest (textid, text) values (200, 'De''Artagnan, Lucas');
insert into FulltextTest (textid, text) values (201, 'D Artagnan, Lucas');
insert into FulltextTest (textid, text) values (202, 'L''Artagnan, Lucas');
insert into FulltextTest (textid, text) values (203, 'M''Artagnan, Lucas');
alter table FulltextTest add FULLTEXT index FulltextTest_IXFULL1(text);
SET GLOBAL innodb_ft_aux_table='<insert_database_name>/fulltexttest';
select * from information_schema.INNODB_FT_INDEX_TABLE order by doc_id, position;
SET GLOBAL innodb_ft_aux_table=null;
drop table FulltextTest;
选择
information_schema.INNODB_FT_INDEX_TABLE
会返回:
文字 | FIRST_DOC_ID | LAST_DOC_ID | DOC_COUNT | DOC_ID | 位置 |
---|---|---|---|---|---|
阿达尼昂 | 2 | 6 | 5 | 2 | 2 |
卢卡斯 | 2 | 6 | 5 | 2 | 12 |
德 | 3 | 3 | 1 | 3 | 0 |
阿达尼昂 | 2 | 6 | 5 | 3 | 3 |
卢卡斯 | 2 | 6 | 5 | 3 | 13 |
d | 4 | 4 | 1 | 4 | 0 |
阿达尼昂 | 2 | 6 | 5 | 4 | 2 |
卢卡斯 | 2 | 6 | 5 | 4 | 12 |
阿达尼昂 | 2 | 6 | 5 | 5 | 2 |
卢卡斯 | 2 | 6 | 5 | 5 | 12 |
阿达尼昂 | 2 | 6 | 5 | 6 | 2 |
卢卡斯 | 2 | 6 | 5 | 6 | 12 |
前两行对应于我的示例数据的第一行,依此类推。
亲自回答我的问题第一部分:这已由 https://jira.mariadb.org/browse/MDEV-20797
更改因此,我必须在将搜索字符串拆分为单词片段时消除撇号之前的单个字母。 之前我的搜索是这样的:
select * From FulltextTest where
MATCH(Text) against ('+d*, +artagnan*' IN BOOLEAN MODE) > 0;
应该是:
select * From FulltextTest where
MATCH(Text) against ('+artagnan*' IN BOOLEAN MODE) > 0;
要找到“D'”部分,我必须将其与“like”查询结合起来(如下建议:使用特殊字符和“单词开头为”的MariaDB全文搜索):
select * From FulltextTest where
MATCH(Text) against ('+d*, +artagnan*' IN BOOLEAN MODE) > 0 and
Text like '%D''Artagnan%';