我有一个带有可选日期/时间字段的索引,名为lastChackoutDate
。尝试通过range
或term
查询过滤行将返回0行,但我知道有些文档中存在该字段的值。
映射查询返回给我一个预期的答案:
... ,
"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
并未说明“存在”响应的详细信息: ConstantScore(+ ToParentBlockJoinQuery(nested_path.id:some_unique_id)-ConstantScore(_field_names:lastCheckoutDate)),其结果是:
那么,有什么方法可以确定为什么字段对于查询不可见?
这对于每次创建和删除的测试数据库都很好,但是对于任何有效的查询(来自我的POV),现有的存储总是使我得到0次匹配。我对现有数据库进行了迁移操作(至少以某种方式为新字段显示了映射信息)。
弹性文档显示了“现有”查询可能失败的一些示例:
-源JSON中的字段为null或[]
-该字段具有“ index”:映射中设置为false
-字段值的长度超出了映射中的ignore_above设置
-字段值格式错误,并且在映射中定义了ignore_malformed
但我不确定我的情况是否适用。
答案 0 :(得分:0)
在迁移发生之前添加了新文档。因此,AFAIK Elastic在索引中更新现有文档之前不会对其重新编制索引。
这就是为什么在测试数据库上我没有问题的原因。