我想在DB的某些表格或视图中搜索句子(单词组合)。我不想使用DB的Fultext搜索属性。有没有其他有效的方式?
答案 0 :(得分:2)
没有全文搜索效率高。
基本上它归结为 和衍生物一样,并且由于索引在大多数情况下被抛弃,因此它变成了一个非常昂贵的查询。
答案 1 :(得分:2)
如果不使用索引,数据库必须执行“全表扫描”。这就像你一次翻阅一本书,找到你需要的东西。
话虽这么说,计算机比人类快得多。这实际上取决于您的系统有多少负载。使用MySQL,我们成功地在潜在客户信息表上实现了一个搜索系统。问题的本质是普通索引(包括全文)无法解决的问题。因此我们设计以使用全表扫描进行供电。
这涉及使用搜索数据创建尽可能窄的表,并将它们连接到包含相关但非搜索数据的更大表。
当时(4年前),可以在.06秒内扫描100,000条记录。 1,000,000条记录大约需要0.6秒。该系统仍在大量生产中使用,有数百万条记录。
如果您的数据需要超过6位数的记录,您可能需要使用全文索引重新评估,或对倒排索引进行一些研究。
如果您想了解更多信息,请发表评论。
编辑:搜索表格尽可能缩小。理想情况下,每条记录50-100个字节。 ENUMS和TINYINT是很好的节省空间,如果你可以用它们以另一种方式“映射”到字符串值。
使用PHP类生成搜索查询。他们只是:
-- DataTable is the big table that holds all of the data
-- SearchTable is the narrow table that holds the bits of searchable data
SELECT
MainTable.ID,
MainTable.Name,
MainTable.Whatever
FROM
MainTable, SearchTable
WHERE
MainTable.ID = SearchTable.ID
AND SearchTable.State IN ('PA', 'DE')
AND SearchTable.Age < 40
AND SearchTable.Status = 3
基本上,这两个表是在主键(快速)上连接的,并且过滤是通过SearchTable上的全表扫描完成的(非常快)。我们使用的是MySQL。
我们发现通过在MyISAM表中使用记录格式==“FIXED”,我们可以将性能提高3倍。这意味着没有blob,没有varchars等...
如果有帮助,请告诉我。
答案 2 :(得分:1)
如果您正在使用JAVA,请查看Lucene
如果您使用的是.net,则可以查看Lucene.net,它将最大程度地减少对搜索查询的数据库调用。
来自http://incubator.apache.org/lucene.net/
Lucene.Net是源代码, class-per-class,API-per-API和 Java Lucene的算法端口 搜索引擎到C#和.NET 利用Microsoft .NET的平台 框架。
Lucene.Net坚持API和 原始Java中使用的类 实施Lucene。 API 名称和类名称 保留意图给予 Lucene.Net C#的外观和感觉 语言和.NET Framework。对于 例如,方法Hits.length()in Java实现现在读取 Hits.Length()在C#端口。
除了API和类 端口到C#,Java的算法 Lucene被移植到C#Lucene。这个 表示使用Java创建的索引 Lucene是来回兼容的 与C#Lucene;在阅读时, 写作和更新。实际上是一个Lucene 索引可以同时搜索和 使用Java Lucene和C#更新 Lucene处理。
答案 3 :(得分:0)
您可以将文本分解为单个单词,将它们粘贴在单独的表格中,并使用它来查找包含搜索句子中所有单词的PK ID [即但不一定按照正确的顺序],然后搜索句子的那些行。应该避免每次都要进行表扫描。
请询问您是否需要我进一步解释