2017-01-10 63 views
0

样品文件如何做嵌套字段源过滤

{ 
"id" : "video1", 
    "title" : "Gone with the wind", 
    "timedTextLines" : [ 
    { 
     "startTime" : "00:00:02", 
     "endTime" : "00:00:05", 
     "textLine" : "Frankly my dear I don't give a damn." 
    }, 
    { 
     "startTime" : "00:00:07", 
     "endTime" : "00:00:09", 
     "textLine" : " my amazing country." 
    }, 
{ 
     "startTime" : "00:00:17", 
     "endTime" : "00:00:29", 
     "textLine" : " amazing country." 
    } 
    ] 
} 

索引定义而不精机芯源过滤

{ 
    "mappings": { 
    "video_type": { 
     "properties": { 
     "timedTextLines": { 
      "type": "nested" 
     } 
     } 
    } 
    } 
} 

响应。

{ 
    "took": 5, 
    "timed_out": false, 
    "_shards": { 
    "total": 5, 
    "successful": 5, 
    "failed": 0 
    }, 
    "hits": { 
    "total": 1, 
    "max_score": 0.91737854, 
    "hits": [ 
     { 
     "_index": "video_index", 
     "_type": "video_type", 
     "_id": "1", 
     "_score": 0.91737854, 
     "_source": { 

     }, 
     "inner_hits": { 
      "timedTextLines": { 
      "hits": { 
       "total": 1, 
       "max_score": 0.6296964, 
       "hits": [ 
       { 
        "_nested": { 
        "field": "timedTextLines", 
        "offset": 0 
        }, 
        "_score": 0.6296964, 
        "_source": { 
        "startTime": "00:00:02", 
        "endTime": "00:00:05", 
        "textLine": "Frankly my dear I don't give a damn." 
        }, 
        "highlight": { 
        "timedTextLines.textLine": [ 
         "Frankly my dear I don't give a <em>damn</em>." 
        ] 
        } 
       } 
       ] 
      } 
      } 
     } 
     } 
    ] 
    } 
} 

响应包含嵌套属性的所有属性。即startTime,endTime和textLine。我如何才能在响应中返回endtime和startTime?

失败查询

{ 
    "query": { 
    "bool": { 
     "should": [ 
     { 
      "match": { 
      "title": "gone" 
      } 
     }, 
     { 
      "nested": { 
      "path": "timedTextLines", 
      "query": { 
       "match": { 
       "timedTextLines.textLine": "damn" 
       } 
      }, 
      "inner_hits": { 
      "_source":["startTime","endTime"], 
       "highlight": { 
       "fields": { 
        "timedTextLines.textLine": { 

        } 
       } 
       } 
      } 
      } 
     } 
     ] 
    } 
    }, 
    "_source":"false" 
} 

错误 HTTP/1.1 400错误的请求 内容类型:application/JSON;字符集= UTF-8 内容长度:265

{ “错误”:{ “ROOT_CAUSE”:[{ “类型”: “illegal_argument_exception”, “理由”:“[inner_hits] _source不支持以下类型的值:START_ARRAY“}],”type“:”illegal_argument_exception“,”reason“:”[inner_hits] _source不支持类型值:START_ARRAY“},”status“:400}

回答

2

原因是因为从ES 5.0开始_sourceinner_hits不支持缩写形式了,但只有完整的对象形式(与includesexcludes)(see this open issue

您的查询可以写成这样,它会工作:

{ 
    "query": { 
    "bool": { 
     "should": [ 
     { 
      "match": { 
      "title": "gone" 
      } 
     }, 
     { 
      "nested": { 
      "path": "timedTextLines", 
      "query": { 
       "match": { 
       "timedTextLines.textLine": "damn" 
       } 
      }, 
      "inner_hits": { 
      "_source": { 
       "includes":[ 
        "timedTextLines.startTime", 
        "timedTextLines.endTime" 
       ] 
      }, 
       "highlight": { 
       "fields": { 
        "timedTextLines.textLine": { 

        } 
       } 
       } 
      } 
      } 
     } 
     ] 
    } 
    }, 
    "_source":"false" 
}