我使用的是Spring Boot 2.1.6和Elasticsearch 6.2.2
编辑以更好地澄清我的问题:
当我让Spring在我的存储库中使用以下方法为我生成查询时:
Account findTop1ByAccountIdOrderByCreatedDesc(final String accountId);
我想这意味着它将从索引中选择,然后按创建的降序排列结果,最后它将只返回第一个(最新)结果。
但索引中只有两个条目,相同的条目减去创建日期,该查询返回两个结果。我认为这意味着它不会转化为我所想的,而是会选择具有该ID的所有帐户(因为这是一个键,所有帐户都是“顶部”),按降序排列。
这将更符合我的查询,但这不是合法的命名:
Account findTop1OrderByCreatedDescByAccountId(final String accountId);
org.springframework.data.mapping.PropertyReferenceException: No property descByAccountId found for type LocalDateTime! Traversed path: Account.created.
还有这个:
Account findTop1OrderByCreatedDescAndAccountIdEquals(final String accountId);
org.springframework.data.mapping.PropertyReferenceException: No property desc found for type LocalDateTime! Traversed path: Account.created.
那么,如果可能的话,如何将我的查询转换为Spring存储库魔术呢?
/EDIT
原问题:
我有一个这样声明的POJO(修剪版本):
@Document(indexName = "config.account", type = "account")
public class Account{
@Id
private String id;
@Field(type = FieldType.Text)
@JsonProperty("ilmAccountIdentifier")
private String accountId;
@Field(type = FieldType.Text)
private String endOfBusinessDay;
@Field(type = FieldType.Date)
private LocalDateTime created;
}
我想查询索引以检索给定帐户ID的最新条目(创建=max)。
我知道我可以使用查询生成器,但我想知道是否有一些魔法可以通过使用Spring命名查询为我做到这一点,目前我正在尝试(找不到其他有效的措辞组合):
Account findTop1ByAccountIdOrderByCreatedDesc(final String accountId);
但它返回null。我看到数据在索引中(修剪版):
Account(id=W83u0GsBEjwDhWt1-Whn,
accountId=testfindByAccountIdReturnsLatestVersion,
endOfBusinessDay=17:00:00,
created=2019-07-08T09:34)
但是Spring生成的查询很奇怪,不是我所期望的:
SearchRequest{
searchType=QUERY_THEN_FETCH,
indices=[config.account],
indicesOptions=IndicesOptions[ignore_unavailable=false, allow_no_indices=true, expand_wildcards_open=true, expand_wildcards_closed=false, allow_aliases_to_multiple_indices=true, forbid_closed_indices=true, ignore_aliases=false],
types=[account],
routing='null',
preference='null',
requestCache=null,
scroll=null,
maxConcurrentShardRequests=0,
batchedReduceSize=512,
preFilterShardSize=128,
allowPartialSearchResults=null,
source={
"from":0,
"query":{
"bool":{
"must":[{
"query_string":
{"query":
"testfindByAccountIdReturnsLatestVersion",
"fields": ["accountId^1.0"],
"type":"best_fields",
"default_operator":"and",
"max_determinized_states":10000,
"enable_position_increments":true,
"fuzziness":"AUTO",
"fuzzy_prefix_length":0,
"fuzzy_max_expansions":50,
"phrase_slop":0,
"escape":false,
"auto_generate_synonyms_phrase_query":true,
"fuzzy_transpositions":true,
"boost":1.0}
}],
"adjust_pure_negative":true,"boost":1.0}
}
,"version":true}}
我想要的是与此SQL查询等效的:
select *
from(
select *
from account
where accountId = ?
order by created desc
)
where rownum = 1
是否有可能使用Spring魔法,或者我必须使用QueryBuilder或我自己的逻辑?
谢谢,干杯
编辑
与此无关,但我意识到,如果在使用@JsonProperty映射期间重命名字段,spring存储库魔术就不起作用。假设我不进行重命名,问题仍然是一样的。目前,我通过实现自己的逻辑解决了这一问题:
@Repository
public interface AccountRepository extends ElasticsearchRepository<Account, String>, AccountRepositoryCustom {
List<Account> findByIlmAccountIdentifierOrderByCreatedDesc(final String accountId);
}
public interface AccountRepositoryCustom {
Account findLatestByAccountId(final String accountId);
}
@Repository
public class AccountRepositoryImpl implements AccountRepositoryCustom {
@Autowired
@Lazy
private AccountRepository accountRepository;
public Account findLatestByAccountId(final String accountId){
return accountRepository.findByIlmAccountIdentifierOrderByCreatedDesc(accountId).get(0);
}
}
对于从方法名称构建的查询,必须使用文档类中的属性名称,因此这里的findByAccountId是正确的。
问题确实是使用@JsonProperty
注释重命名索引中的此属性。该注释用于写入到索引的映射,据我回忆,在使用Temboard类而不是Repository类写入数据时也是如此。因此,存储库查询在索引中搜索字段帐户ID,而数据存储在字段ilmAccount tID中。
Spring Data Elasticsearch的3.2.0版(目前RC1、RC2将在本月晚些时候发布,GA应该在9月初发布)有一个新的Mapper实现,它可以在没有@JsonProperty
的情况下工作,只需使用@Field
注释:
@Field(name="ilmAccountIdentifier", type = FieldType.Text)
private String accountId;
但是3.2. x不适用于Elasticsearch 6.2,您需要更新到6.7。
作为一种解决方法,能否将accountId属性重命名为ilmAccountIdentifier?
编辑日期:2019年7月23日:
我刚刚发现,限制topN不工作的结果是Spring Data Elasticsearch中的一个老错误,似乎从未在这个子模块中实现过。所以请投票支持这个问题。
注:spring data elasticsearch是一个社区驱动的模块,所以我们靠贡献生活!
编辑28.11.2019:
我于2019年8月实施了topN,它将出现在Spring数据Elasticsearch Neumann发布(版本4)中
我有一个表,其中存储了里程碑(id、描述、日期),并且给定了一些事件日期,我希望找到最接近该日期的里程碑。 我正在使用Spring Data JPA,但我似乎不知道该怎么做。根据可用的函数,似乎没有任何本身可用的东西来查找最接近的日期。目前,我想到的最好的主意是使用原始sql,类似于 然后,我会在我的存储库上有一个函数,例如 我对这种方法的主要关注点是,我必须依赖于特定于DBMS的函数来执行日期差
我有一个扩展Elasticsearch chRepository的接口,并成功创建了搜索方法,例如: <代码>页面 现在,我希望找到一个endpoint,该endpoint将返回该customerCode的所有可能主机值,以便我可以在前端构建一个下拉列表,以选择要发送到该findByCustomerCodeAndHostendpoint的值,类似于: <代码>列表 使用ElasticsearchR
问题内容: 我存储的文档包含两个字段,即startDate和endDate。我想使用输入日期运行Elastic查询,并返回其startDate和endDate包含该日期的所有文档。例如, 如果我输入的日期为2015-01-02,则此文档应出现在结果中,因为输入的日期在开始日期和结束日期字段的范围内。 我可以使用一个字段进行范围查询,但由于范围仅接受一个,因此我不知道如何使用两个日期字段: 我还需要
问题内容: 我正在处理一个查询,其中需要查看患者去诊所时输入的患者生命体征(特别是血压)。我将获得2015年全年的结果,当然,某些患者曾多次就诊,我只需要查看最近一次就诊时输入的生命指标即可。另一个轻微的变化是收缩压和舒张压是分别输入的,因此我得到如下结果: 有26,000多个结果,因此显然我不想遍历每位患者并查看他们的最新结果是什么时候。我希望我的结果看起来像这样: 我知道出生的名字和日期,以后
我是elasticsearch的新手,尝试使用查询、日期直方图和facets从elasticsearch检索索引数据。我有elasticsearch和kibana在服务器上正常运行。现在,我想从elasticsearch中提取特定的索引数据,并在另一个自主开发的应用程序(SpringWeb应用程序)中将其绘制为图形。因此,考虑使用spring数据elasticsearch,但通过互联网找到了使用e
我正在尝试查询spring data elasticsearch存储库中的嵌套属性。我的存储库如下所示: 域对象Person和Address(无getter/setter)定义如下: 我的测试保存一个人的文档,并尝试使用repository方法读取它。但没有返回任何结果。以下是测试方法: spring data elasticsearch是否支持默认的spring数据查询生成?