2015-09-05 19 views
6

ElasticSearch'e sadece birkaç günlüğüm var ve bir öğrenme alıştırması birkaç iş listeleme sitesinden işleri toplayan ve bazı verileri içeren bir indeksi dolduran ilkel bir iş kazıyıcıyı hayata geçirdi. Benim için oynamak için.ElasticSearch'te filtrelenmiş, iç içe geçmiş iç_hits sorgusu üzerinde toplama

Dizinde, işleri listeleyen her web sitesi için bir belge bulunur. Bu belgelerin her birinin bir özelliği, o sitede bulunan her bir iş için bir nesne içeren bir 'iş' dizisidir. Her işi kendi dokümanı olarak indekslemeyi düşünüyorum (özellikle ElasticSearch belgelerinde inner_hits'in deneysel bir özellik olduğunu söylediği için), ancak şu an için, ElasticSearch'in inner_hits ve nested özelliklerini kullanarak yapmak istediğim şeyi başarabiliyor muyum diye bakmaya çalışıyorum. .

Yalnızca eşleşen işleri sorgulayabilir, filtreleyebilir ve geri gönderebilirim. Ancak, aynı inner_hits kısıtlamalarının bir kümeye nasıl uygulanacağından emin değilim.

client.search({ 
    "index": 'jobsitesIdx, 
    "type": 'sites', 
    "body": { 


    "aggs" : { 
      "jobs" : { 
       "nested" : { 
        "path" : "jobs" 
       }, 
       "aggs" : { 
        "location" : { "terms" : { "field" : "jobs.location.raw", "size": 25 } }, 
        "company" : { "terms" : { "field" : "jobs.company.raw", "size": 25 } } 
       } 
      } 
     }, 


    "query": { 
     "filtered": { 
      "query": {"match_all": {}}, 
      "filter": { 
      "nested": { 
       "inner_hits" : { "size": 1000 }, 
       "path": "jobs", 
       "query":{ 
       "filtered": { 
        "query": { "match_all": {}}, 
        "filter": { 
        "and": [ 
         {"term": {"jobs.location": "york"}}, 
         {"term": {"jobs.location": "new"}} 
        ] 
        } 
       } 
       } 
      } 
      } 
     } 
     } 
    } 
}, function (error, response) { 
    response.hits.hits.forEach(function(jobsite) { 
    jobs = jobsite.inner_hits.jobs.hits.hits; 

    jobs.forEach(function(job) { 
     console.log(job); 
    }); 

}); 

    console.log(response.aggregations.jobs.location.buckets); 
}); 

Bu geri New işlerin bütün inner_hits bana verir: Bu benim (node.js itibaren) çalışıyorum sorgu ve toplamıdır

{ 
    "jobsitesIdx" : { 
    "mappings" : { 
     "sites" : { 
     "properties" : { 
      "createdAt" : { 
      "type" : "date", 
      "format" : "dateOptionalTime" 
      }, 
      "jobs" : { 
      "type" : "nested", 
      "properties" : { 
       "company" : { 
       "type" : "string" 
       }, 
       "engagement" : { 
       "type" : "string" 
       }, 
       "link" : { 
       "type" : "string", 
       "index" : "not_analyzed" 
       }, 
       "location" : { 
       "type" : "string", 
       "fields" : { 
        "raw" : { 
        "type" : "string", 
        "index" : "not_analyzed" 
        } 
       } 
       }, 
       "title" : { 
       "type" : "string" 
       } 
      } 
      }, 
      "jobscount" : { 
      "type" : "long" 
      }, 
      "sitename" : { 
      "type" : "string" 
      }, 
      "url" : { 
      "type" : "string" 
      } 
     } 
     } 
    } 
    } 
} 

:

Bu

benim eşleme olduğunu York, ama toplam, her yer ve şirket için, sadece inner_hits ile eşleşenler için değil, sayımı gösteriyor.

Toplama yalnızca eşleşen inner_hits dosyasında bulunan verilerle nasıl alınacağıyla ilgili herhangi bir öneriniz var mı?

Düzenleme: İstenildiği gibi, eşleme ve dizin verilerinin bir dışa aktarılmasını eklemek için bunu güncelleştiriyorum. Ben, bu kullanarak Taskrabbit en elasticdump aracı ihraç burada bulunabilir: https://github.com/taskrabbit/elasticsearch-dump

endeksi: http://pastebin.com/WaZwBwn4 haritalama: adlandırılmış http://pastebin.com/ZkGnYN94 Yukarıda bağlantılı veriler bu benim özgün söz konusu örnek kod farklıdır

dizin oluşturduğunu jobsites6 Verilerde, işbu belgede atıfta bulunulan jobsitesIdx yerine. Ayrıca, verideki 'iş' türü, yukarıdaki kodda ise 'siteler' dir.

Yanıt verilerini görüntülemek için yukarıdaki kodda bulunan geri bildirimi doldurdum. Ne var ki ben konumu için bu toplanmasına görüyorum, beklendiği gibi, inner_hits ait foreach döngüsü New York'taki tek işleri görüyorum:

[ { key: 'New York, NY', doc_count: 243 }, 
    { key: 'San Francisco, CA', doc_count: 92 }, 
    { key: 'Chicago, IL', doc_count: 43 }, 
    { key: 'Boston, MA', doc_count: 39 }, 
    { key: 'Berlin, Germany', doc_count: 22 }, 
    { key: 'Seattle, WA', doc_count: 22 }, 
    { key: 'Los Angeles, CA', doc_count: 20 }, 
    { key: 'Austin, TX', doc_count: 18 }, 
    { key: 'Anywhere', doc_count: 16 }, 
    { key: 'Cupertino, CA', doc_count: 15 }, 
    { key: 'Washington D.C.', doc_count: 14 }, 
    { key: 'United States', doc_count: 11 }, 
    { key: 'Atlanta, GA', doc_count: 10 }, 
    { key: 'London, UK', doc_count: 10 }, 
    { key: 'Ulm, Deutschland', doc_count: 10 }, 
    { key: 'Riverton, UT', doc_count: 9 }, 
    { key: 'San Diego, CA', doc_count: 9 }, 
    { key: 'Charlotte, NC', doc_count: 8 }, 
    { key: 'Irvine, CA', doc_count: 8 }, 
    { key: 'London', doc_count: 8 }, 
    { key: 'San Mateo, CA', doc_count: 8 }, 
    { key: 'Boulder, CO', doc_count: 7 }, 
    { key: 'Houston, TX', doc_count: 7 }, 
    { key: 'Palo Alto, CA', doc_count: 7 }, 
    { key: 'Sydney, Australia', doc_count: 7 } ] 

benim inner_hits New York'ta olanlar ile sınırlı olduğundan, bunu görebiliyorum toplama, tüm konumlar için bana sayım sağladığından, inner_hits'mde yok.

+0

Bazı örnek veriler sağlayabilir misiniz (belki bir gistte veya bir şeyde)? Ve sonuçların iade edilmesini bekliyorsunuz? –

cevap

10

Bunu, yalnızca New York işlerini içerecek şekilde topluluğunuza aynı filtreyi ekleyerek gerçekleştirebilirsiniz. Ayrıca, ikinci topluluğunuzda company.raw olduğunu ancak jobs.company alanınızda raw adlı not_analyzed bölümünün bulunmadığını, dolayısıyla analiz edilmemiş şirket adında bir araya getirmek istiyorsanız eklemeniz gerektiğini unutmayın.

{ 
    "_source": [ 
    "sitename" 
    ], 
    "query": { 
    "filtered": { 
     "filter": { 
     "nested": { 
      "inner_hits": { 
      "size": 1000 
      }, 
      "path": "jobs", 
      "query": { 
      "filtered": { 
       "filter": { 
       "terms": { 
        "jobs.location": [ 
        "new", 
        "york" 
        ] 
       } 
       } 
      } 
      } 
     } 
     } 
    } 
    }, 
    "aggs": { 
    "jobs": { 
     "nested": { 
     "path": "jobs" 
     }, 
     "aggs": { 
     "only_loc": { 
      "filter": {   <----- add this filter 
      "terms": { 
       "jobs.location": [ 
       "new", 
       "york" 
       ] 
      } 
      }, 
      "aggs": { 
      "location": { 
       "terms": { 
       "field": "jobs.location.raw", 
       "size": 25 
       } 
      }, 
      "company": { 
       "terms": { 
       "field": "jobs.company", 
       "size": 25 
       } 
      } 
      } 
     } 
     } 
    } 
    } 
} 
+0

Bunun çalıştığını onaylıyorum, teşekkürler!Anladığım kadarıyla, 'sorgu' tarafından döndürülen üst belgeler, kümelenmenin kapsamını etkiler; ES'nin aynı zamanda, filtrenin kısıtlamalarını tekrar tekrar agresyonda tekrar etmek zorunda kalmadan, inner_hits ile ilgili olarak da geçerli olmasına izin vermesi hoş olurdu. Öte yandan, belki de 'deneysel' inner_hits özelliğini kullanmak problemi soruyor. Ayrıca, index.company.raw bir dahaki sefere indeksi yeniden oluşturduğumda iyi bir not eklemek için kendime bir not verdim. – mmccaff

İlgili konular