【问题标题】:ElasticSearch query to find records not matchingElasticSearch 查询以查找不匹配的记录
【发布时间】:2020-04-21 13:21:57
【问题描述】:

我有多个公司类型的记录,这是一个保存在弹性搜索中的嵌套 json 文档。公司有以下结构,

{"companies" : [{
  "company" : {
    "manager" : [{
      "name" : "abc",
      "age" : "40"
    }],
    "employee_count" : "2300",
    "profit" : "10"
  },
  "company" : {
    "manager" : [{
      "name" : "def",
      "age" : "41"
    }],
    "employee_count" : "2200",
    "profit" : "10"
  },
  "company" : {
    "manager" : [{
      "name" : "ghi",
      "age" : "42"
    }],
    "employee_count" : "2100",
    "profit" : "10"
  }
}]
}

我需要找到 company.manager.name 的 NONE 为“abc”的公司记录数。

我尝试使用以下查询,但它不起作用。

获取索引/_搜索

{
  "query": {
    "bool" : {
      "must_not" : [{
        "match" : {
          "company.manager.name" : "abc"
        }
      }]
    }
  }
}

感谢任何帮助。谢谢!

【问题讨论】:

  • 嘿乔治,欢迎来到 SO!当您说您的查询不起作用时,您的意思是您得到 0 个结果、一条错误消息或其他什么?
  • 我提供了答案,假设您已经定义了正确的映射,但是对于一个好的弹性搜索问题,您应该提供索引定义(设置和映射)、您对文档、搜索查询和预期结果进行采样。请仔细阅读我的回答,如果它不起作用,请提供所有这些信息,以便我提供进一步的帮助
  • @Nate 我将所有记录作为响应返回。
  • 嗯,我认为我无法重现您的索引(我为公司创建了索引,不推荐使用 bc 映射类型),但您的查询在这种情况下有效。旁注,您可能需要使用_count/ API eventually
  • @George 很长时间以来,您都没有接受并支持我的答案,如果您的问题得到解决,如果您能接受并支持答案,那就太好了

标签: elasticsearch


【解决方案1】:

由于您使用nested映射,查询数据时需要提及nested路径,请参考this official doc for sample nested query

您的查询应如下所示,其中包含 nested 路径

{
    "query": {
        "nested": {
            "path": "companies",  --> note this
            "query": {
                "bool": {
                    "must_not": [
                        {
                            "match": {
                                "company.manager.name": "abc"
                            }
                        }
                    ]
                }
            }
        }
    }
}

【讨论】:

  • 你是对的。我使用正确的路径将嵌套子句添加到查询中。但是它返回索引下存在的所有记录作为响应。我无法提供有关映射的更多信息,因为我在这里使用模拟数据发布。无法分享实际数据。预期结果是没有经理名称为“abc”的公司的“公司”记录计数。所以基本上计算字段“companies.company.manager.name”不应匹配“abc”的“公司”。我已经分享了上面一家公司记录的结构。
  • @George,您的示例文档似乎有问题,我无法使用 { "mappings" :{ "properties" : { "companies" : { "type" : "nested" } } } } 映射对其进行索引,请您将此作为参考并创建示例文档,如您的问题?
  • @George,你有机会看看我最后的评论吗?
【解决方案2】:

如果您需要统计元素的数量,您应该先根据该条件聚合数据。查看 Elastic 官方文档的this section

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-18
    • 1970-01-01
    • 2013-07-26
    • 1970-01-01
    • 1970-01-01
    • 2015-09-02
    相关资源
    最近更新 更多