如何搜索特定字段包含一个列表中的所有项而不包含另一个列表中的任何项的文档?

pwuypxnk  于 2021-06-14  发布在  ElasticSearch
关注(0)|答案(1)|浏览(315)

我要获取其特定字段包含一个列表中的所有项而不包含另一个列表中的任何项的文档。例如:
文档可能如下所示:

{
          "name" : "text",
          "number" : "1.0",
          "price" : "3.99"
}

我有一个字符串列表,必须在“name”字段中。

has_to_be = [element1, element2, ...]

我有一个字符串列表,不能在“name”字段中。

cannot_be = [element1, element2, ...]

我要获取文档,其字段“name”包含所有字符串from has\u to \u be,不包含任何单词from cannot \u be。
我试过这样的方法:

"query": 
{"bool": 
{"must": [
{"match": {"name": "element1"}}, 
{"match": {"name": "element2"}}
]}}

但我没有找到任何线索。
我还尝试了以下查询:

GET /index_name/_search?q=name:+element1 +element2

(附加问题:如何将这样的查询从python发送到elasticsearch?)
但是我也得到了命中率,它没有包含所有元素(element1或element2)。

plicqrtu

plicqrtu1#

关于您的过滤器需求,您可以使用布尔查询执行所需操作,并指定匹配运算符。
我用了一些测试文件:

POST test/_doc
{
  "elt": ["test1", "test2", "test3"]
}

POST test/_doc
{
  "elt": ["test1", "test2", "test3", "test4"]
}

POST test/_doc
{
  "elt": ["test1", "test2"]
}

以及下面的示例查询,其中文档必须包含 test1 AND test2 AND test3 but NOT test 4 . 因此,第一个文档将是唯一匹配的文档。

GET test/_search
{
  "query": {
    "bool": {
      "filter": [
        {
          "match": {
            "elt": {
              "query": "test1 test2 test3",
              "operator": "AND"
            }
          }
        }
      ],
      "must_not": [
        {
          "match": {
           "elt": {
              "query": "test4 test5",
              "operator": "OR"
            }
          }
        }
      ]
    }
  }
}

相关问题