我有一个查询,我想在其中添加must_not子句,该子句将丢弃某些字段具有空白数据的所有记录。我尝试了很多方法,但是都没有用。当我对其他特定字段发出相同的查询(如下所述)时,它工作正常。
此查询应获取所有没有“ registrationType1”字段为空/空白的记录
query:
{
"size": 20,
"_source": [
"registrationType1"
],
"query": {
"bool": {
"must_not": [
{
"term": {
"registrationType1": ""
}
}
]
}
}
}
下面的结果仍然包含带有空值的“ registrationType1”
results:
**"_source": {
"registrationType1": ""}}
, * {
"_index": "oh_animal",
"_type": "animals",
"_id": "3842002",
"_score": 1,
"_source": {
"registrationType1": "A&R"}}
, * {
"_index": "oh_animal",
"_type": "animals",
"_id": "3842033",
"_score": 1,
"_source": {
"registrationType1": "AMHA"}}
, * {
"_index": "oh_animal",
"_type": "animals",
"_id": "3842213",
"_score": 1,
"_source": {
"registrationType1": "AMHA"}}
, * {
"_index": "oh_animal",
"_type": "animals",
"_id": "3842963",
"_score": 1,
"_source": {
"registrationType1": ""}}
, * {
"_index": "oh_animal",
"_type": "animals",
"_id": "3869063",
"_score": 1,
"_source": {
"registrationType1": ""}}**
上方字段的PFB映射
"registrationType1": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword"
}
}
}
答案 0 :(得分:1)
您需要使用keyword
子字段来做到这一点:
{
"size": 20,
"_source": [
"registrationType1"
],
"query": {
"bool": {
"must_not": [
{
"term": {
"registrationType1.keyword": "" <-- change this
}
}
]
}
}
}
答案 1 :(得分:1)
如果您未在文本字段中指定任何文本值,则基本上没有任何内容可以进行分析并相应地返回文档。
以类似的方式,如果您删除must_not
并将其替换为must
,它将显示空白结果。
您可以做的是,查看您的映射,在keyword
字段上查询must_not。关键字字段不会被分析,这样您的查询将按预期返回结果。
POST myemptyindex/_search
{
"query": {
"bool": {
"must_not": [
{
"term": {
"registrationType1.keyword": ""
}
}
]
}
}
}
希望这会有所帮助!
答案 2 :(得分:0)
我使用的是Elasticsearch 7.2版, 我复制了您的数据并吸收到我的弹性索引中,并尝试使用.keyword和不使用.keyword进行查询。
在字段名称中使用“ .keyword”时,我得到了期望的结果。它没有返回具有registrationType1 =“”的文档。
注意-不使用“ .keyword”时查询不起作用
我在下面添加了示例代码,看看是否有帮助。
from elasticsearch import Elasticsearch
es = Elasticsearch()
es.indices.create(index="test", ignore=400, body={
"mappings": {
"_doc": {
"properties": {
"registrationType1": {
"type": "text",
"field": {
"keyword": {
"type": "keyword"
}
}
}
}
}
}
})
data = {
"registrationType1": ""
}
es.index(index="test",doc_type="_doc",body=data,id=1)
search = es.search(index="test", body={
"size": 20,
"_source": [
"registrationType1"
],
"query": {
"bool": {
"must_not": [
{
"term": {
"registrationType1.keyword": ""
}
}
]
}
}
})
print(search)
执行上述操作不应返回任何结果,因为我们正在为该字段插入空白
答案 3 :(得分:0)
映射本身存在问题,我删除了索引,并使用新的映射对其重新建立了索引,并且现在可以正常工作。