如何使用Spring-data-elastic查询Elastic

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进行搜索,如果我允许进行高级搜索,我认为可能需要更改.一种选择是使用EntityManagerTemplate直接使用UserService,但我不知道该怎么做呢.

正如我所描述的那样,这是一个索引问题还是搜索问题,或者可能两者兼而有之?我不是在寻找任何人来做这项工作,只是为了指出我正确的方向.

谢谢!

GPI*_*GPI 5

首先,就文档所述,不支持自动模糊查询生成

所以我们必须使用自定义存储库方法添加.

说你的基础存储库是

@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,并且您不需要自定义实现.这取决于你.