我有一个字段是dateofbirth,其映射如下所示 “出生日期” : { “ type”:“ date”, “字段”:{ “令牌”:{ “ type”:“ text” } }, “ ignore_malformed”:是的, “格式”:“ yyyy-MM-dd” }, 我有一个用例,需要在yyyydd和yyyy&yyyyMM的基础上进行搜索,在这种情况下,是否有人知道如何应用分析器,以便可以创建令牌进行搜索。
答案 0 :(得分:0)
以上有多种解决方法。
{
"mappings": {
"properties": {
"dateofbirth": {
"type": "date",
"fields": {
"tokens": {
"type": "text"
}
},
"ignore_malformed": true,
"format": "yyyy-MM-dd"
},
"year":{
"type": "integer"
},
"month":{
"type": "integer"
},
"day":{
"type": "integer"
}
}
}
}
您可以根据需要的格式使用多个术语子句进行查询
{
"query": {
"bool": {
"must": [
{
"term": {
"year": {
"value": "VALUE"
}
}
},
{
"term": {
"month": {
"value": "VALUE"
}
}
}
]
}
}
}
{
"query": {
"bool": {
"must": [
{
"range": {
"dateofbirth": {
"gte": "2019-01-05",
"lte": "2019-12-31"
}
}
}
]
}
}
}
对于年份范围将为2019-01-01和2019-12-31。对于yyyyMM范围将为2019-10-01和2019-10-31
{
"query": {
"bool": {
"must": [
{
"script": {
"script": {
"source": "int year = doc['dateofbirth'].value.getYear();int month = doc['dateofbirth'].value.getMonthValue();int day = doc['dateofbirth'].value.getDayOfMonth(); if(year==params.year && month==params.month) return true;",
"params": {
"year":2019,
"month":10
}
}
}
}
]
}
}
}
选项1的性能最高,其次是2和3。