如何使用 elasticsearch 和 spring-boot (springframework.data.elasticsearch) return 距离和所有字段
How to return distance and all fields using elasticsearch and spring-boot (springframework.data.elasticsearch)
我找到了一种使用 elasticsearch 查询获取数据的方法。但我目前的问题是在 spring 引导查询中翻译它。
我的查询如下:
{
"from": 0,
"size": 10,
"query": {
"bool": {
"should": [
{
"constant_score": {
"filter": {
"term": {
"my_field": "my_value"
}
},
"boost": 10
}
},
{
"constant_score": {
"filter": {
"term": {
"my_field": "my_value"
}
},
"boost": 8
}
}
],
"filter": [
{
"terms": {
"my_array_field": [
"first_value",
"second_value"
]
}
},
{
"geo_distance": {
"distance": "10km",
"location": {
"lat": 40,
"lon": 2
}
}
}
]
}
},
"script_fields": {
"distance": {
"script": "doc['location'].arcDistance(40, 2) / 1000"
}
},
"_source": true,
"sort": [
{
"_score": "desc"
}
]
}
索引中存储的所有文档都有一个字段 location
,类型定义为 geo_point
我的问题是:
如何使用 spring-boot.return 翻译 script_fields
,这是 return 告诉我的距离。
我当前的代码是:
BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder();
NativeSearchQuery nativeSearchQuery = new NativeSearchQueryBuilder()
.withQuery(boolQueryBuilder)
.withPageable(PageRequest.of(page, size))
.build();
elasticsearchOperations.search(nativeSearchQuery, MyIndexedDocument.class);
我尝试使用 here and saw an example here 中的 ScriptField,但目前没有找到任何解决方案。
- 我该如何使用它?
- 如果认为,在找到如何 return 距离之后,我将不得不精确地查询我想要 return 中的所有
_source
字段。是否可以使用 NativeSearchQuery
来精确它?
解决方法
如果有人有更好的答案,我会在没有任何经过验证的答案的情况下提出问题。
如果这是一个与某人相关的问题,我最终选择使用地理距离排序来处理距离 return。
查询是这样的:
{
"from": 0,
"size": 10,
"query": {
"bool": {
"should": [
{
"constant_score": {
"filter": {
"term": {
"my_field": "my_value"
}
},
"boost": 10
}
},
{
"constant_score": {
"filter": {
"term": {
"my_field": "my_value"
}
},
"boost": 8
}
}
],
"filter": [
{
"terms": {
"my_array_field": [
"first_value",
"second_value"
]
}
},
{
"geo_distance": {
"distance": "10km",
"location": {
"lat": 40,
"lon": 2
}
}
}
]
}
},
"sort" : [
{ "_score": "desc"},{
"_geo_distance": {
"location": {
"lat": 40,
"lon": 2
},
"order": "asc",
"unit": "km",
"mode": "min",
"distance_type": "arc",
"ignore_unmapped": true
}
}
]
}
所以我可以在 return 中获取我的距离,但不是作为 content 的字段,而是作为 sortvalues[=30] 中的值=]
使用spring数据弹性搜索:
BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder();
ScoreSortBuilder scoreSortBuilder = new ScoreSortBuilder();
GeoDistanceSortBuilder geoDistanceSortBuilder = new GeoDistanceSortBuilder("location", Double.parseDouble(location.getLatitude()), Double.parseDouble(location.getLongitude()));
geoDistanceSortBuilder.unit(DistanceUnit.KILOMETERS);
geoDistanceSortBuilder.ignoreUnmapped(true);
geoDistanceSortBuilder.sortMode(SortMode.MIN);
geoDistanceSortBuilder.order(SortOrder.ASC);
NativeSearchQuery nativeSearchQuery = new NativeSearchQueryBuilder()
.withQuery(boolQueryBuilder)
.withPageable(PageRequest.of(page, size))
.withSort(scoreSortBuilder)
.withSort(geoDistanceSortBuilder)
.build();
elasticsearchOperations.search(nativeSearchQuery, MyIndexedDocument.class);
您可以使用注解@ScriptedField
我找到了一种使用 elasticsearch 查询获取数据的方法。但我目前的问题是在 spring 引导查询中翻译它。
我的查询如下:
{
"from": 0,
"size": 10,
"query": {
"bool": {
"should": [
{
"constant_score": {
"filter": {
"term": {
"my_field": "my_value"
}
},
"boost": 10
}
},
{
"constant_score": {
"filter": {
"term": {
"my_field": "my_value"
}
},
"boost": 8
}
}
],
"filter": [
{
"terms": {
"my_array_field": [
"first_value",
"second_value"
]
}
},
{
"geo_distance": {
"distance": "10km",
"location": {
"lat": 40,
"lon": 2
}
}
}
]
}
},
"script_fields": {
"distance": {
"script": "doc['location'].arcDistance(40, 2) / 1000"
}
},
"_source": true,
"sort": [
{
"_score": "desc"
}
]
}
索引中存储的所有文档都有一个字段 location
,类型定义为 geo_point
我的问题是:
如何使用 spring-boot.return 翻译 script_fields
,这是 return 告诉我的距离。
我当前的代码是:
BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder();
NativeSearchQuery nativeSearchQuery = new NativeSearchQueryBuilder()
.withQuery(boolQueryBuilder)
.withPageable(PageRequest.of(page, size))
.build();
elasticsearchOperations.search(nativeSearchQuery, MyIndexedDocument.class);
我尝试使用 here and saw an example here 中的 ScriptField,但目前没有找到任何解决方案。
- 我该如何使用它?
- 如果认为,在找到如何 return 距离之后,我将不得不精确地查询我想要 return 中的所有
_source
字段。是否可以使用NativeSearchQuery
来精确它?
解决方法
如果有人有更好的答案,我会在没有任何经过验证的答案的情况下提出问题。
如果这是一个与某人相关的问题,我最终选择使用地理距离排序来处理距离 return。
查询是这样的:
{
"from": 0,
"size": 10,
"query": {
"bool": {
"should": [
{
"constant_score": {
"filter": {
"term": {
"my_field": "my_value"
}
},
"boost": 10
}
},
{
"constant_score": {
"filter": {
"term": {
"my_field": "my_value"
}
},
"boost": 8
}
}
],
"filter": [
{
"terms": {
"my_array_field": [
"first_value",
"second_value"
]
}
},
{
"geo_distance": {
"distance": "10km",
"location": {
"lat": 40,
"lon": 2
}
}
}
]
}
},
"sort" : [
{ "_score": "desc"},{
"_geo_distance": {
"location": {
"lat": 40,
"lon": 2
},
"order": "asc",
"unit": "km",
"mode": "min",
"distance_type": "arc",
"ignore_unmapped": true
}
}
]
}
所以我可以在 return 中获取我的距离,但不是作为 content 的字段,而是作为 sortvalues[=30] 中的值=]
使用spring数据弹性搜索:
BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder();
ScoreSortBuilder scoreSortBuilder = new ScoreSortBuilder();
GeoDistanceSortBuilder geoDistanceSortBuilder = new GeoDistanceSortBuilder("location", Double.parseDouble(location.getLatitude()), Double.parseDouble(location.getLongitude()));
geoDistanceSortBuilder.unit(DistanceUnit.KILOMETERS);
geoDistanceSortBuilder.ignoreUnmapped(true);
geoDistanceSortBuilder.sortMode(SortMode.MIN);
geoDistanceSortBuilder.order(SortOrder.ASC);
NativeSearchQuery nativeSearchQuery = new NativeSearchQueryBuilder()
.withQuery(boolQueryBuilder)
.withPageable(PageRequest.of(page, size))
.withSort(scoreSortBuilder)
.withSort(geoDistanceSortBuilder)
.build();
elasticsearchOperations.search(nativeSearchQuery, MyIndexedDocument.class);
您可以使用注解@ScriptedField