gpt4 book ai didi

java - 我如何保留我的距离表示得分字段并将其映射到我的结果实体中?

转载 作者:行者123 更新时间:2023-12-01 19:35:02 26 4
gpt4 key购买 nike

我正在使用以下查询:

NativeSearchQuery nsq = new NativeSearchQueryBuilder()
.withQuery(qb)
.withPageable(PageRequest.of(page, PAGE_SIZE))
.withSort(sb)
.build();

使用以下 SortBuilder:

SortBuilders.geoDistanceSort("customer.address.geoLocation",
customer.getAddress().getGeoLocation().toGeoPoint())
.order(SortOrder.ASC)
.unit(DistanceUnit.KILOMETERS);

这会产生所需的排序查询:

"sort": [
{
"_geo_distance" : {
"customer.address.geoLocation" : [
{
"lat" : 40.4221663,
"lon" : -3.7148336
}
],
"unit" : "km",
"distance_type" : "arc",
"order" : "asc",
"validation_method" : "STRICT",
"ignore_unmapped" : false
}
}
]

此外,每个生成的文档都会返回到引用参数的距离(以公里为单位):

"sort": [2.4670609224864997]

我需要这个值作为我的域的一部分,但我根本无法将其插入我的对象中。我尝试了一种简单的方法,将其定义为我的域,就像一个 float[] 但我总是得到 null。我正在使用 Jackson 进行(反)序列化。

  private float[] sort;

public float[] getSort() {
return this.sort;
}

public void setSort(float[] score) {
this.sort = score;
}

我的存储库:

  public interface ElasticsearchProductRepository 
extends ElasticsearchRepository<Product, String> {
Page<Product> search(SearchQuery searchQuery);
}

产品:

@Entity
@Table(name = "product")
@Document(indexName = "product", createIndex = true, type = "_doc")
@Setting(settingPath = "elasticsearch/product-index.json")
@DynamicTemplates(mappingPath = "elasticsearch/product-dynamic-templates.json")
public class Product {

...

@org.springframework.data.annotation.Id
@javax.persistence.Id
@GeneratedValue(strategy = GenerationType.AUTO)
@JsonView(ResponseView.class)
private long id;

@Field(analyzer = "autocomplete", type = FieldType.Text, searchAnalyzer="standard")
@JsonView(CreationRequestView.class)
private String productName;
private float[] sort;

...

public float[] getSort() {
return this.sort;
}

public void setSort(float[] score) {
this.sort = score;
}

}

我添加了以下脚本字段:

  "script_fields": {
"distance": {
"script": {
"lang": "painless",
"source": "doc['sort']",
"params": {
}
}
}

}

但它没有找到排序字段。

“reason”:“在类型 [] 的映射中找不到 [sort] 的字段”

看起来 doc 实际上引用了 doc._source...我如何从 Elastic 脚本中引用这段很棒的数据?

最佳答案

当前在 Spring Data Elasticsearch 中,返回的实体是根据 _source 字段中返回的值填充的。返回的排序不是其中的一部分,而是每个搜索命中返回的附加信息的一部分。

对于下一个版本(4.0),我们目前正在重写如何处理返回的点击。下一个版本将有 SearchHit<T>类在T是实体域类,SearchHit对象包含该实体以及其他信息,如分数、突出显示、脚本字段、排序等。

计划存储库方法可以返回这些 SearchHit 的列表或页面。对象。

但目前,查询的排序将导致排序返回,但您无法检索排序值本身 - 在您的情况下这很糟糕,因为它们是动态计算的。

编辑:

您可以通过在实体中定义 geo_distance 属性来检索该值,并使用 @ScriptedField 对其进行注释。注释,然后在 native 查询中提供脚本。可以在 tests for Spring Data Elasticsearch 中找到示例。 。此示例适用于 ElaticsearchTemplate ,但是将此查询传递到存储库搜索方法应该没有什么区别。

编辑2019年12月25日:

当前的 master 分支(将成为 Spring Data Elasticsearch 4.0)已实现此功能。找到的文档返回到 SearchHit还包含 sortValues 的对象。

关于java - 我如何保留我的距离表示得分字段并将其映射到我的结果实体中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59229450/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com