MySQL全文搜索中文(亚洲)字符

4
我有一个数据库,其中包含许多亚洲字符的记录(中文、日文和韩文),以及许多拉丁字符的记录(英文、法语等),我想对它们进行全文搜索。然而,MySQL 表示:汉字和日文等表意文字没有单词分隔符,因此 FULLTEXT 分析器无法确定这些语言中单词的开头和结尾。这个问题的影响以及一些解决方法在“Full-Text Search Functions”第11.8节中有所描述。但是,实际上第11.8节并没有提供解决方法或者甚至没有提到这个问题。
那么,你如何在混合字符数据库中排序搜索单个中文字?使用 %LIKE% 可以工作,但它没有很好的相关度评分。我应该只计算字符在记录中出现的次数,并根据这个排序吗?非常感谢您的建议。谢谢!
1个回答

2
这取决于数据集的大小。如果我们谈论的是数十万行,我可能会查看其中一种出色的独立全文搜索解决方案。实际上,我从未像mysqlf那样处理过这个问题,因此我不确定哪些解决方案包括对亚洲语言的支持。
但是,我知道lucene支持中文、日语和韩语的分析器,因此我猜它对您正在做的事情有某种支持。当我需要将lucene与php集成时,我通常会将lucene实现为一个套接字服务器,并从php连接到它。
如果数据集足够小,可能可以选择自己编写临时方法。这个问题有两个部分:检索要排名的文档和实际排名。有几种检索方式。如果数据集足够小,可以使用LIKE。另一种可能是自己编写基于磁盘的索引方案,尽管这将非常复杂和耗时。您还可以使用MySQL作为中间路径,如下所述。
为了使用MySQL实现索引方案,您必须创建一些具有以下结构的表:
document
  document_id
  document_text
  document_tokencount

document_token
  document_id
  token_id
  token_docfrequency
  index (token_id, document_id)

token
  token_id
  token_unicode
  token_globalfrequency
  index (token_unicode)

然后我会处理每个文档,并为每个字符(令牌)在文档中插入一行到document_token表中。token_unicode字段将包含用于引用此字符的整数Unicode序列。token_docfrequency字段包含一个整数,对应于文档包含该令牌的次数,而token_globalfrequency字段包含所有文档中使用该术语的总次数。
这将使您能够快速搜索令牌:
SELECT * FROM document_token WHERE token_id = 1
UNION
SELECT * FROM document_token WHERE token_id = 2
UNION
SELECT * FROM document_token WHERE token_id = 3

“联合查询是一种方法,它允许 MySQL 对所有选择使用索引,并且很可能比使用单个选择和几个 or 语句的相应查询更快。”
“这使我们面临着剩下的问题,即相关性排名,这正是您真正要求的。 :) 通过利用向量空间模型(VSM),可以实现相当好的结果。”
“在进行搜索后,您需要做的第一件事是计算此令牌的tf-idf分数。这是使用以下公式完成的:”
tf-idf = tf(t,d) / tf(d) * log(D / d(t))

where:
tf(t,d) = token frequency in current document
tf(d) = total number of tokens in current document
D = total number of documents
d(t) = number of document that contains the token

首先针对搜索查询中的每个术语计算此分数,并将结果存储在哈希映射或类似数据结构中。这是您的第一个向量,称为v_1。然后继续处理第一个文档。同样地,计算文档中每个术语的tf-idf分数,并将其存储为v_2。现在,您可以使用余弦相似度计算此文档的得分:cosine similiarity
score = arccos(v_1 * v_2 / (|v_1| * |v_2|))

结果是一个可以用来对文档进行排名的值。继续对每个文档执行此操作,然后按降序对它们进行排序。列表中的第一篇文档将是最相关的。
这听起来可能有些复杂,但如果您有一些线性代数的基本理解,您可能可以在几个小时内制作出一个可行的解决方案。不过,如果可能的话,最好使用现有的解决方案,例如Lucene。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接