弹性搜索---:MUST_NOT查询不起作用

时间:2019-09-05 12:47:26

标签: elasticsearch

我有一个查询,我想在其中添加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"
}
}
}

4 个答案:

答案 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)

映射本身存在问题,我删除了索引,并使用新的映射对其重新建立了索引,并且现在可以正常工作。