所以这是我在一个项目工作了大约九个月后一直想知道的事情。
我们有一个postgres数据库,并在rails应用程序的solr上使用太阳黑子。
当我们决定使用solr时,我不在这里,所以我真的不知道为什么我们首先选择它。一切都适用于小型数据集,但在保存后重新编制每条记录的真正痛苦。
这使得索引过时,我们最终会在延迟的工作中处理这些问题。这让我们暂时不知所措,但每次我们决定重新制作索引及其构建方式时,生产需要24小时以上,并导致我们的客户生气。
我应该在这里注意,我们正在搜索最多255个字符的联系人字段。大多数只有25个字符。没有pdf文件或word文件等。
最终目标是快速搜索并进行一些自动完成搜索。我还希望我们模糊匹配搜索。我希望Bill Smith与BillSmith和其他一些事情相匹配。
为了做到这一点,我现在自定义构建联系模型的索引的一部分。这有效,但每次我的老板添加比尔史密斯必须匹配比尔史密斯的要求时,我需要重建索引。
这里使用的比solr更好吗?我想知道是否有这个目的。我想最终搜索谷歌具有的一些相同的功能和速度。 (不是那么极端)但是如果我需要一个索引,我需要快速重建索引。
这适用于在30个表中包含大约15M db记录的rails应用程序。
这里的任何指导都很棒,因为我们要考虑放弃solr。
编辑:另一个问题是你需要一个快速搜索索引吗? Cant postgres使用自己的索引来获得同样快的东西吗?
答案 0 :(得分:3)
Postgres会用全文搜索来处理这个问题......
http://www.postgresql.org/docs/current/static/textsearch.html
请注意,如果您不喜欢内置规则,它允许使用各种字典:
http://www.postgresql.org/docs/current/static/textsearch-dictionaries.html
它还有彩色工具,如trigrams:
答案 1 :(得分:1)
我还希望我们模糊匹配搜索。我希望Bill Smith与BillSmith和其他一些事情相匹配
虽然PostgreSQL的全文搜索可以帮助您解决这类问题,但您可能会发现需要提供一组自定义词干/自定义词典,甚至可以根据您的需求详细信息编写自定义tsearch解析器
对于特定于应用程序的文本处理规则,基本的tsearch并不是那么容易定制的。
每次我的老板添加比尔史密斯必须匹配Bill-Smith的要求时,我需要重建索引
你也可以使用PostgreSQL全文搜索 - 并且添加这些要求可能会更棘手。
从根本上说,我认为这是任何索引系统的问题。理论上,在这种情况下可以部分更新索引 - 例如删除Bill
,Smith
或BillSmith
的所有条目,然后根据新规则将其添加回来。不过,我不确定任何现成的系统都能做到这一点。
如果你想要像谷歌这样的表演,你可能需要在任务中投入巨大的计算资源。令人惊讶的是,当它在1000多个节点上并行化时,搜索可以达到多快,这些节点将感兴趣的数据缓存在RAM中。