2017-08-26 38 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