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

标签 python elasticsearch

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

{
          "name" : "text",
          "number" : "1.0",
          "price" : "3.99"
}
我有一个字符串列表,必须在“名称”字段中。
has_to_be = [element1, element2, ...]
我有一个不能在“名称”字段中的字符串列表。
cannot_be = [element1, element2, ...]
我想获取文档,其字段“名称”包含has_to_be中的所有字符串,不包含cannot_be中的任何单词。
我尝试过这样的事情:
"query": 
{"bool": 
{"must": [
{"match": {"name": "element1"}}, 
{"match": {"name": "element2"}}
]}}
但是我没有任何成功。
我也尝试了以下查询:
GET /index_name/_search?q=name:+element1 +element2
(另一个问题:如何将这样的查询从python发送到elasticsearch?)
但是我也得到了点击,其中没有包含所有元素(element1或element2)。

最佳答案

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

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"
            }
          }
        }
      ]
    }
  }
}

关于python - 如何搜索其特定字段包含一个列表中的所有项目而不包含另一列表中的任何项目的文档?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64553565/

相关文章:

python - 连接四个游戏-制作一个网格

python - 如何从按月分区的 Parquet 文件中删除特定月份

多字段搜索的 Elasticsearch 语法错误

elasticsearch - datetime的invalid_argument_exception

elasticsearch - Kibana条形图无法正确过滤数据

elasticsearch - QueryBuilders数组 Elasticsearch 2.4

python - 如何让 Python XML 停止浪费子节点

python - paramiko Channel.recv() 究竟是如何工作的?

python - 比较两个列表,保留重复项但删除 Python 中索引位置中的相同项

symfony - Elasticsearch PHP最长前缀匹配