Как мне сравнить даты в Solr JSON - PullRequest
0 голосов
/ 06 февраля 2019

У меня есть индексированный документ в solr:

{
        "id":"/content/dam/enron-cmi/fragments/headline-header/industry/industry commitment section header",
        "path":["/content/dam/enron-cmi/fragments/headline-header/industry/industry commitment section header"],
        "title":["Industry Commitment Section Header"],
        "previewText":["Industry commitment"],
        "publishedDate_dt":"2018-09-08T00:00:00Z",
        "lastModifiedDate_dt":"2018-09-08T00:00:00Z",
        "_version_":1624706590447763456},
      {
        "id":"/content/dam/enron-cmi/fragments/industry-overview/financial-services-overview---long",
        "path":["/content/dam/enron-cmi/fragments/industry-overview/financial-services-overview---long"],
        "title":["Financial Services Overview - Long"],
        "previewText":["Adaptation to the disruptive innovations that are driving necessary transformation and reform has me ..."],
        "publishedDate_dt":"2018-09-08T00:00:00Z",
        "lastModifiedDate_dt":"2018-09-08T00:00:00Z",
        "_version_":1624706590447763456}
        }

, и мой код SolrInputDocument выглядит следующим образом (индексировать, только если это действительная дата после преобразования в конкретную дату):

if (tempObject.has("expirationDate") && tempObject.get("expirationDate") != null
                    && CommonUtils.isDateValid(tempObject.get("expirationDate").getAsString())) {
                nestedDoc.addField("expirationDate_dt",
                        CommonUtils.toUtcDate(tempObject.get("expirationDate").getAsString()));
            }

            if (tempObject.has("publishedDate") && tempObject.get("publishedDate") != null
                    && CommonUtils.isDateValid(tempObject.get("publishedDate").getAsString())) {
                nestedDoc.addField("publishedDate_dt",
                        CommonUtils.toUtcDate(tempObject.get("publishedDate").getAsString()));
            }

            if (tempObject.has("lastModifiedDate") && tempObject.get("lastModifiedDate") != null
                    && CommonUtils.isDateValid(tempObject.get("lastModifiedDate").getAsString())) {
                nestedDoc.addField("lastModifiedDate_dt",
                        CommonUtils.toUtcDate(tempObject.get("lastModifiedDate").getAsString()));
            }

Преобразование даты используется следующим образом:

public static String toUtcDate(String dateStr) {
        SimpleDateFormat out = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
        String outDateFormat = StringUtils.EMPTY;
        String dateFormat = "MM-dd-yyyy";

        try {
            outDateFormat = out.format(new SimpleDateFormat(dateFormat).parse(dateStr));
        } catch (Exception ignore) {
            LOG.info(ignore.getMessage(), null, ignore);
        }

        return outDateFormat;
    }

После того, как я проиндексировал свой контент, я хочу запросить сравнение дат, например: Показать только для опубликованногоDate_dt> lastModifiedDate_dt, как я могу это сделать?Документы для solr не очень понятны.Версия Solr 7.6.

Могу ли я использовать Solr Java API, чтобы сделать то же самое?

Я попытался следующий запрос:

http://localhost:8983/solr/collection/select?fl=publishedDate_dt,lastModifiedDate_dt&defType=func&q=ms(publishedDate_dt,%20lastModifiedDate_dt)

и выходные данные:

"документы": [{"publDate_dt": "2018-09-20T00: 00: 00Z"}, {"ОпубликовалDate_dt": "2018-09-01T00: 00: 00Z"}, {"publDate_dt": "2018-09-01T00: 00: 00Z"}, {"publDate_dt": "2018-09-01T00: 00: 00Z"},

опробовано:

http://localhost:8983/solr/collection/select?&q=:&fl=expirationDate_dt,publishedDate_dt,ms(expirationDate_dt,publishedDate_dt)&defType=func вывод:

{
"responseHeader": {
"zkConnected": true,
"status": 400,
"QTime": 2,
"params": {
"q": "*:*",
"defType": "func",
"fl": "expirationDate_dt,publishedDate_dt,ms(expirationDate_dt,publishedDate_dt)"
}
},
"error": {
"metadata": [
"error-class",
"org.apache.solr.common.SolrException",
"root-error-class",
"org.apache.solr.search.SyntaxError"
],
"msg": "org.apache.solr.search.SyntaxError: Expected identifier at pos 0 str='*:*'",
"code": 400
}
}

что я делаю не так?

1 Ответ

0 голосов
/ 06 февраля 2019

В этом случае вы можете использовать функциональные запросы.

Вот ссылка на него Функциональные запросы & Доступные функции

Вы можетеиспользуйте функцию ms: она возвращает миллисекунды разницы между своими аргументами

Примеры синтаксиса

ms(NOW/DAY)
ms(2000-01-01T00:00:00Z)
ms(mydatefield)
ms(NOW,mydatefield)
ms(mydatefield, 2000-01-01T00:00:00Z)
ms(datefield1, datefield2)
...