2017-08-26 74 views
0

我目前正在使用Solr(6.4.0)安装项目工作,并努力让我的头绕过查询,我相信我需要使用查询函数来满足我要求。Solr - 在不一致的字段上过滤查询函数

我的应用程序有一个Solr核心,跨越5种不同的文档类型(用户可以索引网站,文档,文章等)。我遇到的问题是文章有开始日期和结束日期,因此用户可以提前创建文章并将开始日期设置为2周后。当查询Solr我想添加一个函数,将明确地忽略所有索引类型:文章,其中活动日期大于现在,但不排除其他文档类型,如网站等

我一直在读Solr Wiki页面(https://wiki.apache.org/solr/FunctionQuery#if)它有一些很好的例子,但我想我可能会实施错误,因为我没有看到预期的结果。我现在用的是PECL PHP扩展,并加入像这样的查询:

$query->addFilterQuery("if(exists(active-date), active-date:[* TO NOW], 1)"); 

如果我执行*:*搜索约900结果返回,该指数已经大约8000条记录,其中只有2条的有活动日期是在未来和所有“文章”的总数大约是200,所以它似乎是过滤出其他“索引类型”,而不是返回1(正数=真)的其他值。

总之,我需要一个查询字段“active-date”(只在index-type:article上配置),检查日期是否在将来 - 如果为true,则排除,如果false包含在结果集中并且字段不存在包含在结果集中。

在此先感谢!

回答

0

不知道如果你真的需要一个功能查询:

fq=(index-type:article AND active-date:[* TO NOW]) OR (*:* -active-date:*) 

..只要有效日期字段将出现在所有文章对象。如果不是,则可以在没有该字段的任何文档中为OR添加额外条件。

+0

你的回答几乎给了理想的结果,但最终的OR需要调整。 inline'$ query-> addFilterQuery(“(index-type:article AND active-date:[* TO NOW])OR(*:* -active-date:*)”);'如果你想更新你的答案上面的代码我会标记为答案,所以你得到的信誉,因为我不会找到这个没有你的帮助:) – UseYourName

+0

完成。以前的例子是'*:* -index-type:article',但是由于您在任何其他资源上都没有使用'index-type:article'的活动日期字段,所以您的更改可以正常工作。 – MatsLindh