我是 flex 搜索的新手,我正努力处理日期范围查询。我必须查询介于某些特定日期之间的记录。推送到 flex 搜索数据库中的JSON记录如下:
"messageid": "Some message id",
"subject": "subject",
"emaildate": "2020-01-01 21:09:24",
"starttime": "2020-01-02 12:30:00",
"endtime": "2020-01-02 13:00:00",
"meetinglocation": "some location",
"duration": "00:30:00",
"employeename": "Name",
"emailid": "abc@xyz.com",
"employeecode": "141479",
"username": "username",
"organizer": "Some name",
"organizer_email": "cde@xyz.com",
我必须查询开始时间在“2020-01-02 12:30:00”到“2020-01-10 12:30:00”之间的记录。我写了这样的查询:
{
"query":
{
"bool":
{
"filter": [
{
"range" : {
"starttime": {
"gte": "2020-01-02 12:30:00",
"lte": "2020-01-10 12:30:00"
}
}
}
]
}
}
}
该查询没有给出预期的结果。我假设将数据推送到我办公室的 flex 搜索数据库中的人员尚未设置映射,并且 flex 搜索正在动态地将“开始时间”的数据类型确定为“文本”。因此,我得到的结果不一致。
我可以这样设置映射:
PUT /meetings
{
"mappings": {
"dynamic": false,
"properties": {
.
.
.
.
"starttime": {
"type": "date",
"format":"yyyy-MM-dd HH:mm:ss"
}
.
.
.
}
}
}
该查询将起作用,但不允许这样做(办公政策)。我有什么选择可以完成任务。
更新:
我假设数据类型为“文本”,但是默认情况下,Elastic Search会同时应用“文本”和“关键字”,这样我们就可以实现基于全文和关键字的搜索。如果还设置为“关键字”。无论如何,这对我有好处吗?我无法在办公室中访问很多东西,这就是为什么我无法调试查询的原因。我只有用于构建查询的搜索API。
GET / meetings / _mapping输出:
'
'
'
"starttime" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
}
'
'
'
最佳答案
正如@jzzfs所建议的那样,该想法是在date
字段中添加starttime
子字段。您首先需要修改映射,如下所示:
PUT meetings/_mapping
{
"properties": {
"starttime" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
},
"date": {
"type" : "date",
"format" : "yyyy-MM-dd HH:mm:ss",
}
}
}
}
}
完成后,您需要使用update by query API重新索引数据,以便填充
starttime.date
字段并建立索引:POST meetings/_update_by_query
更新完成后,您将可以利用查询中的
starttime.date
子字段:{
"query": {
"bool": {
"filter": [
{
"range": {
"starttime.date": {
"gte": "2020-01-02 12:30:00",
"lte": "2020-01-10 12:30:00"
}
}
}
]
}
}
}
关于elasticsearch - Elasticsearch 日期范围查询,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/60261527/