在SOLR或Elasticsearch中排除记录的好方法

时间:2017-04-28 06:21:59

标签: elasticsearch solr cassandra sphinx

对于婚介门户网站,我们有一个要求,如果客户查看了新娘或新郎的完整个人资料详情,那么我们必须从其他搜索结果中排除该个人资料。目前,除了其他细节之外,我们还将查看的个人资料ID存储在一个字段(逗号分隔)中,以反映新娘或新郎的详细信息。

例如,如果A观察了B,那么在字段saw_me下的B记录中我们将添加A(以逗号分隔)。

在搜索时,假设当前搜索的成员ID为123456,那么我们将触发像

这样的查询

从profiledetails中选择*其中(OTHER CON)和123456不在saw_me;

这里的问题是saw_me字段值正在增长,有没有更好的方法来处理这个要求?请指导。

2 个答案:

答案 0 :(得分:1)

如果这是使用Solr:

  1. 首先,DON' T添加' AND NOT ...'子句与q param中的主查询一起,将它们添加到fq。这有很多好处(fq将被缓存)
  2. 在你找到可能是1000s的值列表之前,这种方法很简单,应该可以正常工作
  3. 在您到达列表很大的点之后,可能是时候以高成本转移到post filter(因此最后查找)。这将查找要在外部源中删除的文档(redis,db ...)。

答案 1 :(得分:0)

在我看来,无论saw_me字段增长多少,它都不会对搜索时间产生太大影响。因为标记是反向索引的,而doc_values是以列主要方式在索引时创建的,用于高效读取并支持缓存来自OS。
ES有效地为您处理这些事情。