Полнотекстовый поиск в поле даты с Elasticsearch - PullRequest
0 голосов
/ 28 сентября 2018

У меня есть expiration_date поле даты в моем Elasticsearch и запрос от пользователя, чтобы иметь возможность "полнотекстового" поиска в этом поле, и у меня есть только один вход для этого.

Так что мое первоначальное отображение:

PUT my_index
{
  "mappings": {
    "_doc": {
      "properties": {
        "expiration_date": {
          "type": "date"
        }
      }
    }
  }
}

и в качестве значения, которое я имею, например: 2021-08-27T10:48:00.293Z.

Пользователь хотел бы иметь возможность поиска по 2021, 2021-08, 2021-08-27,27-08-2021 и 08-2021.Для всех этих поисковых терминов у меня есть только одно поле ввода, которое используется для поиска и в других полях (такие как title, description и т. Д.).

Моя идея для достижения этой цели состояла в том, чтобы ввести некоторыеmulti-fields до базового поля.Так что-то вроде:

PUT my_index
{
  "mappings": {
    "_doc": {
      "properties": {
        "expiration_date": {
          "type": "date",
          "fields": {
            "yyyy-mm-dd" : {
              //what to do here?
            },
            "yyyy-mm" : {
              //what to do here?
            },
            "yyyy" : {
              //what to do here?
            },
            "mm-yyyy" : {
              //what to do here?
            },
            "dd-mm-yyyy" : {
              //what to do here?
            }
          }
        }
      }
    }
  }
}

Но мне интересно, выполнимо ли это таким образом?Возможно ли нечто подобное только на стороне Elasticsearch?Или мне лучше подготовить что-то похожее на моей стороне приложения, отправить его в ES и просто использовать его там?

1 Ответ

0 голосов
/ 29 сентября 2018

Вероятно, лучшим решением было бы использование пользовательских форматов для поля date в Elasticsearch:

PUT my_index
{
  "mappings": {
    "_doc": {
      "properties": {
        "expiration_date": {
          "type": "date",
          "format": "year||year_month||year_month_day||dd-MM-yyyy||MM-yyyy||strict_date_optional_time||epoch_millis"
        }
      }
    }
  }
}

Тогда вы можете запросить диапазон поля:

{
  "query": {
    "bool": {
      "must": [{
        "range": {
          "expiration_date": {
            "gte": "27-01-2001"
          }
        }
      }]
    }
  }
}

ГдеВы можете использовать любой формат, указанный в отображении.

Это решение будет наиболее масштабируемым: вы можете просто добавить больше форматов (доступно здесь или вы можете создать один) и переиндексировать данные для поддержкилюбые новые форматы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...