Вычисленный поиск MarkLogic-сегменты для определения возраста

#marklogic #facet #bucket

#marklogic #фасет #сегмент

Вопрос:

Мне нужно настроить вычисляемые сегменты для ограничения возрастного диапазона человека, используя индекс для даты рождения. Указанные возрастные диапазоны представлены в виде 19-30, 31-40, 41-50 и т.д. Поскольку возможные значения привязки довольно ограничены, у меня возникают проблемы с настройкой этого. Например, если сегодня 2019-01-01, для возрастного диапазона 19-30 лет мне нужно указать даты рождения с 1988-01-02 (самому старшему 30 лет) по 2000-01-01 (самому молодому 19 лет). Как я могу настроить это вычисляемое ведро?

Для атрибута «lt», если я использую lt=»-P19Y», я получаю меньше, чем 2000-01-01, поэтому 1999-12-31 — это моя последняя включенная дата рождения, тем самым исключая тех, кому сегодня исполнилось 19.

И для атрибута «ge», если я использую ge=»-P31Y», я включаю дату рождения 1988-01-01, которая на один день выходит за пределы моего предполагаемого диапазона, т. Е. этому человеку только сегодня исполнился 31 год.

Если бы я мог использовать «завтра» и «вчера» в качестве якорей, эти значения работали бы. Или, если бы я мог указать значение, подобное для ge, которое означает «минус 31 год плюс 1 день», это тоже сработало бы. Но я не уверен, как заставить это работать, учитывая ограничения. Кто-нибудь настраивал ограничение возраста пользователя с помощью сегментов, используя индекс даты рождения?

TIA

Комментарии:

1. Я немного размышлял об этом, и я знаю, что в качестве опции привязки есть начало дня, но, насколько я знаю, нет конца дня. Я думаю, вам пришлось бы использовать пользовательское ограничение, которое вычисляет диапазоны сегментов «на лету». Не должно быть слишком сложным, но немного громоздким..

2. Спасибо @grtjn, похоже, чтобы быть полностью точным, необходимо пользовательское ограничение. Я бы подумал, что возрастные сегменты были бы обычным явлением… удивлен, что он не поддерживается лучше.

Ответ №1:

Я полагаю, что опция привязки «начало дня» для вычисляемых сегментов — это то, что вы ищете.

   <constraint name="age">
    <range type="xs:date">
      <element name="birthdate"/>
      <computed-bucket name="18" ge="-P18Y" 
       anchor="start-of-day">18 and under</computed-bucket>
      <computed-bucket name="19-30" ge="P30Y" lt="-P18Y" 
       anchor="start-of-day">19 to 30</computed-bucket>
      <computed-bucket name="31-40" ge="-P40Y" lt="-P30Y" 
       anchor="start-of-day">31 to 40</computed-bucket>
      <computed-bucket name="41-50" ge="-P50Y" lt="-P40Y" 
       anchor="start-of-day">41 to 40</computed-bucket>
      <computed-bucket name="51" lt="-P50Y" 
       anchor="start-of-day">51 and older</computed-bucket>
    </range>
  </constraint>
  

Документацию можно найти здесь:
http://docs.marklogic.com/guide/search-dev/search-api#id_22725

Редактировать: изначально атрибуты ge и lt были задом наперед для желаемых сегментов.

Комментарии:

1. Параметр edge отключен. привязка к концу дня дала бы правильные результаты, но это не поддерживается..