Elasticsearch query_string嵌套查询

Cal*_*ale 6 elasticsearch

我试图使用query_string编写一个查询来检索嵌套对象的数据查询.

我想要做的一个查询示例是:

{
  "query": {
    "query_string": {
      "query": "a.id:2"
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

其中"a"是嵌套对象,"id"是"a"字段.

我知道我可以使用嵌套查询成功执行此任务,编写如下查询:

{
  "nested": {
    "path": "a"
    "query_string": {
      "query": "a.id:2"
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

但是,我想避免它.我不想自己弄清楚用户正在搜索嵌套字段并修改查询.我尝试使用"fields"参数,但看起来它不适用于嵌套对象.

是否可以使用"query_string"查询直接编写此查询?可以获得什么语义?(例如,如果我写"a.id:2 AND ab:10"我匹配同一个对象或不同对象中的两个字段?)

Vin*_*eet 9

我正在做更多的研究,发现这可以通过在映射中将include_in_parent设置为true来实现.

现在你应该能够做一个像这样的查询

{
  "query": {
    "query_string": {
      "query": "fields.fieldvalue:sometext"
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

例如:-

"mappings": {
         "documentmetadatavalue": {
            "properties": {
              "id": {
                  "type": "string"
               },
               "fields": {
                 "type": "nested",
                 "include_in_parent": true, 
                 "properties": {
                   "fieldId": {"type": "string"},
                   "fieldvalue": {"type": "string"}
                 }
               }
           }
        }
     }
Run Code Online (Sandbox Code Playgroud)

如果有帮助,请告诉我.

  • 你的建议是一个很好的选择.但请注意,使用"include_in_parent"设置,您将嵌套资源展平为父对象中的对象.您实际上是将文档重新索引为展平对象.你正在失去嵌套对象的一些很好的功能.例如,如果搜索具有至少一个具有特定值的TWO属性的子对象的父对象,则查询将不会检查TWO属性是否在唯一子级中具有这些值. (4认同)