如何解决elasticsearch 中的范围没有真正起作用
我运行这个查询:
curl -X GET "localhost:9200/mydocs/_search?pretty" -H 'Content-Type: application/json' -d'
{
"query": {
"bool" : { "must" : [{"wildcard": {"guid": "14744*"}},{"range": {"availability.start": {"lt": "Now"}}}] }
}
}
'
然后我得到这个回复:
"hits" : [
{
"_index" : "mydocs","_type" : "_doc","_id" : "14744","_score" : 2.0,"_source" : {
"guid" : "14744","availability" : {
"start" : "2021-03-28T22:00:00.000Z","end" : "2021-12-31T22:59:00.000Z"
},"title" : "Some title"
}
}
]
我真正想要的是今天在可用性开始和结束范围内的结果。 上面的结果表示文档在
之间可用2021-03-28T22:00:00.000Z
and
2021-12-31T22:59:00.000Z
今天是 2021-04-15:15:00.000Z
所以,我应该做的是添加:
{"range": {"availability.end": {"gt": "Now"}}}
对不对?但是当我跑步时:
curl -X GET "localhost:9200/mydocs/_search?pretty" -H 'Content-Type: application/json' -d'
{
"query": {
"bool" : { "must" : [{"wildcard": {"guid": "14744*"}},{"range": {"availability.start": {"lt": "Now"}}},{"range": {"availability.end": {"gt": "Now"}}}] }
}
}
'
我得到了一个空的点击列表。
部分映射:
{
mappings: {
_doc: {
properties: {
availability: {
properties: {
end: {
type: "keyword"
},start: {
type: "keyword"
}
}
},properties: {
guid: {
type: "keyword"
}
}
}
}
}
解决方法
您的查询完全正确!干得好!
问题在于 availability.*
字段被定义为 keyword
。
它们必须是 date
类型,以便对日期值的 range
查询提供准确的结果,否则范围查询将只执行 now
的词法(即字符串)比较与表示为字符串的日期值对比:
availability: {
properties: {
end: {
type: "date" <--- change this
},start: {
type: "date" <--- and this
}
}
},
您无法更改现有字段的映射,但您始终可以创建新字段。因此,您可以更改映射为 date
和 start
创建新的 end
子字段,如下所示:
PUT mydocs/_mapping
{
"properties": {
"availability": {
"properties": {
"end": {
"type": "keyword","fields": {
"date": {
"type": "date"
}
}
},"start": {
"type": "keyword","fields": {
"date": {
"type": "date"
}
}
}
}
}
}
}
然后你只需要运行以下命令来更新你的索引:
POST mydocs/_update_by_query
然后修改您的查询以使用新的子字段,这将起作用:
POST mydocs/_search
{
"query": {
"bool": {
"must": [
{
"wildcard": {
"guid": "14744*"
}
},{
"range": {
"availability.start.date": {
"lt": "now"
}
}
},{
"range": {
"availability.end.date": {
"gt": "now"
}
}
}
]
}
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。