2015-09-07 48 views
0

下面是存儲在elasticsearch中的我的JSON文檔的示例格式。這可能與elasticsearch?

{ 
    "_index": "in22", 
    "_type": "event", 
    "_id": "ET00009709", 
    "_version": 1, 
    "_score": 1, 
    "_source": { 
     "Group": "Event", 
     "Title": "Jurassic World", 
     "_boost": 3, 
     "inner_hits": [ 
      { 
      "Code": "ET00009709", 
      "IsDefault": "", 
      "Language": "English", 
      "Format": "3D", 
      "Region": "MUMBAI" 
     }, 
     { 
      "Code": "ET00009710", 
      "IsDefault": "Y", 
      "Language": "English", 
      "Format": "2D", 
      "Region": "CHEN" 
     }, 
     { 
      "Code": "ET00009713", 
      "IsDefault": "", 
      "Language": "Hindi", 
      "Format": "2D", 
      "Region": "MUMBAI" 
     }, 
     { 
      "Code": "ET00009714", 
      "IsDefault": "", 
      "Language": "Tamil", 
      "Format": "3D", 
      "Region": "MUMBAI" 
     }, 
     { 
      "Code": "ET00009715", 
      "IsDefault": "", 
      "Language": "Hindi", 
      "Format": "3D", 
      "Region": "MUMBAI" 
     }, 
     { 
      "Code": "ET00009716", 
      "IsDefault": "", 
      "Language": "Bengali", 
      "Format": "2D", 
      "Region": "MUMBAI" 
     } 
     ] 
    } 
} 

現在我要實現的是,每當我搜索Title=Jurassic World and region=MUMBAI,我應該得到的上述文件,但inner_hits不應含有

{ 
       "Code": "ET00009710", 
       "IsDefault": "Y", 
       "Language": "English", 
       "Format": "2D", 
       "Region": "CHEN" 
} 

因此,這是可以實現的?

我試圖到目前爲止什麼是

{ 
    "query": { 
    "nested": { 
     "path": "inner_hits", 
     "query": { 
     "bool": { 
      "must": [ 
      { 
       "match": { 
       "inner_hits.Region": "MUMBAI" 
       } 
      } 
      ] 
     } 
     } 
    } 
    } 
} 

但我無法實現我想要的,它根本不刪除該模塊包含Region: Chen

如果有人知道如何解決有了這個,請分享。 謝謝

+0

elasticsearch的哪個版本? – keety

+0

@keety ES版本:1.5.2 – nm10

回答

1

一個解決方法是使用elasticsearch 1.5中添加的inner_hit功能。 這將返回與嵌套查詢匹配的嵌套文檔。

實施例:

{ 
    "_source": { 
     "exclude": ["inner_hits.*"] 
    }, 
    "query": { 
     "nested": { 
     "path": "inner_hits", 
     "query": { 
      "bool": { 
       "must": [ 
        { 
        "match": { 
         "inner_hits.Region": "MUMBAI" 
        } 
        } 
       ] 
      } 
     }, 
     "inner_hits": { 
       "size" : 10 
      } 
     } 
    } 
} 

響應

"hits": [ 
    { 
     "_index": "test", 
     "_type": "test", 
     "_id": "1", 
     "_score": 3.8630462, 
     "_source": { 
      "Group": "Event", 
      "_boost": 3, 
      "inner_hits": [], 
      "Title": "Jurassic World" 
     }, 
     "inner_hits": { 
      "inner_hits": { 
       "hits": { 
       "total": 2, 
       "max_score": 3.8630462, 
       "hits": [ 
        { 
         "_index": "test", 
         "_type": "test", 
         "_id": "1", 
         "_nested": { 
          "field": "inner_hits", 
          "offset": 2 
         }, 
         "_score": 3.8630462, 
         "_source": { 
          "Code": "ET00009713", 
          "IsDefault": "", 
          "Language": "Hindi", 
          "Format": "2D", 
          "Region": "MUMBAI" 
         } 
        }, 
        { 
         "_index": "test", 
         "_type": "test", 
         "_id": "1", 
         "_nested": { 
          "field": "inner_hits", 
          "offset": 0 
         }, 
         "_score": 3.8630462, 
         "_source": { 
          "Code": "ET00009709", 
          "IsDefault": "", 
          "Language": "English", 
          "Format": "3D", 
          "Region": "MUMBAI" 
         } 
        } 
       ] 
       } 
      } 
     } 
    } 
    ] 

有一個在除了_source僅包含匹配嵌套文件的響應的附加inner_hits。默認情況下,inner_hits返回前3個嵌套文檔。您可以使用size選項對此進行調整。

+0

首先感謝,我們離實際目標更近了一步,請現在考慮更新的文檔(我已編輯過文檔),索引它,使用您的搜索查詢,它會顯示點擊總數= 5(這是正確的有5個子文檔,其中有'區域= MUMBAI'),但是當你將查詢ES輸出時,將只包含3個嵌套文檔,其區域= MUMBAI而不是5,我可以知道這種工作背後的原因是什麼? – nm10

+0

默認[inner_hits](https://www.elastic.co/guide/en/elasticsearch/reference/current/search-request-inner-hits.html#_options)返回前三個文檔。你可以使用'size'選項來調整它。我編輯了答案來表明這一點 – keety