我对弹性和弹簧数据弹性很陌生。我一直在搜索这里和其他领域的网站,但到目前为止,一直未能找到我的问题的答案。我希望这样也许能帮上忙。
我正在从我的Users表(firstName,lastName)中索引一些记录,我希望能够允许高级搜索。因此,例如,如果我有‘弗朗西斯’的名字,我输入‘弗兰克’,那么系统是足够聪明的返回记录。罗宾逊和罗宾森等也是如此。
我已经将我的POJO设置为:
Public Users {
@Field(fieldType = FieldType.String)
private String firstName;
@Field(fieldType = FieldType.String)
private String lastName
// mutators
...
}目前,我正在使用弹簧数据弹性ElasticRepository进行我的搜索,我相信,如果我要允许高级搜索,这可能必须改变。一种选择是直接在EntityManager或Template中使用UserService,但是我还不确定如何做到这一点。
正如我所描述的问题,这是索引问题还是搜索问题,或者两者兼而有之?我不是在找人来做这项工作,只是为了给我指明正确的方向。
谢谢!
发布于 2016-09-30 13:49:15
首先,就文档说明而言,不支持自动模糊查询生成。
因此,我们将不得不使用自定义存储库方法添加。
假设您的基本存储库是
@Repository
public interface UserRepository extends CrudRepository<UserEntity, Long>您必须创建一个自定义存储库接口来添加自定义方法(这完全是标准弹簧数据,没有什么特别的)
public interface UserRepositoryCustom {
public List<User> findFuzzyByLastNameAndFirstName(String firstName, String lastName);
}并使您的历史回购实现此接口,即:
@Repository
public interface UserRepository extends CrudRepository<UserEntity, Long>, UserRepositoryCustom现在,您需要以某种方式实现“自定义”接口。这很容易(再次查看手册,您必须尊重命名方案,以便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);
}
}重新编译、重新启动,您应该能够让您的存储库像这样进行模糊搜索。
再说一遍(请参阅问题注释),您也可能希望将查询定义为字符串,并且不需要自定义实现。这取决于你。
发布于 2018-10-16 12:09:54
您还可以通过@Query注释访问搜索引擎:
public interface UserRepository extends ElasticsearchRepository<Users, String> {
@Query("{\"multi_match\": {\"query\": \"?0\", \"fields\": [\"firstName\", \"lastName\"], \"fuzziness\": \"AUTO\"}}")
Page<Users> find(String q, Pageable pageable);
}https://stackoverflow.com/questions/39790434
复制相似问题