当前位置: 首页 > 知识库问答 >
问题:

在elasticsearch中搜索被or子句分割的嵌套文档中的多个字段

田兴旺
2023-03-14

这个问题的标题不能完全证明我的要求是合理的。我有一个嵌套文档,格式为

{
    "tags": [
        {
            "context": "context_pic_elements",
            "name": "walls",
            "created_at": 1542806972000,
            "tag_id": 48,
            "tagging_id": 1225
        },
        {
            "context": "element",
            "name": "solo",
            "created_at": 1542806972000,
            "tag_id": 47,
            "tagging_id": 1226
        },
        {
            "context": "end_use",
            "name": "home renovation",
            "created_at": 1542806972000,
            "tag_id": 45,
            "tagging_id": 1224
        }
    ],
    "name": "Wall patterns",
}

文档映射为

{
  "properties": {
    "name": {
      "type": "text"
    },
    "tags": {
      "type": "nested",
      "properties": {
        "name": { "type": "keyword" },
        "context": { "type": "keyword" },
        "tag_id": { "type": "integer" }
      }
    }
  }
}

我希望能够以

images WHERE
    (tags.context="context_pic_elements" AND tags.name="walls")
    OR (tags.context="element" AND tags.name="solo")

我现在尝试的查询是

{
  "query": {
    "nested" : {
      "path" : "tags",
      "query": {
        "bool": {
          "should" : {
            "bool": {
              "must": [
                {"term": {"tags.context": "context_pic_elements"}},
                {"term": {"tags.name": "walls"}}
              ]
            }
          }
        }
      }
    }
  }
}

这允许我查询AND子句的第一个条件。我应该在查询中的何处添加第二个AND条件(弹性搜索不允许在其查询中包含多个must子句),以允许我根据这两个条件进行查询。我查看了elasticsearch bool查询组合must和OR,但这不是我所需要的。

共有1个答案

籍辰沛
2023-03-14

由于嵌套文档是独立的文档,因此需要以相反的方式进行,即使用两个嵌套子句,而不是嵌套两个或子句,如下所示:

POST index/_search
{
  "query": {
    "bool": {
      "should": [
        {
          "nested": {
            "path": "tags",
            "query": {
              "bool": {
                "must": [
                  {
                    "term": {
                      "tags.context": "context_pic_elements"
                    }
                  },
                  {
                    "term": {
                      "tags.name": "walls"
                    }
                  }
                ]
              }
            }
          }
        },
        {
          "nested": {
            "path": "tags",
            "query": {
              "bool": {
                "must": [
                  {
                    "term": {
                      "tags.context": "element"
                    }
                  },
                  {
                    "term": {
                      "tags.name": "solo"
                    }
                  }
                ]
              }
            }
          }
        }
      ]
    }
  }
}
 类似资料:
  • 假设我有一些用户使用以下文档编制索引: ElasticSearch DSL是否允许我构造一个查询,在该查询中,我可以根据人们的电子邮件地址进行搜索,但前提是该地址处于活动状态?更抽象地说,根据嵌套对象的其他属性搜索文档。 满足此条件的搜索将返回此文档以搜索或,但在搜索时不会返回此文档。

  • 问题内容: 我正在尝试使用以下映射搜索文档: 我想在“ naam”,“ omschrijving”等中进行搜索,但也想在嵌套文档“ kenmerken”的动态映射中进行搜索,因此我创建了两个搜索查询,但它们似乎都不起作用。 我应该使用布尔还是过滤器?或两者结合? 我什至靠近吗? 问题答案: 由于需要解决方案,因此我决定创建一个单独的字符串字段,在其中分解“ kenmerken”字段。目前,此方法可

  • 问题内容: 我对ES还是相当陌生,并正在将其用于我的新项目。首先,我为客户提供了一个简单的映射,其中包含名字和姓氏以及付款信息对象列表。如果我在SQL中执行此操作,那将类似于客户表和具有1:许多关系的付款信息表。 这是我要执行的操作的一个简单示例:https : //gist.github.com/anonymous/6109593 我希望根据payInfos嵌套数组中的任何匹配项找到任何客户,即

  • 问题内容: 我正在编写资产管理应用程序。它允许用户通过向资产添加html控件(例如文本字段,选择菜单等)来存储任意资产属性。然后,该属性的JSON表示成为存储在beddb中的资产JSON文档的一部分。资产在ouchdb中具有以下结构: 我不确定将属性放入数组是否是允许基于属性值搜索资产的最佳方法。将属性直接附加到资产作为属性会更好吗?我正在用Elasticsearch做实验。如果我尝试按原样存储文

  • 在ElasticSearch6中,我有如下嵌套对象的数据: 我想从字段brand_name或字段title进行搜索。我想在相同的inner_hits中返回所有结果。 例如:如果我将搜索字符串输入为“xyz”,它应该返回两个brands对象和相应的product对象。如果我将搜索字符串输入为“test”,它应该只返回第一个品牌数组,只有第一个产品对象。 我怎么才能做到这一点。有什么想法吗? 我尝试使

  • 我使用Spring-Data-ElasticSearch2.0.8和ElasticSearch.2.2.0来动态搜索嵌套对象。 基本上,我的嵌套对象可以有很少的嵌套字段,但我希望在所有这些字段中动态搜索。例如,一个动物文档可以有3x个字段来描述它:名称/大小/描述。 我想在所有这些搜索,因为我的搜索结束点只是有一个‘描述’自由文本选项。因此,当用户在他的入口点键入'15'或'dog'时,搜索将检查