java中存在elasticsearch筛选器
我有个问题。。。 如果字段有任何值,我想使用java中存在elasticsearch筛选器,java,
elasticsearch,Java,
elasticsearch,我有个问题。。。 如果字段有任何值,我想使用exists过滤器和我的java查询中的聚合来获得结果。这是一个嵌套数组,所以我想得到数组中有任何值的元素。 在我的java代码中,我有: ExistsFilterBuilder filter=FilterBuilders.existsFilter("guides"); QueryBuilder qb = QueryBuilders.filteredQuery(QueryBuilders.matchAllQuery(),filter); TermsBu
exists
过滤器和我的java查询中的聚合来获得结果。这是一个嵌套数组,所以我想得到数组中有任何值的元素。
在我的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();
我的对象类将字段“guides”作为嵌套对象:
@Field(type = FieldType.Nested)
private List<EquipoVideoTutorialDTO> guides;
这将返回一个空数组,但我知道我至少有1项
此查询的结果如下:
{
"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": {}
}
我想出来了
由于列表是嵌套对象,因此需要对过滤器执行嵌套查询:
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();
你能展示一个应该在结果中返回的示例文档吗?我当然可以,我刚刚编辑了这篇文章。。。泰
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();