rest - Elasticseach 存在对对象类型的查询返回 0 个结果
问题描述
[UPD] Elasticsearch 版本为 5.6
我在中定义了以下映射foo_index
:
{
"foo": {
"properties": {
"bar": {
"type": "object",
"dynamic": false
}
...
}
}
}
中的一些文档foo_index
包含bar
具有任意 json 数据的属性,而另一些则不包含。所以存储的文档foo_index
如下所示:
[
{ bar: { arbitrary: { json: 1 } }, ... },
{ bar: { arbitrary: { json: 2 } }, ... },
{ ... }, // bar property is absent,
{ bar: { arbitrary: { json: 3 } }, ... }
]
当我执行以下查询以仅获取那些包含bar
属性的对象时,我得到 0 个结果:
GET foo_index/foo/_search
{
"query": {
"exists": {
"field": "bar"
}
}
}
为什么这个查询不起作用?我希望它返回foo
包含bar
财产的文件。
解决方案
您无法查看文档的原因是您dynamic: false
在映射中设置了字段。
所以基本上当你这样做时,你是在告诉 elasticsearch不要为该字段创建单独的倒排索引。基本上该字段虽然存在于文档中,但它不是可搜索的字段。因此,没有查询适用于该字段。换句话说,ES 会表现得好像没有这样的字段。
如此链接中所述,当它设置为时,我们有以下内容false
新检测到的字段将被忽略。这些字段不会被索引,因此无法搜索,但仍会出现在返回匹配的 _source 字段中。这些字段不会添加到映射中,必须显式添加新字段。
基本上将您的映射更改为以下内容:
映射:
PUT foo_index
{
"mappings": {
"foo":{
"properties": {
"bar":{
"type": "object"
}
}
}
}
}
如果您在映射中删除该字段,Exists 查询将正常工作。
请注意,您需要删除索引,使用映射更改重新创建索引,重新摄取文档,然后尝试查询。
推荐阅读
- javascript - JavaScript 获取查询字符串参数的值
- r - Efficient cleaning of missing value in dataframe in R
- jquery - How to store a movieID in variable
- python - 如何克服python中的正则表达式深度限制?
- python - 通过 langdetect.detect 得到错误答案
- javascript - 传单标记未显示在网站中 - Codeigniter
- php - 依次在php数组中查找值
- kubernetes - Openshift/OKD 模板 if/else 条件
- r - 基于posixct日期时间和两个变量的data.table过滤解决方案?
- java - Android Java - 请求许可时是否可以隐藏导航栏