在 MYSQL 中未正确识别不同的术语
Posted
技术标签:
【中文标题】在 MYSQL 中未正确识别不同的术语【英文标题】:Distinct terms not being identified correctly in MYSQL 【发布时间】:2021-08-15 09:55:48 【问题描述】:我创建了一个数据库,其中存储了从孟加拉语文本文档创建的简单倒排索引。
表名:simple_index,主键Term, Document_id
表定义:
CREATE TABLE IF NOT EXISTS basicindex.simple_index (
term varchar(255) NOT NULL,
doc_id INT NOT NULL,
frequency INT NOT NULL,
PRIMARY KEY (term,doc_id)
)
奇怪的是,我发现对于以下两个不同的词:
-
খুঁজে - 出现在文档 3、16、34 中
খুজে - 出现在文档 1 中
当我执行以下查询时:
查询 1:
select doc_id from basicindex.simple_index where term='খুঁজে';
查询 2:
select doc_id from basicindex.simple_index where term = 'খুজে';
都返回 4 行,声称 খুঁজে 和 খুজে 出现在所有四个文档中。
从日志中我发现 [Distinct Term, document id, frequency] খুঁজে 仅针对文档 id 1 插入:
为খুজে插入索引 -> DocID: 1, Frequency: 1
('খুজে', 1, 1)
并且 খুঁজে 被插入到文档 ID 3、16 和 34 中
为 খুঁজে 插入索引 -> DocID: 3, Frequency: 1
('খুঁজে', 3, 1)
为খুঁজে插入索引 -> DocID: 16, Frequency: 2
('খুঁজে', 16, 2)
为 খুঁজে 插入索引 -> DocID: 34, Frequency: 1
('খুঁজে', 34, 1)
以下是术语的 unicode 值:
খুঁজে [('খ', 2454), ('ু',2497), ('ঁ',2433), ('জ',2460), ('ে',2503)]
খুজে [('খ',2454), ('ু',2497), ('জ',2460), ('ে',2503)]
我正在使用 MYSQL 版本 8.0.13。我请求有人帮助我理解为什么 mysql 数据库会出现这种行为。为什么它无法区分“খুঁজে”和“খুজে”?我能做些什么来纠正这个问题?
我已附上文档 1、3、16 和 34 以及输入和输出日志文件,供您参考here。
【问题讨论】:
@Akina 您好,谢谢您的回复。表排序规则详细信息是:basicindex.simple_index 'utf8mb4_0900_ai_ci'。在执行上述两个查询之前,我尝试了SET NAMES 'utf8';。你能建议我解决这个问题吗?非常感谢你帮助我。 'utf8mb4_0900_ai_ci' 是“不区分重音”和“不区分大小写”的。为您的案例选择正确的排序规则并按照答案所示指定它。 SET NAMES 只设置匹配一堆排序规则的字符集。 非常感谢。由于在 utf8mb4_0900_ai_ci 中包含重音不敏感 (ai),似乎会出现此问题。我将其更改为对口音敏感,并且有效。select doc_id from simple_index where term = 'খুঁজে'COLLATE utf8mb4_0900_as_ci;
【参考方案1】:
都返回 4 行,声称 খুঁজে 和 খুজে 存在于所有四个文档中。
检查使用的 COLLATION。明确指定所需的 COLLATE。
举个例子:
CREATE TABLE IF NOT EXISTS simple_index ( term varchar(255) NOT NULL, doc_id INT NOT NULL, frequency INT NOT NULL, PRIMARY KEY (term,doc_id) );
INSERT INTO simple_index VALUES ('খুঁজে', 1, 0 ), ('খুজে', 2, 0 ); SELECT * FROM simple_index;
term doc_id frequency খুঁজে 1 0 খুজে 2 0
| doc_id | | -----: | | 1 | | 2 | | doc_id | | -----: | | 1 | | 2 |select doc_id from simple_index where term = 'খুঁজে'; select doc_id from simple_index where term = 'খুজে';
| doc_id | | -----: | | 1 | | doc_id | | -----: | | 2 |select doc_id from simple_index where term = 'খুঁজে'COLLATE utf8mb4_bin; select doc_id from simple_index where term = 'খুজে' COLLATE utf8mb4_bin;
db小提琴here
【讨论】:
以上是关于在 MYSQL 中未正确识别不同的术语的主要内容,如果未能解决你的问题,请参考以下文章