我想在MariaDB全文搜索中包含#符号作为有效的单词字符,这样我就可以用它来表示标签并使它们可搜索。
这是我在标题列中的示例数据,它有一个全文索引。我在示例中包括了“和$,以防我在Map中丢失了一个字符。
A sample photo with three keywords #sunset "sunset $sunset.
我使用SELECT default_character_set_name FROM information_schema.SCHEMATA WHERE schema_name = “o810”
检查了我的表的字符集,它是'latin 1'。
我转到charsets/latin1.xml并更新了Map,以指示#是大写字母(假设这使其成为有效的单词字符)。
<ctype>
<map>
00
20 20 20 20 20 20 20 20 20 28 28 28 28 28 20 20
20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
48 10 10 01 10 10 10 10 10 10 10 10 10 10 10 10
84 84 84 84 84 84 84 84 84 84 10 10 10 10 10 10
10 81 81 81 81 81 81 01 01 01 01 01 01 01 01 01
01 01 01 01 01 01 01 01 01 01 01 10 10 10 10 10
10 82 82 82 82 82 82 02 02 02 02 02 02 02 02 02
02 02 02 02 02 02 02 02 02 02 02 10 10 10 10 20
10 00 10 02 10 10 10 10 10 10 01 10 01 00 01 00
00 10 10 10 10 10 10 10 10 10 02 10 02 00 02 01
48 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10
10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10
01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01
01 01 01 01 01 01 01 10 01 01 01 01 01 01 01 02
02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02
02 02 02 02 02 02 02 10 02 02 02 02 02 02 02 02
</map>
</ctype>
我删除了索引,重新启动了mariadb并重新创建了全文索引。
如果然后使用SET GLOBAL innodb_ft_aux_table = 'o810/photo'
来转储全文索引。SELECT * FROM INNODB_FT_INDEX_TABLE
显示“sunset”,但不包括“#sunset”,因此#不包含在单词中。
我一定是漏掉了什么明显的东西,但我找不到。任何帮助都将不胜感激。
- 我尝试了不同的打开和保存charsets/Index.xml和charsets/latin1.xml的方法。
- 我试着改变我的Map变化,以防万一我不能计数的权利。
- 我已经多次停止并重新启动数据库服务器。
- 我已经多次删除并重新创建了全文索引。
- 我已经到处找过了。
1条答案
按热度按时间vfh0ocws1#
更改字符集定义是一个非常糟糕的主意,因为这可能会影响其他操作,如排序等。
首选方法是修改服务器源代码中的storage/innobase/include/fts 0 tokenize. h文件,然后重新编译服务器。
为此,您只需更改true_word_char()宏:
#define true_word_char(c, ch) ((c) & (_MY_U | _MY_L | _MY_NMR) || (ch) == '_' || (ch) == '#')