【问题标题】:Solr - Filter query functions on inconsistent fieldSolr - 在不一致的字段上过滤查询函数
【发布时间】:2017-08-26 09:06:31
【问题描述】:

我目前正在处理一个安装了 Solr (6.4.0) 的项目,并且努力解决查询问题,我认为我需要使用查询功能来满足我的要求。

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

我一直在阅读 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,所以看起来过滤掉其他“索引类型”,而不是在 else 值上返回 1(正数 == true)。

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

提前致谢!

【问题讨论】:

    标签: php solr pecl


    【解决方案1】:

    不确定您是否真的需要函数查询:

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

    .. 只要所有文章对象上都存在活动日期字段。如果不是,您可以在任何没有该字段的文档中为OR 添加额外条件。

    【讨论】:

    • 您的回答几乎给出了预期的结果,但最终的 OR 需要调整。 inline $query->addFilterQuery("(index-type:article AND active-date:[* TO NOW]) OR (*:* -active-date:*)"); 如果您想更新您对上述代码的回答,我将标记为已回答,以便您获得信任,因为如果没有您的帮助,我不会找到这个 :)
    • 完成。旧示例是*:* -index-type:article,但由于除了index-type:article 之外,您在任何其他资源上都没有活动日期字段,因此您的更改工作正常。
    猜你喜欢
    • 2023-01-04
    • 1970-01-01
    • 2013-03-22
    • 1970-01-01
    • 1970-01-01
    • 2012-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多