2016-02-02 253 views
1

我想使用elasticsearch實現自動完成功能。其中我的工作對指數的結構是這樣的
elasticsearch中的嵌套聚合

"title": "blog post 1", 
"body": "body of the blog post", 
"category": "programming", 
"locations": [ 
    {"name": "united states"}, 
    {"name": "new york"}, 
    {"name": "venice"} 
] 

我試圖使用嵌套聚合。我現在用的映射是這樣的

{        
    blog : {     
    mappings : {    
     tag : {     
     properties : {  
      body : {   
      type : string  
      },     
      category : {  
      type : string  
      },     
      locations : {  
      properties : { 
       name : {  
       type : string 
       }    
      }     
      },     
      title : {   
      type : string  
      }     
     }      
     }      
    }       
    }       
} 

這是爲了聚集的locations.name的基礎上對結果的查詢是

GET /blog/tag/_search 
{ 
    "size": 0, 
    "query": { 
     "match": { 
      "locations.name": "montreal" 
     } 
    }, 
    "aggs": { 
     "aggregated_locations": { 
      "nested": { 
       "path": "locations" 
      }, 
      "aggs": { 
       "filtered_locations": { 
        "terms": { 
         "fields": "locations.name" 
        } 
       } 
      } 
     } 
    } 
} 

目前我使用的elasticsearch鉻插件執行上述要求。上面的查詢給出了一個很長的錯誤,但如果有人提示,我也可以發佈它。我想我解釋嵌套聚合的含義可能是錯誤的,這意味着我的映射是錯誤的。但我無法弄清楚問題出在哪裏。

回答

2

有一些缺失的部分在映射,您需要將位置字段設置爲nested型,而不是分析內部的場能夠與你的期望方面彙總:

PUT blog 
{ 
    "mappings": { 
    "tag": { 
     "properties": { 
     "body": { 
      "type": "string" 
     }, 
     "category": { 
      "type": "string" 
     }, 
     "locations": { 
      "type": "nested", 
      "properties": { 
      "name": { 
       "type": "string", 
       "index": "not_analyzed" 
      } 
      } 
     }, 
     "title": { 
      "type": "string" 
     } 
     } 
    } 
    } 
} 

然後執行以下查詢到嵌套字段進行篩選,並在嵌套字段骨料,以及:

GET blog/_search 
{ 
    "size": 0, 
    "query": { 
    "nested": { 
     "path": "locations", 
     "query": { 
     "match": { 
      "locations.name": "montreal" 
     } 
     } 
    } 
    }, 
    "aggs": { 
    "aggregated_locations": { 
     "nested": { 
     "path": "locations" 
     }, 
     "aggs": { 
     "filtered": { 
      "terms": { 
      "field": "locations.name" 
      } 
     } 
     } 
    } 
    } 
} 

這些查詢可以被複制/粘貼在感(https://www.elastic.co/guide/en/sense/current/installing.html

+0

我用過 - >'curl -XGET'localhost:9200/blog/_mapping/tag?pretty'>! test.json'來獲得新的映射。但test.json是一個巨大的文件。它有很多冗餘。這是正常的行爲嗎? –

+0

那麼我究竟做了什麼刪除了我的索引,運行了映射,然後創建了新的索引....我的工作流出了什麼問題?我是elasticsearch的新手。 –

+1

您無法更新映射,工作流是否正確,您需要先刪除索引。有一篇博客文章在此處進行了解釋(https://www.elastic.co/blog/changing-mapping-with-zero-downtime),並指導您在零宕機時間內完成此任務。 –