在 Solr/Elasticsearch/Sphinx 中考虑搜索位置的方法?
Way to factor in search locality in Solr/Elasticsearch/Sphinx?
我的问题是要搜索数千个用户的数据,例如邮箱。几乎所有时间搜索都是按用户 ID 过滤的。如何考虑搜索的局部性?我正在尝试实现与每个用户都有专用索引的情况相当的性能。
分片不是一个选项,因为它将被使用(用户总数 ~ 1M),我正在寻找一个解决方案以在 ~4k 用户的分片中使用。
好吧,它可以在 Sphinx 中使用属性来完成。大多数时候也可以通过将用户 ID 添加为假关键字来提高搜索效率*。然后可以在全文阶段过滤文档。 (仍然保留该属性,以避免通过对其他用户的 return 结果构建仔细查询来操纵结果的可能性)
- 例如,将 _user1234 添加为全文字段,然后添加到查询中
WHERE MATCH('example _user1234') AND user = 1234
然后仅查找来自该用户的文档。
一种可能的解决方案是将同一用户的文档分组在倒排索引块中。鉴于倒排索引块是按文档 id 排序的,这种分组只能通过适当地为文档分配 id 来完成。同一用户的文档应该具有单调的 ID。可能会轻微违反此规则 - 它不会显着影响性能。
实现。
index sorting having just become a first-class citizen in Lucene 6.21
可以在 elasticsearch 2.3 中实现(参见 here)。我认为在 Solr 中也可以用同样的方式实现。
至于 sphinx,我认为分配单调文档 ID 的相同技术应该有效。
有关更多技术推理,请参阅前面的 link。
我的问题是要搜索数千个用户的数据,例如邮箱。几乎所有时间搜索都是按用户 ID 过滤的。如何考虑搜索的局部性?我正在尝试实现与每个用户都有专用索引的情况相当的性能。
分片不是一个选项,因为它将被使用(用户总数 ~ 1M),我正在寻找一个解决方案以在 ~4k 用户的分片中使用。
好吧,它可以在 Sphinx 中使用属性来完成。大多数时候也可以通过将用户 ID 添加为假关键字来提高搜索效率*。然后可以在全文阶段过滤文档。 (仍然保留该属性,以避免通过对其他用户的 return 结果构建仔细查询来操纵结果的可能性)
- 例如,将 _user1234 添加为全文字段,然后添加到查询中
WHERE MATCH('example _user1234') AND user = 1234
然后仅查找来自该用户的文档。
一种可能的解决方案是将同一用户的文档分组在倒排索引块中。鉴于倒排索引块是按文档 id 排序的,这种分组只能通过适当地为文档分配 id 来完成。同一用户的文档应该具有单调的 ID。可能会轻微违反此规则 - 它不会显着影响性能。
实现。
index sorting having just become a first-class citizen in Lucene 6.21
可以在 elasticsearch 2.3 中实现(参见 here)。我认为在 Solr 中也可以用同样的方式实现。
至于 sphinx,我认为分配单调文档 ID 的相同技术应该有效。
有关更多技术推理,请参阅前面的 link。