2015-10-07 95 views
1

我正在嘗試編寫一個將所有博客分組到同一個博客域(elasticpress.com,blog.com等)的elasticsearch查詢。這是我的查詢看起來像:ElasticSearch:URL的聚合不斷分裂字段

{ 
    "engagements": [ 
     "blogs" 
    ], 
    "query": { 
     "query": { 
      "filtered": { 
       "query": { 
        "match_all": {} 
       }, 
       "filter": { 
        "bool": { 
         "must": [ 
          { 
           "range": { 
            "weight": { 
             "gte": 120, 
             "lte": 150 
            } 
           } 
          } 
         ] 
        } 
       } 
      } 
     }, 
     "facets": { 
      "my_facet": { 
       "terms": { 
        "field": "blog_domain" <------------------------------------- 
       } 
      } 
     } 
    }, 
    "api": "_search" 
} 

然而,它的返回這樣的:

{ 
    "took": 5, 
    "timed_out": false, 
    "_shards": { 
     "total": 5, 
     "successful": 5, 
     "failed": 0 
    }, 
    "hits": { 
     "total": 3, 
     "max_score": 1, 
     "hits": [ 
      ... 
     ] 
    }, 
    "facets": { 
     "my_facet": { 
      "_type": "terms", 
      "missing": 0, 
      "total": 21, 
      "other": 3, 
      "terms": [ 
       { 
        "term": "http", 
        "count": 3 
       }, 
       { 
        "term": "noblepig.com", 
        "count": 2 
       }, 
       { 
        "term": "hawaiian", 
        "count": 2 
       }, 
       { 
        "term": "dream", 
        "count": 2 
       }, 
       { 
        "term": "dessert", 
        "count": 2 
       }, 
       { 
        "term": "2015", 
        "count": 2 
       }, 
       { 
        "term": "05", 
        "count": 2 
       }, 
       { 
        "term": "www.bt", 
        "count": 1 
       }, 
       { 
        "term": "photos", 
        "count": 1 
       }, 
       { 
        "term": "images.net", 
        "count": 1 
       } 
      ] 
     } 
    } 
} 

這不是我想要的。 現在我的數據庫中有三個記錄:

"http://www.bt-images.net/8-cute-photos-cats/", 

"http://noblepig.com/2015/05/hawaiian-dream-dessert/", 

"http://noblepig.com/2015/05/hawaiian-dream-dessert/" 

我希望它返回類似:

"facets": { 
     "my_facet": { 
      "_type": "terms", 
      "missing": 0, 
      "total": 21, 
      "other": 3, 
      "terms": [ 
       { 
        "term": "http://noblepig.com/2015/05/hawaiian-dream-dessert/", 
        "count": 2 
       }, 
       { 
        "term": "http://www.bt-images.net/8-cute-photos-cats/", 
        "count": 1 
       }, 

我會怎麼做呢?我查了一下,看到有人推薦mappings,但我不知道該查詢的位置,我的表有1億條記錄,所以現在做得太遲了。如果您有建議,可否請粘貼整個查詢?

{ 
    "engagements": [ 
     "blogs" 
    ], 
    "query": { 
     "query": { 
      "filtered": { 
       "query": { 
        "match_all": {} 
       }, 
       "filter": { 
        "bool": { 
         "must": [ 
          { 
           "range": { 
            "weight": { 
             "gte": 13, 
             "lte": 75 
            } 
           } 
          } 
         ] 
        } 
       } 
      } 
     }, 
     "aggs": { 
      "blah": { 
       "terms": { 
        "field": "blog_domain" 
       } 
      } 
     } 
    }, 
    "api": "_search" 
} 

回答

3

方式做,這是對那場不同的映射:

同樣的,當我使用aggs發生。您可以通過在blog_domain中添加子字段來更改路線中的映射,但是您的無法更改已經編入索引的文檔。映射更改將對新文檔生效。

只是爲了提這個的緣故,你blog_domain應該是這樣的:

"blog_domain": { 
     "type": "string", 
     "fields": { 
     "notAnalyzed": { 
      "type": "string", 
      "index": "not_analyzed" 
     } 
     } 
    } 

這意味着它應該有一個子場(我的樣品中被稱爲notAnalyzed),並且在聚合,你應該使用blog_domain.notAnalyzed

但是,如果您不想或不能進行此更改,有一種方法,但我相信它會更慢:使用腳本聚合。事情是這樣的:

{ 
    "aggs": { 
    "blah": { 
     "terms": { 
     "script": "_source.blog_domain", 
     "size": 10 
     } 
    } 
    } 
} 

而你需要enable dynamic scripting,如果你沒有啓用它做。

+0

我進一步挖掘,最終發現,我有一個'not_analyzed'指數...還我說錯,這個表是新的,只有映射3條記錄,所以我可以自由切換。這些記錄是否可能在索引出現之前創建? – Edmund

+0

字段是'not_analyzed',而不是索引。文件不能存在於索引之外。我認爲你在混淆事物。 –

+0

哦,這個領域是'not_analyzed'。鑑於它是'not_analyzed',我將嘗試''腳本「:」_source.blog_domain「,」 – Edmund

0

如果使用Elasticsearch 5.x的,你可以在下面

PUT your_index 
{ 
    "mappings": { 
    "your_type": { 
     "properties": { 
     "blog_domain": { 
      "type": "keyword", 
      "index": "not_analyzed" 
     }   
     } 
    } 
    } 
}