我有一个字符串数据库(任意长度),它拥有超过一百万个项目(可能更多).
我需要将用户提供的字符串与整个数据库进行比较,并检索相同的字符串(如果存在)或以其他方式返回最接近的模糊匹配(60%相似性或更好).理想情况下,搜索时间应小于一秒.
我的想法是使用编辑距离将每个数据库字符串与搜索字符串进行比较,然后根据数据库的长度缩小数据库中的候选项.
但是,因为我需要经常执行此操作,所以我正在考虑构建db字符串的索引以保留在内存中并查询索引,而不是直接查询db.
有关如何以不同方式解决此问题或如何构建内存中索引的任何想法?
我正在尝试创建一个可以建议Mad Gab风格短语的算法.
输入是一组短语.我也有一组关键字,我想尽可能使用.目前,我的解决方案只是蛮力:
但是,我遇到的问题是:
我最熟悉PHP和MySQL.但是,如果能提供更好的解决方案,我对另一项技术持开放态度.
我也对任何其他建议感兴趣.特别是使用第二个参数metaphone()提出更难建议的方法.
我有一个公司数据库.我的应用程序接收按名称引用公司的数据,但名称可能与数据库中的值不完全匹配.我需要将传入的数据与它所引用的公司进行匹配.
例如,我的数据库可能包含名称为"AB Widgets&Co Ltd."的公司.我的传入数据可能会引用"AB Widgets Limited","AB Widgets and Co"或"AB Widgets".
公司名称中的一些单词(AB Widgets)对于匹配比其他单词(Co,Ltd,Inc等)更重要.避免错误匹配很重要.
公司的数量足够小,我可以在记忆中维护他们的名字地图,即.我可以选择使用Java而不是SQL来查找正确的名称.
你会如何用Java做到这一点?
假设我有一个包含许多名称的数据库表.我想对这些名字进行"灵活匹配".我不确定"弹性匹配"是否适合使用,但现在让我们继续使用.已经有类似 讨论的"模糊匹配",但我不是拼音匹配很感兴趣.我对我称之为有序子集匹配感兴趣.
我希望它的工作类似于QuickSilver(OSX)或Launchy(Windows).以下是给定搜索字符串匹配的几个示例:
麻省理工学院 ⇒ 中号 assachusetts 我 nstitute的牛逼李有成
ffox ⇒ ˚F愤怒狐狸
OSX ⇒的Mac OS X
MS ⇒ 中号 ICRO 小号经常总公司
我的最终目标是拥有一个带有自动完成文本字段的网页,该字段是从服务器驱动的数据.
我相信通过结合jQuery LiveUpdate和/或jQuery QuickSelect的功能,我将在客户端获得足够的结果.
我需要帮助的地方在于如何最好地处理服务器端与大型表的Flex匹配.我有一些关于如何使用Quicksilver 评分 算法构建我自己的自定义索引的想法,也许还有一些排列索引逻辑,但如果其他东西可以随时使用,我宁愿不重新发明轮子.
总结: 对于具有多行的数据库表,获得快速弹性匹配的最佳方法是什么?
我有一个带有“名称”列 (VARCHAR(255)) 的 MySQL InnoDB 表,我希望用户能够搜索它,返回所有匹配的行。但是,我不能只使用 LIKE 查询,因为搜索需要允许用户输入与可用名称相似的名称(例如,以“The”为前缀,或者不知道正确的名称包含撇号)。
两个例子是:
DB 中的名称:'Rose and Crown'
应该匹配的可能搜索示例:“Rose & Crown”、“Rose and Crown”、“rose and Crown”、“The Rose and Crown”
DB 中的名称:'Diver's Inn'
应该匹配的可能搜索示例:'Divers' Inn'、'The Diver's Inn'、'Divers Inn'
我还希望能够通过“最接近的匹配”相关性对结果进行排名,尽管我不确定如何做到这一点(也许是编辑距离?)。
该表不太可能超过几千行,因此不扩展到数百万行的方法是好的。一旦输入,给定行的名称值将不会改变,因此如果需要昂贵的索引操作,那不是问题。
是否有可以执行此任务的现有工具?我看过 Zend_Search_Lucence 但它似乎专注于文档,而我只对搜索单个列感兴趣。
编辑:在 SOUNDEX 搜索中,这不会产生我想要的结果。例如:
SELECT soundex( 'the rose & crown' ) AS soundex1, soundex( 'rose and crown' ) AS soundex2;
soundex1 soundex2
T6265 R253265
Run Code Online (Sandbox Code Playgroud)
解决方案:最后我使用了 Zend_Search_Lucence ,只是假装每个名字实际上都是一个文档,这似乎达到了我想要的结果。我猜它在某种程度上是全文搜索,即使每个字符串最多只有 3-4 个单词。