嘿~ 今天天气不错嘛

elasticsearch在做范围查询的时候,如果查询的类型是text,则只有gt生效,lt不生效

Elasticsearch | 作者 ljfphp | 发布于2019年04月30日 | 阅读数:10977

问题就是如上所述,我自己本地测试,如果range的字段是date类型的,那么很顺利就查询出来了。但是运维人员把其中一个字段设置type="text",我在做范围查询的时候,死活不好用。
代码如下:
       "query"=>[
"range" =>[
"@timestamp" => [
"gt" => '23/Apr/2019:20:28:22 -0700',
"lte" => '23/Apr/2019:21:35:13 -0700',
]
]
],
 

在对timestamp只做gt的时候,是可以查询到数据的,但是加上lt之后,就查询不到数据了,感觉十分奇怪。希望各位大神慷慨解答下,不胜拜谢
已邀请:

strglee

赞同来自: ljfphp

range 支持text类型排序 用的是TermRangeQuery 使用BytesRef.compareTo(BytesRef)进行比较
https://lucene.apache.org/core ... .html 
 
number/date 类型 用的是 NumericRangeQuery,也就是按照数值排序
 
https://www.elastic.co/guide/e ... .html 


The type of the Lucene query depends on the field type, for string fields, the TermRangeQuery, while for number/date fields, the query is a NumericRangeQuery. 

ljfphp - 叫我铁柱吧

赞同来自:

大致代码如下:
   "query"=>[
"range" =>[
"timestamp" => [
"gt" => '23/Apr/2019:20:28:22 -0700',
"lte" => '23/Apr/2019:21:35:13 -0700',
]
]
],

 

ljfphp - 叫我铁柱吧

赞同来自:

Elasticsearch支持以下范围数据类型:
数据类型 说明
integer_range 有符号32位整数范围 2-32 ~ 232-1
float_range 单精度32位IEEE 754 浮点数范围
long_range 有符号64位整数范围 2-64 ~ 264-1
double_range 双精度64位IEEE 754 浮点数范围
date_range 自系统历元以来无符号64位整数范围内的毫秒数范围
ip_range 支持 IPv4 或者 IPv6 (or mixed) 地址的IP范围
--------
以上是es的文档翻译出来的,怀疑是range不支持text类型做范围查询,但是不敢肯定。。
 

hapjin

赞同来自:

TermRangeQuery 应该用的是"对齐填" String.compareTo()
NermicRangeQuery用的是block kd tree
对于数字范围查询,从Lucene2.9之前的字符串对齐填充,到lucene6.0 之前的 numeric trie tree,然后再到现在的block kd tree
底层数据结构是不一样的,因此范围查询时应该要注意:mapping中定义的 field 的类型(type)是什么.

angryfun

赞同来自:

时间存储为字符串比较是可以的,比较的时候需要加上.keyword
                {
"range":{
"mytime.keyword":{
"gte": "07:06:14","lte": "07:06:14"
}
}
},
{
"range":{
"mydate.keyword":{
"gte": "2018-11-01","lte": "2019-12-02"
}
}
}

要回复问题请先登录注册