Date 查询字符串字段中的日期类型属性始终出现错误
我在索引中有一个类型,它的属性是日期类型。我需要在查询字符串中按此日期搜索 这是该类型的映射Date 查询字符串字段中的日期类型属性始终出现错误,date,elasticsearch,Date,elasticsearch,我在索引中有一个类型,它的属性是日期类型。我需要在查询字符串中按此日期搜索 这是该类型的映射 ....... ....... "created": { "type": "date", "format": "yyyy-MM-dd'"'T'"'HH:mm:ss.SSSZ" }, ....... ....... 问题是 "query_string": {
.......
.......
"created": {
"type": "date",
"format": "yyyy-MM-dd'"'T'"'HH:mm:ss.SSSZ"
},
.......
.......
问题是
"query_string": {
"fields": [...... "created", .....],
"query": query
}
现在假设查询没有日期,用户搜索其他任何内容。但它仍然试图用日期类型解析每个字符串并给出错误。
我尝试过像ISO date或normal date这样给出查询,但每次给出的错误都无法解析
我搜索了“查找abcd”。在那里它应该返回一些东西。因为有其他属性中包含abcd的记录。但它给出了这个错误
Caused by: org.elasticsearch.ElasticsearchParseException: failed to parse date field [find], tried both date format [yyyy-MM-dd'T'HH:mm:ss.SSSZ], and timestamp number
Caused by: org.apache.lucene.queryparser.classic.ParseException: Cannot parse '2015-06-08T06:22:09.540Z': Encountered " ":" ": "" at line 1, column 16.
Was expecting one of:
<EOF>
<AND> ...
<OR> ...
<NOT> ...
"+" ...
"-" ...
<BAREOPER> ...
"(" ...
"*" ...
"^" ...
<QUOTED> ...
<TERM> ...
<FUZZY_SLOP> ...
<PREFIXTERM> ...
<WILDTERM> ...
<REGEXPTERM> ...
"[" ...
"{" ...
<NUMBER> ...
at org.apache.lucene.queryparser.classic.QueryParserBase.parse(QueryParserBase.java:132)
at org.apache.lucene.queryparser.classic.MapperQueryParser.parse(MapperQueryParser.java:887)
at org.elasticsearch.index.query.QueryStringQueryParser.parse(QueryStringQueryParser.java:233)
... 15 more
我给出了ISO日期2015-06-08T06:22:09.540Z,并得到了此错误
Caused by: org.elasticsearch.ElasticsearchParseException: failed to parse date field [find], tried both date format [yyyy-MM-dd'T'HH:mm:ss.SSSZ], and timestamp number
Caused by: org.apache.lucene.queryparser.classic.ParseException: Cannot parse '2015-06-08T06:22:09.540Z': Encountered " ":" ": "" at line 1, column 16.
Was expecting one of:
<EOF>
<AND> ...
<OR> ...
<NOT> ...
"+" ...
"-" ...
<BAREOPER> ...
"(" ...
"*" ...
"^" ...
<QUOTED> ...
<TERM> ...
<FUZZY_SLOP> ...
<PREFIXTERM> ...
<WILDTERM> ...
<REGEXPTERM> ...
"[" ...
"{" ...
<NUMBER> ...
at org.apache.lucene.queryparser.classic.QueryParserBase.parse(QueryParserBase.java:132)
at org.apache.lucene.queryparser.classic.MapperQueryParser.parse(MapperQueryParser.java:887)
at org.elasticsearch.index.query.QueryStringQueryParser.parse(QueryStringQueryParser.java:233)
... 15 more
原因:org.apache.lucene.queryparser.classic.ParseException:无法分析“2015-06-08T06:22:09.540Z”:在第1行第16列遇到“”:“”:。
我期待的是:
...
...
...
"+" ...
"-" ...
...
"(" ...
"*" ...
"^" ...
...
...
...
...
...
...
"[" ...
"{" ...
...
位于org.apache.lucene.queryparser.classic.QueryParserBase.parse(QueryParserBase.java:132)
位于org.apache.lucene.queryparser.classic.MapperQueryParser.parse(MapperQueryParser.java:887)
位于org.elasticsearch.index.query.QueryStringQueryParser.parse(QueryStringQueryParser.java:233)
…还有15个
但是当我没有在query_string字段中包含Date type字段时,一切都会正常工作。
我现在应该做什么来解决这个问题?
我在stackoverflow和Elasticsearch最终指南中未发现任何相关问题。请帮助我。在“query\u string”
中设置“lenient”:true以忽略这些转换异常:
"query_string": {
"fields": [...... "created", .....],
"query": query,
"lenient": true
}
引自:
宽大
如果设置为true,将导致忽略基于格式的失败(如向数字字段提供文本)
与精确日期搜索相关,query\u string
将:
视为一个特殊字符,需要进行转义。有关此内容,请参阅:
如果需要使用在查询本身中用作运算符(而不是运算符)的任何字符,则应使用前导反斜杠对其进行转义。例如,要搜索(1+1)=2,则需要将查询编写为(1+1)\=2
保留字符为:+-=&&&&&&&&&&&({}[]^“~*?:\/
在“查询字符串”
中设置“lenient”:true
,以忽略这些转换异常:
"query_string": {
"fields": [...... "created", .....],
"query": query,
"lenient": true
}
引自:
宽大
如果设置为true,将导致忽略基于格式的失败(如向数字字段提供文本)
与精确日期搜索相关,query\u string
将:
视为一个特殊字符,需要进行转义。有关此内容,请参阅:
如果需要使用在查询本身中用作运算符(而不是运算符)的任何字符,则应使用前导反斜杠对其进行转义。例如,要搜索(1+1)=2,则需要将查询编写为(1+1)\=2
保留字符为:+-=&&&&&&&&&&&({}[]^“~*?:\/
当用户不按日期搜索时,它将解决问题。但按日期搜索不会给出任何结果。这不可能吗?这是另一个问题。可能您正在搜索不匹配的内容或您认为应该匹配的内容。不,我给出的日期有一些记录要返回。但不给出任何内容。我已按ISO date norm进行搜索在这种情况下,解析失败再次显示了这是什么格式:“'yyyy-MM-dd''T''HH:MM:ss.SSSZ”
?我尝试在意义上添加它,但它失败了。为什么不在映射中使用ES提供的其中一个格式呢?例如,date\u-time
。您抱怨的是“'T'
(我认为您的引号太多了)。该格式与您运行此脚本时得到的格式相同。var date=new date();echo d.toISOString()。很抱歉,这是我的错误,查询是按日期搜索的。当我这样搜索“从6月6日到6月8日”它可以工作。我认为不可能在es中按特定日期搜索?是吗?如果用户不按日期搜索,它会解决问题。但按日期搜索不会给出任何结果。不可能吗?这是另一个问题。可能你正在搜索不匹配的内容,或者你认为应该匹配。不,我给出的是有一些匹配的日期记录返回。但不提供任何内容。我通过提供ISO date normal date搜索了所有内容。在这种情况下,解析失败再次显示这是什么格式的“格式”:“yyy-MM-dd''T''HH:MM:ss.SSSZ”
?我试着在某种意义上添加它,但失败了。为什么不在映射中使用ES提供的一个呢?例如date\u time
。您抱怨的是“'t'”
(我认为您在那里有太多引号)。该格式与运行此脚本时得到的格式相同。var date=new date();echo d.toISOString()。很抱歉,这是我的错误,查询是按日期搜索的..当我这样搜索“从6月6日到6月8日”它可以工作。我认为不可能在es中按特定日期搜索?是吗?如果用户不按日期搜索,它会解决问题。但按日期搜索不会给出任何结果。不可能吗?这是另一个问题。可能你正在搜索不匹配的内容,或者你认为应该匹配。不,我给出的是有一些匹配的日期记录返回。但不提供任何内容。我通过提供ISO date normal date搜索了所有内容。在这种情况下,解析失败再次显示这是什么格式的“格式”:“yyy-MM-dd''T''HH:MM:ss.SSSZ”
?我试着在某种意义上添加它,但失败了。为什么不在映射中使用ES提供的一个呢?例如date_