我有一个带有可选日期/时间字段lastChackoutDate
的索引。尝试按range
或term
筛选行查询返回0行,但我知道有些文档中存在此字段的值。
Map查询返回预期的答案,其中包含:
... ,
"lastCheckoutDate": {
"type": "date"
},
...
尝试确定什么查询可以返回我等待的结果最终导致我得到一个表达式:
{
"from": 0,
"query": {
"bool": {
"filter": [
{
"bool": {
"must_not": [
{
"exists": {
"field": "lastCheckoutDate"
}
}
],
"must": [
{
"nested": {
"path": "nested_path",
"query": {
"term": {
"nested_path.id": {
"value": "some_unique_id"
}
}
}
}
}
]
}
}
]
}
},
"size": 50,
"sort": [
{
"displaySequence": {
"order": "asc"
}
}
]
}
它返回给我一个带有现有路径/值的单行:
hits
[0]
_source
lastCheckoutDate: 2020-01-23T00:00:00
此查询的explain
未阐明“exists”响应详细信息:* 常量分数(+到父数据块联接查询(嵌套路径.id:某个唯一id)-常量分数(字段名称:最后 checkout 日期)),乘积:*
那么有什么方法可以确定为什么字段对于查询不可见呢?
这对于每次创建和删除的测试数据库都很有效,但现有存储总是给我任何有效(从我的POV)查询0命中。OFC我为现有数据库做了一个迁移操作(至少不知何故,Map信息出现了一个新字段)。
弹性文档显示了“exists”查询可能失败的一些示例:
- 源JSON中的字段为空或[]
- 该字段具有“索引”:Map中的假集
- 字段值的长度超过了Map中的ignore_above设置
- 字段值格式错误,Map中定义了ignore_malformed
但我不确定我的情况是否适合。
2条答案
按热度按时间amrnrhlw1#
新文档在迁移发生之前被添加。因此AFAIK Elastic不会重新索引现有文档,直到它们在索引中被更新。
这就是为什么在测试数据库中没有问题。
oalqel3c2#
试试这个