2011-09-15 41 views
8

考慮一個非常簡單的模型,我們有位置,每個位置可以有零個或多個事件。一個位置將具有諸如名稱,描述和地理位置數據(lon/lat)之類的屬性。一個事件應附加到一個位置(其父),並應有一個名稱和描述。我如何才能檢索匹配的孩子?

{ 
    "location" : { 
     "properties": { 
      "name": { "type": "string", "boost": 2.0, "analyzer": "snowball" }, 
      "description": { "type": "string", "analyzer": "snowball" }, 
      "geo": { "type": "geo_point" }, 
      "exhibits": { 
       "type": "nested", 
       "properties": { 
        "name": { "type": "string", "boost": 2.0, "analyzer": "snowball" }, 
        "description": { "type": "string", "analyzer": "snowball" } 
       } 
      } 
     } 
    } 
} 

我希望能夠做的,是要查詢的執行他們的名稱和說明全文搜索子文件(事件)。我希望重新獲得匹配事件並能夠獲取其父母位置的名稱。我還想根據位置座標縮小結果集。我不想得到任何與查詢不匹配的事件。這在Elastic Search中可能嗎?我應該使用哪些類型的查詢?

我曾嘗試將事件作爲位置下的數組屬性(請參見上文)並使用nested查詢,但它不返回我想要的結果類型(我認爲它返回整個位置,包括所有事件,甚至是那些不符合我的查詢)。我曾嘗試將事件放入單獨的索引(映射?),提供_parent屬性,然後對位置執行top_children查詢,但我沒有得到任何結果。

{ 
    "exhibit": { 
     "_parent": { "type": "locations" }, 
     "properties": { 
      "name": { "type": "string", "boost": 2.0, "analyzer": "snowball" }, 
      "description": { "type": "string", "analyzer": "snowball" } 
     } 
    } 
} 

任何人都可以點亮一下嗎?我不知道從哪裏開始...

回答

8

這是我的問題的工作解決方案,也許這對某些人有用。

位置映射:

{ 
    "location" : { 
     "properties": { 
      "name": { "type": "string", "boost": 2.0, "analyzer": "snowball" }, 
      "description": { "type": "string", "analyzer": "snowball" }, 
      "geo": { "type": "geo_point" } 
     } 
    } 
} 

圖表製圖:

{ 
    "exhibit": { 
     "_parent": { "type": "locations" }, 
     "properties": { 
      "name": { "type": "string", "boost": 2.0, "analyzer": "snowball" }, 
      "description": { "type": "string", "analyzer": "snowball" } 
     } 
    } 
} 

查詢:

{ 
    "fields": [ "_parent", "name", "_source" ], 
    "query": { 
     "bool": { 
      "should": [ 
       { "text": { "name": "candy" } }, 
       { "text": { "description": "candy" } } 
      ] 
     } 
    }, 
    "filter": { 
     "and": [ 
      { 
       "terms" : { 
        "_parent": [ "4e7089a9b97d640b30695b7a", "4e7089eeb97d640b30695b7b" ] 
       } 
      }, 
      { "range": { "start": { "lte": "2011-09-22" } } }, 
      { "range": { "end": { "gte": "2011-09-22" } } } 
     ] 
    } 
} 

您應該查詢使用_parent領域,它傳遞的位置ID的數組你想限制展品。

+0

非常有幫助,謝謝你的分享。您使用什麼JSON將新展覽添加到某個位置? – gjb

+0

很酷,但你如何找回父母的名字? '「fields」:[「_parent」,「name」,「_source」]'將檢索孩子的名字,對嗎? – Yeggeps

+0

@Yeggeps:是的,查詢正在尋找某些文檔的子項。你所要求的不屬於我的情況。 –