一尘不染

如何用Spring-data-elastic查询Elastic

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
    ...

 }

目前,我正在使用弹簧弹性数据进行ElasticRepository搜索,我认为如果允许高级搜索,可能必须更改。一种选择是直接在中使用EntityManager或,但是我不确定该怎么做。Template``UserService

正如我已经描述的问题,这是索引问题还是搜索问题,或者可能两者兼而有之?我不是在找任何人做这项工作,只是为了指出正确的方向。

谢谢!


阅读 267

收藏
2020-06-22

共1个答案

一尘不染

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

因此,我们将不得不使用自定义存储库方法。

假设您的基本存储库是

@Repository
public interface UserRepository extends CrudRepository<UserEntity, Long>

您必须创建一个Custom仓库接口来添加您的自定义方法(这是所有标准Spring数据,没什么特别的)

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);
    }
}

重新编译,重新启动,您应该能够使您的存储库像这样进行模糊搜索。

再一次(请参阅问题注释),您可能还希望将查询定义为字符串,并且不需要自定义实现。这取决于你。

2020-06-22