2015-02-09 188 views
6

我想写一个查询使用query_string检索嵌套对象的数据查询。Elasticsearch query_string嵌套查询

我愿做查询的例子是这样的一个:

{ 
    "query": { 
    "query_string": { 
     "query": "a.id:2" 
    } 
    } 
} 

其中“A”是一个嵌套的对象,“ID”是“一”的字段。

我知道我可以成功地执行使用使用嵌套查询这个任务,编写一个查询,如:

{ 
    "nested": { 
    "path": "a" 
    "query_string": { 
     "query": "a.id:2" 
    } 
    } 
} 

不过,我想,以避免它。我不想弄清楚用户正在搜索嵌套字段并修改查询。 我试图使用“fields”参数,但它看起来不适用于嵌套对象。

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

+0

我试图找到这个问题的答案。只是想知道你是否能够找到任何解决方案。任何帮助将是伟大的!谢谢 – Vineet 2015-05-10 01:25:12

+0

不幸的是我没有找到解决方案。 – Cale 2015-05-10 15:03:54

回答

7

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

现在你应该可以做一个查询像

{ 
    "query": { 
    "query_string": { 
     "query": "fields.fieldvalue:sometext" 
    } 
    } 
} 

如: -

"mappings": { 
     "documentmetadatavalue": { 
      "properties": { 
       "id": { 
        "type": "string" 
       }, 
       "fields": { 
       "type": "nested", 
       "include_in_parent": true, 
       "properties": { 
        "fieldId": {"type": "string"}, 
        "fieldvalue": {"type": "string"} 
       } 
       } 
      } 
     } 
    } 

让我知道是否有帮助。

+4

你的建议是一个很好的选择。但是,请注意,使用“include_in_parent”设置,将嵌套资源展平为父级对象。 实际上,您将文档重新编排为扁平对象。 您正在失去嵌套对象的一些不错的功能。例如,如果搜索具有至少一个具有特定值的TWO属性的子对象的父对象,查询将不会检查TWO属性是否具有唯一子对象中的这些值。 – Cale 2015-05-11 13:21:13

+0

查看最近发布的inner_hits的文档。你应该能够使它适用于这个新功能。 (https://www.elastic.co/guide/en/elasticsearch/reference/1.x/search-request-inner-hits.html#nested-inner-hits – Vineet 2015-05-16 21:38:11