- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我有一个数据库,里面全是亚洲字符填充的记录(中文、日语和韩语)以及拉丁字符填充的记录(英语、法语,随便你怎么说),我想对它们执行全文搜索。
MySQL 说:
Ideographic languages such as Chinese and Japanese do not have word delimiters. Therefore, the FULLTEXT parser cannot determine where words begin and end in these and other such languages. The implications of this and some workarounds for the problem are described in Section 11.8, “Full-Text Search Functions”.
第 11.8 节实际上没有提供解决方法,甚至没有提及问题。
那么,如何在混合字符数据库中对单个汉字的搜索进行排序? %LIKE%
会起作用,但它没有很好的相关性评级。我应该只计算一个角色在记录中出现的次数,然后以此为依据进行排名吗?我很感激你的任何建议。谢谢!
最佳答案
这取决于数据集的大小。如果我们谈论的是数十万行,我可能会看一下可用的优秀独立全文搜索解决方案之一。我实际上从来没有处理过这个问题 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 字段包含该术语在所有文档中使用的总次数。
这将允许您快速搜索 token :
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
(联合方法是一种 hack,它允许 mysql 对所有选择使用索引,并且很可能比使用单个选择和多个 or 语句的相应查询更快)
剩下的问题就是相关性排名,这正是您真正要求的。 :) 这可以通过利用 Vector Space Model (VSM) 来完成并取得相当好的结果。 .
完成搜索后,您要做的第一件事就是计算 tf-idf这个 token 的分数。这是使用以下公式完成的:
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。现在您可以使用 cosine similiarity 计算此文档的分数:
score = arccos(v_1 * v_2 / (|v_1| * |v_2|))
结果是一个可用于对文档进行排名的值。继续对每个文档执行此操作。将它们按降序排列。列表中的第一个文档将是最相关的文档。
这听起来可能有点复杂,但如果您对线性代数有一些基本了解,您可能会在几个小时内得出一个可行的解决方案。不过,如果可能的话,请使用现有的解决方案,例如 Lucene。
关于MySQL 全文搜索表意(亚洲)字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/817080/
我在我的应用程序中使用 Hibernate Search。其中一个子集合被映射为 IndexedEmbedded。子对象有两个字段,一个是 id,另一个是日期(使用日期分辨率到毫秒)。当我搜索 id=
The App Engine Search API有一个 GeoPoint 字段。可以用它来进行半径搜索吗?例如,给定一个 GeoPoint,查找位于特定半径内的所有文档。 截至目前,它看起来像 Ge
客户对我正在做的员工管理项目提出了这个新要求,以允许他们的用户进行自定义 bool 搜索。 基本上允许他们使用:AND、OR、NOT、括号和引号。 实现它的最佳方法是什么?我检查了 mysql,它们使
很想知道哪个更快 - 如果我有一个包含 25000 个键值对的数组和一个包含相同信息的 MySQL 数据库,搜索哪个会更快? 非常感谢大家! 最佳答案 回答这个问题的最好方法是执行基准测试。 关于ph
我喜欢 smartcase,也喜欢 * 和 # 搜索命令。但我更希望 * 和 # 搜索命令区分大小写,而/和 ?搜索命令遵循 smartcase 启发式。 是否有隐藏在某个地方我还没有找到的设置?我宁
我有以下 Marklogic 查询,当在查询控制台中运行时,它允许我检索具有管理员权限的系统用户: xquery version "1.0-ml"; import schema namespace b
我希望当您搜索例如“A”时,所有以“A”开头的全名都会出现。因此,如果名为“Andreas blabla”的用户将显示 我现在有这个: $query = "SELECT full_name, id,
我想在我的网站上添加对人名的搜索。好友列表已经显示在页面上。 我喜欢 Facebook 这样做的方式,您开始输入姓名,Facebook 只会显示与查询匹配的好友。 http://cl.ly/2t2V0
您好,我在我的网站上进行搜索时遇到此错误。 Fatal error: Uncaught Error: Call to undefined function mysql_connect() in /ho
声明( 叠甲 ):鄙人水平有限,本文为作者的学习总结,仅供参考。 1. 搜索介绍 搜索算法包括深度优先搜索(DFS)和广度优先搜索(BFS)这两种,从起点开始,逐渐扩大
我正在为用户列表使用 FuturBuilder。我通过 futur: fetchpost() 通过 API 获取用户。在专栏的开头,我实现了一个搜索栏。那么我该如何实现我的搜索栏正在搜索呢? Cont
我正在使用 MVC5,我想搜索结果并停留在同一页面,这是我在 Controller (LiaisonsProjetsPPController) 中执行搜索操作的方法: public ActionRes
Azure 搜索中的两种方法 Upload 与 MergeOrUpload 之间有什么区别。 他们都做完全相同的事情。即,如果文档不存在,它们都会上传文档;如果文档已经存在,则替换该文档。 由于这两种
实际上,声音匹配/搜索的当前状态是什么?我目前正在远程参与规划一个 Web 应用程序,该应用程序将包含和公开记录的短音频剪辑(最多 3-5 秒,人名)的数据库。已经提出了一个问题,是否可以实现基于用户
在商业应用程序中,具有数百个面并不罕见。当然,并非所有产品都带有所有这些标记。 但是在搜索时,我需要添加一个方面查询字符串参数,其中列出了我想要返回的所有方面。由于我事先不知道相关列表,因此我必须在查
当我使用nvcc 5.0编译.cu文件时,编译器会为我提供以下信息。 /usr/bin/ld: skipping incompatible /usr/local/cuda-5.0/lib/libcud
我正在使用基于丰富的 Lucene 查询解析器语法的 Azure 搜索。我将“~1”定义为距离符号的附加参数)。但我面临的问题是,即使存在完全匹配,实体也没有排序。 (例如,“blue~1”将返回“b
我目前有 3 个类,一个包含 GUI 的主类,我在其中调用此方法,一个包含数据的客户类,以及一个从客户类收集数据并将其放入数组列表的 customerList 类,以及还包含搜索数组列表方法。 我正在
假设我有多个 6 字符的字母数字字符串。 abc123、abc231、abc456、cba123、bac231 和 bac123 。 基本上我想要一个可以搜索和列出所有 abc 实例的选择语句。 我只
我有这个表 "Table"内容: +--------+ | Serial | +--------+ | d100m | <- expected result | D100M | <- expect
我是一名优秀的程序员,十分优秀!