微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

elasticsearch 中的范围没有真正起作用

如何解决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
                }
            }
        },

您无法更改现有字段的映射,但您始终可以创建新字段。因此,您可以更改映射为 datestart 创建新的 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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?