【问题标题】:Query elasticsearch where a key's value is at least some number查询键值至少为某个数字的弹性搜索
【发布时间】:2019-04-28 20:11:59
【问题描述】:

我正在处理文件以识别它们是否包含标签以及标签被识别的置信度。

我创建了一个名为 tagsnested 映射,其中包含 label(文本)和 confidence(在 0 和 100 之间浮动)。

这是一个我认为查询将如何工作的示例(我知道它是无效的)。它应该类似于“查找标签为 A 和 B 的文档。A 的置信度必须至少为 37,B 的置信度必须至少为 80”。

{
  "query": {
    "nested": {
      "path": "tags",
      "query": {
        "bool": {
          "must": [
            {
              "match": {
                "tags.label": "A"
              },
              "range": {
                "tags.confidence": {
                  "gte": 37
                }
              }
            },
            {
              "match": {
                "tags.label": "B"
              },
              "range": {
                "tags.confidence": {
                  "gte": 80
                }
              }
            }
          ]
        }
      }
    }
  }
}

有什么想法吗?我很确定我需要以不同的方式处理它(不同的映射)。我不确定如何在 ElasticSearch 中完成此操作。这可能吗?

【问题讨论】:

    标签: elasticsearch elasticsearch-6 elasticsearch-query elasticsearch-nested


    【解决方案1】:

    假设您的父文档将包含两个嵌套文档,如下所示:

    {  
       "tags":[  
          {  
             "label":"A",
             "confidence":40
          },
          {  
             "label":"B",
             "confidence":85
          }
       ]
    }
    

    如果是这样,下面是您的查询方式:

    嵌套查询:

    POST <your_index_name>/_search
    {
      "query": {
        "bool": {
          "must": [
            {
              "nested": {
                "path": "tags",
                "query": {
                  "bool": {
                    "must": [
                      {
                        "match": {
                          "tags.label": "A"
                        }
                      },
                      {
                        "range": {
                          "tags.confidence": {
                            "gte": 37
                          }
                        }
                      }
                    ]
                  }
                }
              }
            },
            {
              "nested": {
                "path": "tags",
                "query": {
                  "bool": {
                    "must": [
                      {
                        "match": {
                          "tags.label": "B"
                        }
                      },
                      {
                        "range": {
                          "tags.confidence": {
                            "gte": 80
                          }
                        }
                      }
                    ]
                  }
                }
              }
            }
          ]
        }
      }
    }
    

    请注意,每个嵌套文档都作为单独的文档进行索引。这就是您必须提到两个单独的查询的原因。否则,根据您所拥有的功能,它将在其父文档的一个/单个嵌套文档中搜索所有四个值。

    希望这会有所帮助!

    【讨论】:

    • 哦。那讲得通。我使用multi_match 在多个字段上以这种方式构造了查询(我也想搜索多个标签)。嵌套让我失望了。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2021-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-09
    • 1970-01-01
    相关资源
    最近更新 更多