我在Elasticsearch中有expiration_date
个日期字段,并要求用户请求能够在此字段中进行“全文”搜索,为此我只有一个输入。
所以我的初始映射是:
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并在那儿使用?
答案 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可用,也可以构造一种格式)并重新索引数据以支持任何新格式。