Dan*_*Dan 2 java fuzzy-search elasticsearch spring-data spring-data-elasticsearch
我是Elastic和spring-data-elastic的新手.我一直在这里和网络的其他方面搜索,但到目前为止一直无法找到我的问题的答案.我希望SO能够提供帮助.
我正在从我的Users
表(firstName,lastName)索引一些记录,我希望能够允许高级搜索.因此,例如,如果我有'Frances'这个名字并输入'Frank',那么系统足够智能以返回记录.同样适用于'罗宾逊'和'罗宾森'等.
我已将我的POJO设置为以下内容:
Public Users {
@Field(fieldType = FieldType.String)
private String firstName;
@Field(fieldType = FieldType.String)
private String lastName
// mutators
...
}
Run Code Online (Sandbox Code Playgroud)
目前我正在使用spring-data-elastic ElasticRepository
进行搜索,如果我允许进行高级搜索,我认为可能需要更改.一种选择是使用EntityManager
或Template
直接使用UserService
,但我不知道该怎么做呢.
正如我所描述的那样,这是一个索引问题还是搜索问题,或者可能两者兼而有之?我不是在寻找任何人来做这项工作,只是为了指出我正确的方向.
谢谢!
首先,就文档所述,不支持自动模糊查询生成
所以我们必须使用自定义存储库方法添加.
说你的基础存储库是
@Repository
public interface UserRepository extends CrudRepository<UserEntity, Long>
Run Code Online (Sandbox Code Playgroud)
您将不得不创建一个自定义存储库接口来添加自定义方法(这是所有标准的Spring数据,没什么特别的)
public interface UserRepositoryCustom {
public List<User> findFuzzyByLastNameAndFirstName(String firstName, String lastName);
}
Run Code Online (Sandbox Code Playgroud)
并使您的历史回购实现此接口,即:
@Repository
public interface UserRepository extends CrudRepository<UserEntity, Long>, UserRepositoryCustom
Run Code Online (Sandbox Code Playgroud)
现在,您需要以某种方式实现"自定义"界面.这很容易(再一次看到手册,你必须尊重命名方案,以便Spring可以在运行时连接接口和实现):
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);
}
}
Run Code Online (Sandbox Code Playgroud)
重新编译,重新启动,您应该能够让您的存储库像这样进行模糊搜索.
然后再次(请参阅问题注释),您可能还希望将查询定义为String,并且您不需要自定义实现.这取决于你.
归档时间: |
|
查看次数: |
2246 次 |
最近记录: |