2015-12-03 131 views
0

我有一個問題... 我想要使用exists篩選結合聚合在我的java查詢來獲得結果,如果該字段有任何值。它是一個嵌套數組,所以我想要獲得數組中具有任何值的元素。 在我的Java代碼,我有這樣的:elasticsearch存在過濾器java

ExistsFilterBuilder filter=FilterBuilders.existsFilter("guides"); 
QueryBuilder qb = QueryBuilders.filteredQuery(QueryBuilders.matchAllQuery(),filter); 
TermsBuilder tbBrand = AggregationBuilders.terms("brand-ag").field("brand.name.name.raw").order(Terms.Order.term(true)).size(0); 

SearchResponse sr = esClient.prepareSearch("cellphones").setTypes("cellphone").setQuery(qb) 
       .addAggregation(tbBrand).execute().actionGet(); 

我的對象類有場 「指南」 作爲一個嵌套的對象:

@Field(type = FieldType.Nested) 
private List<EquipoVideoTutorialDTO> guides; 

品牌聚集的對象:

@Field(type = FieldType.Object) 
private CatalogoDTO brand; 

這將返回一個空數組,但我知道我至少有1個項目...

此q uery結果在此:

{ 
    "filtered" : { 
    "query" : { 
     "match_all" : { } 
    }, 
    "filter" : { 
     "exists" : { 
     "field" : "guides" 
     } 
    } 
    } 
} 

發佈的代碼,我想要的是: 獲取要從該元件在「導遊」屬性一些值的索引所有的「品牌」名稱(聚集)。

我錯過了什麼嗎?

編輯

我想補充一個例子元素導遊

{ 
     "idEquipo": 3675, 
     "tipoTerminal": { 
      "id": 1, 
      "nombre": "TELEFONO" 
     }, 
     "brand": { 
      "id": 34, 
      "nombre": "Apple" 
     }, 
     "sistemaOperativo": {}, 
     "versionSO": null, 
     "idUnico": "3521", 
     "nombreComercial": null, 
     "modelo": "iPhone 5s", 
     "descripcion": "El iPhone siempre ha sido un dispositivo de vanguardia, y el iPhone 5s es exactamente eso. con una arquitectura móvil de 64 bits sin precedentes, un sensor identificador de huellas digitales innovador, y un flash doble LED, es un Smartphone que está adelantado a su tiempo. Todas estas funcionalidades están al servicio de las personas, y no al revés: son la prueba de que la innovación, cuidadosamente pensada, supera la tecnología desenfrenada. Esto se llama progreso. Y es algo hermoso.", 
     "capacidadesDiferentes": [ 
      { 
       "value": "Visual" 
      }, 
      { 
       "value": "Motriz" 
      }, 
      { 
       "value": "Auditiva - Habla" 
      } 
     ], 
     "destacado": null, 
     "precioMasBajo": null, 
     "fechaCreacion": "2013-10-11", 
     "fechaUltimaModificacion": "2014-08-13", 
     "coberturaRoamingInternacional": [], 
     "videos": [], 
     "tutoriales": [], 
     "guides": [ 
      { 
       "titulo": "Internet", 
       "subtitulo": null, 
       "descripcion": "Esta guía te ayudará a configurar tu equipo para que puedas navegar en Internet.", 
       "pdf": null, 
       "prioridad": 1 
      } 
     ], 
     "tecnologias": [ 
      { 
       "idTecnologia": 600, 
       "tecnologia": "3G", 
       "frecuencias": [ 
        { 
         "frecuencia": "900" 
        }, 
        { 
         "frecuencia": "850" 
        }, 
        { 
         "frecuencia": "1900" 
        }, 
        { 
         "frecuencia": "2100" 
        } 
       ] 
      }, 
      { 
       "idTecnologia": 100, 
       "tecnologia": "GSM", 
       "frecuencias": [ 
        { 
         "frecuencia": "850" 
        }, 
        { 
         "frecuencia": "900" 
        }, 
        { 
         "frecuencia": "1800" 
        }, 
        { 
         "frecuencia": "1900" 
        } 
       ] 
      }, 
      { 
       "idTecnologia": 800, 
       "tecnologia": "4GLTE", 
       "frecuencias": [ 
        { 
         "frecuencia": "700" 
        }, 
        { 
         "frecuencia": "1700" 
        }, 
        { 
         "frecuencia": "2100" 
        }, 
        { 
         "frecuencia": "850" 
        } 
       ] 
      } 
     ], 
     "versiones": [], 
     "categorias": [], 
     "version": null, 
     "estatus": "P", 
     "buckets": {} 
    } 
+0

你可以顯示應該返回結果的示例文檔嗎? – Val

+0

我當然可以,我只是編輯後... ty – juanmeza

回答

0

我想通了......

由於該表是一個嵌套的對象,你需要做的過濾器的嵌套查詢:

ExistsFilterBuilder filter=FilterBuilders.existsFilter("guides"); 
NestedFilterBuilder nested=FilterBuilders.nestedFilter("guides", filter); 
QueryBuilder qb = QueryBuilders.filteredQuery(QueryBuilders.matchAllQuery(),nested); 
TermsBuilder tbBrand = AggregationBuilders.terms("brand-ag").field("brand.name.name.raw").order(Terms.Order.term(true)).size(0); 

SearchResponse sr = esClient.prepareSearch("cellphones").setTypes("cellphone").setQuery(qb) 
      .addAggregation(tbBrand).execute().actionGet();