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

How to query Elastic with Spring-data-elastic

我是 Elastic 和 spring-data-elastic 的新手。我一直在此处和网络的其他区域进行搜索,但到目前为止一直无法找到我的问题的答案。我希望 SO 可以提供帮助。

我正在为我的 Users table(名字,姓氏)中的一些记录编制索引,我希望能够进行高级搜索。因此,例如,如果我的名字是 'Frances',然后我输入 'Frank',那么系统足够智能,可以 return 记录。 '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 中使用 EntityManagerTemplate,但我还不确定如何去做。

正如我所描述的问题,这是索引问题还是搜索问题,或者两者都有?我不是在找任何人来做这项工作,只是为了给我指明正确的方向。

谢谢!

首先不支持自动生成模糊查询,至于documentation tells

所以我们将不得不使用自定义存储库方法添加。

假设您的基础存储库是

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

您必须创建一个自定义存储库界面来添加您的自定义方法(这就是全部 standard Spring data,没有什么特别的)

public interface UserRepositoryCustom {
    public List<User> findFuzzyByLastNameAndFirstName(String firstName, String lastName);
}

并让你的历史仓库实现这个接口,即:

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

现在,您需要以某种方式实现 "custom" 接口。这很容易(再次查看手册,您必须遵守命名方案,以便 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);
    }
}

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

再一次(参见问题评论),您可能还想将查询定义为字符串,并且不需要自定义实现。这由你决定。

您也可以通过@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);
}