我是 Elastic 和 spring-data-elastic 的新手。我一直在此处和网络的其他区域进行搜索,但到目前为止尚未找到我的问题的答案。我希望 SO 能够提供帮助。
我正在为我的Users
表(名字、姓氏)中的一些记录建立索引,并且希望能够允许高级搜索。例如,如果我的名字是“Frances”并且我输入“Frank”,那么系统足够聪明,可以返回记录。对于“Robinson”和“Robinsen”等也是如此。
我已将 POJO 设置为以下内容:
Public Users {
@Field(fieldType = FieldType.String)
private String firstName;
@Field(fieldType = FieldType.String)
private String lastName
// mutators
...
}
目前,我正在使用 spring-data-elastic ElasticRepository
进行搜索,我相信如果我要允许高级搜索,可能需要更改它。一种选择是直接在 UserService
中使用 EntityManager
或 Template
,但我还不知道如何去做。 .
正如我所描述的问题,这是索引问题还是搜索问题,或者可能两者兼而有之?我并不是在寻找任何人来做这项工作,只是为了给我指明正确的方向。
谢谢!
最佳答案
首先,不支持自动模糊查询生成,据documentation tells
因此我们必须使用自定义存储库方法添加。
假设您的基础存储库是
@Repository
public interface UserRepository extends CrudRepository<UserEntity, Long>
您必须创建一个自定义存储库接口(interface)来添加自定义方法(这就是 standard Spring data ,没有什么特别的)
public interface UserRepositoryCustom {
public List<User> findFuzzyByLastNameAndFirstName(String firstName, String lastName);
}
并让你的历史仓库实现这个接口(interface),即:
@Repository
public interface UserRepository extends CrudRepository<UserEntity, Long>, UserRepositoryCustom
现在,您需要以某种方式实现您的“自定义”界面。这很简单(再次查看手册,您必须遵守命名方案,以便 Spring 可以在运行时连接接口(interface)和实现):
public class UserRepositoryCustomImpl implements UserRepositoryCustom {
@Autowired protected ElasticsearchTemplate elasticsearchTemplate;
public List<User> findFuzzyByLastNameAndFirstName(String firstName, String lastName) {
Criteria c = new Criteria("firstName").fuzzy(firstName).and(new Criteria("lastName").fuzzy(lastName));
return elasticsearchTemplate.queryForList(new CriteriaQuery(c), CandidateEntity.class);
}
}
重新编译,重新启动,您应该能够让您的存储库像这样进行模糊搜索。
然后(请参阅问题评论),您可能还想将查询定义为字符串,并且不需要自定义实现。这取决于你。
关于java - 如何使用 Spring-data-elastic 查询 Elastic,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39790434/