2017-10-12 143 views
0

我正在寻找一种方法来查找在映射索引中具有某个二进制字段“未设置”的文档数量。但是,标准的“Exists”查询似乎不起作用。例如:Elasticsearch:在二进制字段上存在查询

{ 
 
    "some-index": { 
 
    "mappings": { 
 
     "some-type": { 
 
     "properties": { 
 
      "data": { 
 
      "type": "binary" 
 
      } 
 
     } 
 
     } 
 
    } 
 
    } 
 
}

查询: POST http://.../some-index/some-type/_search?size=1

{ 
 
    "query":{ 
 
    "exists":{ 
 
     "field":"data" 
 
    } 
 
    } 
 
}

上面的查询会不管是什么返回0的结果。我的猜测是这是因为Elasticsearch默认情况下不会在源代码中存储二进制字段,而“Exists”查询只查找源代码。

是否有替代使用Exists查询,理想情况下没有在映射中使用额外的布尔型字段?

回答

1

以下是否做你想要的...我创建了一个field1设置为二进制类型的模板,然后索引一个文件只有field2(我没有打扰定义),然后我正在寻找文档没有field1。您可以在开发控制台Kibana

PUT _template\binary 
{ 
      "template": "binary", 
      "mappings": { 
      "binary": { 
       "properties": { 

        "field1": { 
        "type": "binary" 
        } 
      } 
      } 
     }} 

PUT /binary/type/1 
{ 
    "field2":"abc" 
} 

GET binary/_search 
{ 
    "query": { 
     "bool": { 
      "must_not": { 
       "exists": { 
        "field": "field1" 
       } 
      } 
     } 
    } 
} 

运行这些应该返回你只是索引的文档如果你把它更改为以下,它不应该返回任何东西,因为FIELD2存在!

GET binary/_search 
{ 
    "query": { 
     "bool": { 
      "must_not": { 
       "exists": { 
        "field": "field2" 
       } 
      } 
     } 
    } 
} 
+0

感谢您的帮助。对于实际具有'field1'的文档,即当您查询{bool:{must:{exists:{field:“field1”}}}}?上次我尝试时,它不起作用。或者,正如在你的例子中,如果你把一个同时具有'field1'和'field2'的文档?我怀疑ES只是忽略“Exists”查询中的二进制字段。 – aaronqli

+1

你是对的,如果你明确地试图搜索一个二进制字段弹性状态它不可搜索,但你想返回没有二进制字段集的文档,这可以使用'GET binary/type/_count { “查询”:{ “布尔”:{ “must_not”:{ “存在”:{ “字段”: “字段1”} } } } }'得到在索引文档的数量是很简单,所以你可以从另一个中减去一个? – greggers

+0

这个查询(和_search)返回所有文档,无论是否设置了二进制字段:( – aaronqli

相关问题