none
Можно ли в запросе KQL использовать функции даты и времени RRS feed

  • Вопрос

  • Попробовал использовать вэб-часть результатов поиска с запросом по Managed Property типа дата. Например, для отображения дней рождения как описано в статье Владимира Каплина.

    Там используется строка запроса:

    {SearchBoxQuery} BirthDay:{Today} OR  BirthDay:{Today+1} OR  BirthDay:{Today+2}

    Вопрос в том, можно ли в этом запросе как-то использовать функции даты и времени, чтобы сконструировать строку даты примерно так:

    {SearchBoxQuery} BirthDay>{"2000-"+Month(Today)+"-"+Day(Today)}


    Сазонов Илья http://isazonov.wordpress.com/

    8 апреля 2015 г. 3:21
    Модератор

Ответы

  • Илья, как и предполагал, вы не можете использовать функции.
    По коду там TODAY+, TODAY-, TODAY - просто токены, который затем заменяются на DateTime.Now,
    DateTime.Now.Add.

    // Microsoft.Office.Server.Search.Query.QueryTemplateHelper
    private static string GetParameterNameFromToken(string token)
    {
    	string result = token;
    	if (token.StartsWith("TODAY+", System.StringComparison.OrdinalIgnoreCase) || token.StartsWith("TODAY-", System.StringComparison.OrdinalIgnoreCase))
    	{
    		result = "TODAY";
    	}
    	return result;
    }
    

    и вот:

    	if (token.StartsWith("TODAY+", StringComparison.OrdinalIgnoreCase) || token.StartsWith("TODAY-", StringComparison.OrdinalIgnoreCase))
    		{
    			obj = SearchTokenExpansion.GetDateValue(token);
    		}

    А вот вычисление:

    // Microsoft.SharePoint.Publishing.SearchTokenExpansion
    private static string GetDateValue(string date)
    {
    	char[] trimChars = new char[]
    	{
    		'[',
    		']',
    		'{',
    		'}'
    	};
    	date = date.Trim(trimChars).Trim();
    	string s = date.Substring(5);
    	int num = 0;
    	if (int.TryParse(s, out num))
    	{
    		return DateTime.UtcNow.AddDays((double)num).ToString("yyyy-MM-dd", CultureInfo.InvariantCulture);
    	}
    	return DateTime.UtcNow.ToString("yyyy-MM-dd", CultureInfo.InvariantCulture);
    }



    [custom.development]

    8 апреля 2015 г. 8:31

Все ответы

  • Я не совсем уверен, что это то, что вам нужно, но всё же:
    https://www.martinhatch.com/2012/05/search-core-results-web-part-with.html

    Там наследуются от CoreResultsWebPart и добавляют свои токены.


    [custom.development]


    8 апреля 2015 г. 7:58
  • Здравствуйте!
    Да, можно.
    Вот так выглядит диапазон дат:
    MyDate=1/1/2015..08/04/2015

    Хороший пост, рекомендую ознакомиться.
    8 апреля 2015 г. 8:06
  • Здравствуйте!
    Да, можно.
    Вот так выглядит диапазон дат:
    MyDate=1/1/2015..08/04/2015

    Хороший пост, рекомендую ознакомиться.
    Я так понял, что Илья хочет динамически создавать дату, а не явно указывать диапазон.
    Т.е. смысл, чтобы диапазон начинался с сегодняшнего числа и месяца, а вот год был 2000.

    Я думаю, что на вопрос Ильи ответ - нет, нельзя. Во всяком случае без custom code.

    [custom.development]



    8 апреля 2015 г. 8:09
  • Да, вопрос в динамическом создании диапазона стандартными средствами. Например, "этот квартал прошлого года", "этот же месяц прошлого года".

    Для вычисляемых столбцов можно использовать массу функций для конструирования даты или диапазона, а вот при построении запроса в вэб-части что-то всё очень бедно.

    Тогда встаёт вопрос об обходном пути: можно ли передавать параметры в эту вэб-часть из другой вэбчасти (фильтр) через "подключения"?


    Сазонов Илья http://isazonov.wordpress.com/

    8 апреля 2015 г. 8:24
    Модератор
  • Илья, как и предполагал, вы не можете использовать функции.
    По коду там TODAY+, TODAY-, TODAY - просто токены, который затем заменяются на DateTime.Now,
    DateTime.Now.Add.

    // Microsoft.Office.Server.Search.Query.QueryTemplateHelper
    private static string GetParameterNameFromToken(string token)
    {
    	string result = token;
    	if (token.StartsWith("TODAY+", System.StringComparison.OrdinalIgnoreCase) || token.StartsWith("TODAY-", System.StringComparison.OrdinalIgnoreCase))
    	{
    		result = "TODAY";
    	}
    	return result;
    }
    

    и вот:

    	if (token.StartsWith("TODAY+", StringComparison.OrdinalIgnoreCase) || token.StartsWith("TODAY-", StringComparison.OrdinalIgnoreCase))
    		{
    			obj = SearchTokenExpansion.GetDateValue(token);
    		}

    А вот вычисление:

    // Microsoft.SharePoint.Publishing.SearchTokenExpansion
    private static string GetDateValue(string date)
    {
    	char[] trimChars = new char[]
    	{
    		'[',
    		']',
    		'{',
    		'}'
    	};
    	date = date.Trim(trimChars).Trim();
    	string s = date.Substring(5);
    	int num = 0;
    	if (int.TryParse(s, out num))
    	{
    		return DateTime.UtcNow.AddDays((double)num).ToString("yyyy-MM-dd", CultureInfo.InvariantCulture);
    	}
    	return DateTime.UtcNow.ToString("yyyy-MM-dd", CultureInfo.InvariantCulture);
    }



    [custom.development]

    8 апреля 2015 г. 8:31
  • Ох, это откуда код?

    Сазонов Илья http://isazonov.wordpress.com/

    8 апреля 2015 г. 8:54
    Модератор
  • Ох, это откуда код?

    Сазонов Илья http://isazonov.wordpress.com/

    ILSpy наше всё ) 
    Если вы про классы и методы, то они указаны в первой строке комментарием (//).


    [custom.development]

    8 апреля 2015 г. 8:56
  • Вот это как раз то что нужно!
    В посте дан пример использования:

    Usage Summary:

    Tokens you can use are:

    • [TODAY]
    • [TODAY+X] (add X days)
    • [TODAY-X] (remove X days)

    8 апреля 2015 г. 9:15
  • Заключение 1. вэб-часть результатов поиска сильно ограничена в возможностях построения динамических запросов внутри себя - использовать функции невозможно.

    Заключение 2. Максимум возможного - запрос с указанием динамического диапазона:

    {SearchBoxQuery} BirthDay:{Today}..{Today+5}


    Сазонов Илья http://isazonov.wordpress.com/

    9 апреля 2015 г. 3:30
    Модератор