Rails:使用什么rails模糊方法/gem/插件在100万条记录的数据库表中进行搜索?

问题描述 投票:0回答:2

我拥有约 100 万条记录的 MySQL 表。 我很快需要在我的 Rails 3.x 应用程序中添加搜索。我希望搜索是模糊的。

实际上,我对另一个表使用了插件(rails-fuzzy-search),但它只有 3000 条记录。 该插件在另一个表中创建三元组(3000 条记录表有 25000 个三元组)。

嗯,我不能对我的 100 万条记录表使用此方法,否则我的三元组表可能会有 1 亿条记录!

我看到了一些宝石:

我不知道什么是获得更好性能的最佳解决方案。

搜索将为我的表格的两个字段设置。

ruby-on-rails rubygems sphinx fuzzy-search
2个回答
2
投票

一些搜索发现模糊地宝石:

轶事基准:对照我们整个 Geonames 派生的表 我的开发机器上的位置(320 万条记录,大约 1GB 数据) (2011 款 MacBook Pro)

搜索前 10 条匹配记录需要 6ms ±1 准备 所有记录的索引大约需要 10 分钟 数据库查询开销 更改记录的时间为 3ms ±2 内存开销(占用空间) 八卦表索引)约300MB

另外,请查看 Solr 和 Sunspot


0
投票

根据您的数据库,您也许能够启用特定于数据库的功能来实现一些“模糊匹配”(无论这到底意味着什么)。

MySQL有“自然语言模式”,在这里解释

这相当容易实现。首先在迁移中添加索引,如下所示:

add_index :products, [:name, :description], type: :fulltext, name: :fulltext_index_products_on_name_and_description

然后您可以在查询中使用 MATCH 子句,如下所示:

scope :search, ->(query) {
  where("MATCH (products.name, products.description) AGAINST (? IN NATURAL LANGUAGE MODE)", query)
  # MySQL should sort by relevance, so make sure not to override this with your own order clause.
}

请注意,在小数据集上进行测试可能会得到意想不到的结果,最好使用完整数据进行尝试。您可能还会发现“布尔模式”值得研究。

© www.soinside.com 2019 - 2024. All rights reserved.