2017-09-29 39 views
0

我有一个索引产品是Solr。我需要为每个客户提供定制的产品清单,这样我必须为每个客户排除一些特定的产品。 目前,我将这种排除产品的客户关系存储在SQL数据库中,然后使用术语查询在Solr中对其进行筛选。有没有一种方法可以将这种关系存储在Solr中,这样我就不必每次都从SQL计算排除列表。如何在运行时从Solr过滤大量IDS

的东西非常相似,我们可以在elasticsearch使用https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-terms-query.html

可能的方式做,我能想到Solr中做的:

  1. 保持在产品指数本身,和过滤的客户名单在那。但是如果我必须重新索引所有文档,这将会非常痛苦。这个列表也可能很大。

  2. 我能想到的另一种方式是维护一个独立的核心,用于保存每个客户的文档并排除product_id,并使用{!join}执行加入以过滤掉客户的产品。这是一个可扩展的解决方案吗?

应该是什么Solr中存储这类数据的理想方法。

回答

1

SQL DB是否存在任何性能问题?查询数据库并获取ID并将它们发送到Solr是完全正确的。您将避免复杂性和数据重复。无论如何你必须做一些计算来将这些ID发送到Solr。

但是要回答您的问题,是的,您可以将每个客户排除的产品ID确实存储在单独的索引中。您将使用多值字段并update using atomic updates。如果这样做,请确保简化索引模式,不要使用用于ID的分析器(仅使用string类型,而不使用任何标记器或过滤器)。

您不需要执行Solr连接查询。您只需查找每个客户的产品ID(第一个查询)并将其作为CSV处理,然后使用从索引(第二个查询)检索到的产品ID执行terms query

+0

感谢这里的响应。我想我只会继续使用SQL方法。将过滤使用术语查询的ID。 –

1

你需要找到最好的折衷办法为你

最佳查询时间性能 您现场(多值的)添加到产品指标:因基数allowed_users(或forbidden_​​users)(您想最小化)。 这将需要首次重新建立索引,并为每个用户权限更改索引更新。 为了减少网络流量和优化更新,您可以看看原子更新[1]。

最好的指数时间表演 如果前面的方法是不是在你的情况下是可行的或者不能满足你,你可以尝试优化索引侧。 你可以索引文档中的一个单独的集合:

<Id> 
<product_id> 
<user_id> 

您可以使用查询时间加入到过滤收集当前用户,然后回来的产品来过滤他们在您的查询。

因此,基本上,你已经想到了这两个想法:)

[1] https://lucene.apache.org/solr/guide/6_6/updating-parts-of-documents.html