Spring 数据弹性搜索嵌套字段和 NativeSearchQueryBuilder.withFields
Spring Data Elastic Search Nested Field and NativeSearchQueryBuilder.withFields
当我使用 NativeSearchQueryBuilder.withFields(...) 方法时,我似乎无法将嵌套字段设置为 return。
这是我的父对象:
@Document(indexName = "inventory")
public class Inventory
{
@Id
private String id;
@Field(type=FieldType.String)
private String name;
@Field(type=FieldType.Nested, index=FieldIndex.not_analyzed, store=true)
private List<Model> models;
}
这是嵌套对象:
public class Model
{
@Field(type=FieldType.String, index=FieldIndex.not_analyzed, store=true)
private String model;
@Field(type=FieldType.String, index=FieldIndex.not_analyzed, store=true)
private Set<String> series;
}
和查询
NativeSearchQueryBuilder nativeSearchQueryBuilder = new NativeSearchQueryBuilder();
nativeSearchQueryBuilder.withQuery(QueryBuilders.matchAllQuery());
nativeSearchQueryBuilder.withFields("models.series");
NativeSearchQuery nativeSearchQuery = nativeSearchQueryBuilder.build();
FacetedPage<Inventory> results = inventoryRepository.search(nativeSearchQuery);
结果总元素 = 529
但是内容中的每个对象看起来像这样(JSON 格式):
{
"id":"d5f82880-15bc-45ed-8abb-ff97d0e45da9",
"name": null,
"models": null
}
如果我删除 withFields(...) 设置,我会返回:
{
"id":"d5f82880-15bc-45ed-8abb-ff97d0e45da9",
"name": "Cool Beans",
"models": [
{
"model" : "foo",
"series" : ["bar"]
}
]
}
我试过模型,models.model,models.series,模型,系列。我无法将 withFields 与 NestedFields 一起使用。
有什么想法吗?
我对弹性搜索字段的理解是错误的。 rahulroc 告诉我。
withFields 与源过滤不同。
https://www.elastic.co/guide/en/elasticsearch/reference/current/search-request-fields.html
所以我有效地告诉 Spring Data ES 这样做:
curl localhost:9200/inventory/_search?pretty=true -d '
{
"fields" : ["models.series"],
"query" : {
"match" : {"name" : "cool"}
}
}'
当这就是我想要的
curl localhost:9200/inventory/_search?pretty=true -d '
{
"_source" : ["models.series"],
"query" : {
"match" : {"name" : "cool"}
}
}'
在我开始添加 NestedFields 之前,withFields 方法适用于我所做的事情。我正在使用的 Spring Data ES 的当前实现不支持源过滤。
源过滤最近刚刚添加到 Spring Data ES 2.0.0.RC1
当我使用 NativeSearchQueryBuilder.withFields(...) 方法时,我似乎无法将嵌套字段设置为 return。
这是我的父对象:
@Document(indexName = "inventory")
public class Inventory
{
@Id
private String id;
@Field(type=FieldType.String)
private String name;
@Field(type=FieldType.Nested, index=FieldIndex.not_analyzed, store=true)
private List<Model> models;
}
这是嵌套对象:
public class Model
{
@Field(type=FieldType.String, index=FieldIndex.not_analyzed, store=true)
private String model;
@Field(type=FieldType.String, index=FieldIndex.not_analyzed, store=true)
private Set<String> series;
}
和查询
NativeSearchQueryBuilder nativeSearchQueryBuilder = new NativeSearchQueryBuilder();
nativeSearchQueryBuilder.withQuery(QueryBuilders.matchAllQuery());
nativeSearchQueryBuilder.withFields("models.series");
NativeSearchQuery nativeSearchQuery = nativeSearchQueryBuilder.build();
FacetedPage<Inventory> results = inventoryRepository.search(nativeSearchQuery);
结果总元素 = 529 但是内容中的每个对象看起来像这样(JSON 格式):
{
"id":"d5f82880-15bc-45ed-8abb-ff97d0e45da9",
"name": null,
"models": null
}
如果我删除 withFields(...) 设置,我会返回:
{
"id":"d5f82880-15bc-45ed-8abb-ff97d0e45da9",
"name": "Cool Beans",
"models": [
{
"model" : "foo",
"series" : ["bar"]
}
]
}
我试过模型,models.model,models.series,模型,系列。我无法将 withFields 与 NestedFields 一起使用。
有什么想法吗?
我对弹性搜索字段的理解是错误的。 rahulroc 告诉我。
withFields 与源过滤不同。
https://www.elastic.co/guide/en/elasticsearch/reference/current/search-request-fields.html
所以我有效地告诉 Spring Data ES 这样做:
curl localhost:9200/inventory/_search?pretty=true -d '
{
"fields" : ["models.series"],
"query" : {
"match" : {"name" : "cool"}
}
}'
当这就是我想要的
curl localhost:9200/inventory/_search?pretty=true -d '
{
"_source" : ["models.series"],
"query" : {
"match" : {"name" : "cool"}
}
}'
在我开始添加 NestedFields 之前,withFields 方法适用于我所做的事情。我正在使用的 Spring Data ES 的当前实现不支持源过滤。
源过滤最近刚刚添加到 Spring Data ES 2.0.0.RC1