我的solr索引数据中有两个字段:“userName”和“startTimeISO”以及许多其他字段。 现在我想查询今天看到但在过去30天内没有看到的所有“userNames”。 基本上,我试图找出今天新观察到的UserNames。
现在我运行的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
答案 0 :(得分:0)
没有一个查询可以执行您想要的操作。您最好的选择是首先查询今天看到的用户名(比过去30中的所有用户名都小),将该列表返回给您的客户端。一个典型的' fq'查询最后一天将选择那些文件,然后facet.field =用户名与facet.limit = 1000000不幸的是高和facet.mincount = 1。现在您的客户端上有此列表,请再次向Solr提交一个大型查询,以便在用户名字段中进行分面,并在接下来的29天内使用过滤查询(不包括今天),并添加一个额外的过滤查询来匹配只是您在第一个查询中找到的用户名。理想情况下,用户名过滤器会使用'术语' Solr 4.10中的QParser,但它不是必需的。当第二个查询返回时,这将显示今天看到的哪些用户名在随后的29天内也会出现。有了这些信息,您可以减去名称集,并拥有今天看到的用户名。