【发布时间】:2015-01-21 14:52:01
【问题描述】:
我的 solr 索引数据中有两个字段:“userName”和“startTimeISO”以及许多其他字段。 现在我想查询今天看到但在过去 30 天内未看到的所有“用户名”。 基本上,我试图找出今天新观察到的用户名。
现在我正在运行的 Solr Facet 查询是:
facet.pivot: "userName,startTimeISO",
fq: " NOT startTimeISO:["2014-12-20T00:00:00.000Z" TO "2015-01-18T00:00:00.000Z"] AND startTimeISO:["2015-01-19T00:00:00.000Z" TO "2015-01-20T00:00:00.000Z"]"
但由于某种原因,我得到了不正确的结果。 例如,我在上面的查询中看到了 userName: "bla"。 如果我明天运行相同的查询,我会再次在我的 Facet 结果中看到“bla”。
我有些无法获得正确的逻辑。也许我没有使用我不知道的 solr 提供的所有工具?
有人可以在这里帮助我吗?我不介意测试您的所有建议并反复提出不同的建议。
与此同时,我正在网上寻找是否有其他方法可以解决问题。
更新: 解决方案:
如果您的数据如下所示:
"id": "1",
"userName": "one",
"startTimeISO": "2015-01-20T17:24:32.888Z"
"id": "2",
"userName": "one",
"startTimeISO": "2015-01-16T17:24:50.208Z"
"id": "3",
"userName": "two",
"startTimeISO": "2015-01-20T17:25:06.109Z"
您可以使用以下查询组合:
q=*:*
fq=startTimeISO:[NOW-1DAY TO NOW] //this will give you all the users that
were seen today
fq=-_query_:"{!join from=userName to=userName}startTimeISO:[NOW-30DAYS TO
NOW-1DAYS]" //dont include those documents that have others with the same
name and were viewed during the last 30 days.
感谢 Alvaro Cabrerizo 帮助我。 这是 Solr 邮件列表上相同问题的链接: http://lucene.472066.n3.nabble.com/Newly-observed-Facets-td4180538.html
【问题讨论】:
-
不错的解决方案!值得指出的是,这适用于单分片集合,但不适用于多个。
-
什么意思?我们有一个包含 5 个分片的 solr 集群。当我运行查询时它对我有用。
-
它似乎可以工作,但“加入”查询仅在本地分片/索引上运行;它不是分布式的。因此,您可能会看到返回的用户名没有被过滤掉,因为认为它在 30 天内唯一的分片不知道另一个分片在 30 天窗口中有用户。如果您按用户分片,则应该没问题,因为这会将用户的数据保留在分片的本地。仅供参考 -query:"..." 语法很旧;从 v4.1(或者可能是 4.2?)开始,您可以删除它并输入“NOT”。此外,您可能希望将 'fq' 合二为一,但不是必需的。
标签: solr faceted-search