MySQL全文搜索表意(亚洲)字符

MySQL全文搜索表意(亚洲)字符,mysql,full-text-search,sql-like,Mysql,Full Text Search,Sql Like,我有一个数据库,里面有亚洲字符填充的记录(中文、日文和韩文),还有拉丁字符填充的记录(英文、法兰西,随便你说),我想对它们进行全文搜索 MySQL说: 表意语言,如汉语 而日本人没有这个词 分隔符。因此,全文如下: 解析器无法确定单词的位置 以这些和其他这样的方式开始和结束 语言。这一点的含义是什么 还有一些解决问题的方法 如第11.8节所述, “全文搜索功能” 第11.8节实际上没有提供解决办法,甚至没有提到这个问题 那么,如何在混合字符数据库中对单个汉字的搜索进行排序%LIKE%可以工作,但

我有一个数据库,里面有亚洲字符填充的记录(中文、日文和韩文),还有拉丁字符填充的记录(英文、法兰西,随便你说),我想对它们进行全文搜索

MySQL说:

表意语言,如汉语 而日本人没有这个词 分隔符。因此,全文如下: 解析器无法确定单词的位置 以这些和其他这样的方式开始和结束 语言。这一点的含义是什么 还有一些解决问题的方法 如第11.8节所述, “全文搜索功能”

第11.8节实际上没有提供解决办法,甚至没有提到这个问题


那么,如何在混合字符数据库中对单个汉字的搜索进行排序<代码>%LIKE%可以工作,但它没有很好的相关性评级。我是否应该计算一个角色出现在记录中的次数,并以此排名?我很感激你的建议。谢谢

这取决于数据集的大小。如果我们谈论的是数十万行,我可能会看看一个优秀的独立全文搜索解决方案。实际上,我从来没有处理过mysqlf这个问题,所以我不确定哪些解决方案包括对亚洲语言的支持

不过,我知道体育是中国、日本和韩国的分析工具,所以我猜它对你所做的事情有一定的支持。当我需要将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_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
(union方法是一种黑客攻击,它允许mysql为所有选择使用索引,并且很可能比使用单个select和多个or语句的相应查询更快)

剩下的问题就是相关性排名,这正是您真正想要的。:)这可以通过利用

在进行搜索之后,您必须做的第一件事是计算此令牌的分数。这是使用以下公式完成的:

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
首先计算搜索查询中每个词的分数,并将结果存储在hashmap或类似的东西中。这是你的第一个向量,叫做v_1。然后进入第一个文档。计算文档中每个术语的tf idf分数,并将其存储为v_2。现在,您可以使用以下公式计算此文档的分数:

结果是一个可用于对文档进行排序的值。继续并对每个文档执行此操作。然后按降序对它们进行排序。清单中的第一份文件将是最相关的文件

这听起来可能有点复杂,但如果你对线性代数有一些基本的了解,你可能会在几个小时内得出一个有效的解决方案。不过,如果可能的话,请使用lucene等现有解决方案。

score = arccos(v_1 * v_2 / (|v_1| * |v_2|))