当前位置: 首页 > 面试题库 >

带有嵌套对象的elasticsearch嵌套查询

宋华灿
2023-03-14
问题内容

这是我在elasticsearch中存储在索引上的数据类型。我必须找到包含主要成分牛肉(且重量小于1000)和成分-(辣椒粉且重量小于250),(橄榄油和重量小于300)以及所有其他成分类似的食谱。

   "Name": "Real beef burritos",
      "Ingredients": [
         {"name": "olive oil",
            "id": 27,
            "weight": 200},
         {"name": "bonion","id": 3,"weight": 300},
         {"name": "garlic",
            "id": 2,
            "weight": 100
         },
         {"name": "chilli powder",
            "id": 35,
            "weight": 150},
           {"name": "coriander",
            "id": 40,
            "weight": 600},
         {"name": "tortillas",
            "id": 41,
            "weight": 700}
      ],"Main_ingredient": {
         "type": "Beef",
         "id": 101,
         "weight": 1000
      }}}

索引的映射是

{"final":{"mappings":{"superb":{"properties":{"Cook Time":{"type":"long"},"Ingredients":{"type":"nested","properties":{"id":{"type":"short"},"name":{"type":"string"},"type":{"type":"string"},"weight":{"type":"short"}}},"Main_ingredient":{"properties":{"id":{"type":"long"},"type":{"type":"string"},"weight":{"type":"long"}}},"Name":{"type":"string"},"Prep Time":{"type":"long"},"Servings":{"type":"long"},"Tags":{"type":"string"},"Urls":{"type":"string"},"Views":{"type":"long"}}}}}}

我的查询是

{
  "query": {
    "bool": {
      "must": [
        { "match": { "Main_ingredient.type": "Beef" }}, 
        {"range":{"Main_ingredient.weight":{"lte":1000}}},
        {
          "nested": {
            "path": "Ingredients", 
            "query": {
              "bool": {
                "must": [ 
                  { "match": { "Ingredients.name": "garlic" }},
                  { "range": { "Ingredients.weight":{"lte":400}     }},
                  { "match": { "Ingredients.name": "chilli powder" }},
                  { "range": { "Ingredients.weight":{"lte":400}     }}
                ]
        }}}}
      ]
}}}

但这给了Null。有人可以帮我吗?我认为我没有正确使用嵌套查询


问题答案:

试试这个:

{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "Main_ingredient.type": "Beef"
          }
        },
        {
          "range": {
            "Main_ingredient.weight": {
              "lte": 1000
            }
          }
        },
        {
          "nested": {
            "path": "Ingredients",
            "query": {
              "bool": {
                "must": [
                  {
                    "match": {
                      "Ingredients.name": "garlic"
                    }
                  },
                  {
                    "range": {
                      "Ingredients.weight": {
                        "lte": 400
                      }
                    }
                  }
                ]
              }
            }
          }
        },
        {
          "nested": {
            "path": "Ingredients",
            "query": {
              "bool": {
                "must": [
                  {
                    "match": {
                      "Ingredients.name": "chilli powder"
                    }
                  },
                  {
                    "range": {
                      "Ingredients.weight": {
                        "lte": 400
                      }
                    }
                  }
                ]
              }
            }
          }
        }
      ]
    }
  }
}


 类似资料:
  • 我有一个带有嵌套映射的索引。我想预先形成一个查询,该查询将返回以下内容:给我搜索词中每个单词出现在一个或多个嵌套文档中的所有文档。 以下是索引: 以下是我尝试的最新查询: 例如,如果我搜索单词“食物和水”,我希望每个单词至少出现在嵌套文档中。即使只有一个单词存在,当前搜索也会返回文档 谢谢你的帮助! 更新:正如克里斯托所建议的,解决方案有效。现在我有以下问题。 这是我的索引: 我要执行的查询是,如

  • 尊敬的弹性搜索专家, 我在查询嵌套对象时遇到问题。允许使用以下简化映射: 并将一些文档放在索引中: 现在我想执行这样的查询: 因此,我想得到匹配的公司与数量匹配的文件。因此,上面的查询应该会告诉我: 以下查询: 应该给我所有公司分配到一个文件,其标题包含“GPU”与匹配的文件数量: 如果表现良好,是否有可能实现这一结果?我显然对匹配的文档不感兴趣,只对匹配文档和嵌套对象的数量感兴趣。 谢谢你的帮助

  • 问题内容: 如何转换这种查询。 使用QueryBuilders进行Java客户端查询 问题答案: 以下Java代码将生成您的查询 参数为: 参数为:

  • 我正在努力编写一个具有多个和/或条件的弹性搜索查询。 它的基本逻辑如下: 正如docs中提到的,如果一个文档只满足must子句,那么它就被认为是匹配的。在这种情况下,should子句起到增强作用,即如果文档除了mouth子句之外还匹配一个或多个should子句,那么它将具有更高的相关性得分,假设cond2、cond3和cond4是计算相关性得分的查询。 问题是我只想要至少匹配OR条件之一的文档。

  • 我试图创建一个嵌套查询,它将过滤掉一些带有特定术语的文档。在本例中,我试图过滤掉在user.first中有匹配术语的文档。数据示例: 我的查询没有得到所需的结果,因为它返回给我所有未筛选的记录。我尝试使用: 我希望这里得到与过滤器不匹配的文档。在这种情况下,它应该只返回第二个文档。做这件事的正确方法是什么?

  • 问题内容: 我正在使用Nest Elastic并使用Head插件为布尔搜索构建查询,我正在合并多个查询 有关数据库结构和弹性映射的注释 数据库中的每个文档都链接到特定的profileId,后者又具有多个属性 每个文档都有与其关联的多个属性值 在此查询中,我要获取具有特定配置文件和属性值> 30的所有文档,同时要记住,此属性应仅具有ID 2。 SQL查询: 从文档d内部联接attributeValu