在 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
select doc_id from simple_index where term = 'খুঁজে';
select doc_id from simple_index where term = 'খুজে';
| doc_id | | -----: | | 1 | | 2 | | doc_id | | -----: | | 1 | | 2 |
select doc_id from simple_index where term = 'খুঁজে'COLLATE utf8mb4_bin;
select doc_id from simple_index where term = 'খুজে' COLLATE utf8mb4_bin;
| doc_id | | -----: | | 1 | | doc_id | | -----: | | 2 |

db小提琴here

【讨论】:

以上是关于在 MYSQL 中未正确识别不同的术语的主要内容,如果未能解决你的问题,请参考以下文章

人工智能专业术语:物体识别卷积神经网络YOLO分别都是什么?

PHP MySQL:搜索查询仅适用于现有的完整术语

无法识别术语“添加迁移”

对话系统 常用术语

自然语言处理与语音识别相关专业术语

立即引用的正确术语是啥?