使用Elasticsearch在日期字段中进行全文搜索

时间:2018-09-28 15:02:21

标签: date elasticsearch full-text-search

我在Elasticsearch中有expiration_date个日期字段,并要求用户请求能够在此字段中进行“全文”搜索,为此我只有一个输入。

所以我的初始映射是:

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

作为一个值,例如:2021-08-27T10:48:00.293Z

用户希望能够通过20212021-082021-08-2727-08-202108-2021进行搜索。对于所有这些搜索项,我只有一个输入字段,该字段也可用于搜索其他字段(如titledescription等字段)。

我实现这一目标的想法是向基础字段中引入一些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 :(得分:1)

最好的解决方案可能是使用Elasticsearch中date字段的自定义格式:

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"
          }
        }
      }]
    }
  }
}

可以在其中使用映射中指定的任何格式。

该解决方案将是最具扩展性的:您可以添加更多格式(here可用,也可以构造一种格式)并重新索引数据以支持任何新格式。