MariaDB 全文索引标记化规则/DOC_ID 映射

问题描述 投票:0回答:1

第一个问题:有没有文档描述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

前两行对应于我的示例数据的第一行,依此类推。

mariadb full-text-search
1个回答
0
投票

亲自回答我的问题第一部分:这已由 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%'; 
© www.soinside.com 2019 - 2024. All rights reserved.