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

时间:2016-09-30 11:25:54

标签: java elasticsearch spring-data fuzzy-search spring-data-elasticsearch

我是Elastic和spring-data-elastic的新手。我一直在这里和网络的其他方面搜索,但到目前为止一直无法找到我的问题的答案。我希望SO能够提供帮助。

我正在从我的Users表(firstName,lastName)索引一些记录,我希望能够允许高级搜索。例如,如果我有名字' Frances'然后我进入了弗兰克'那么系统足够聪明,可以返回记录。同样适用于罗宾逊'和'罗宾森等等

我已将我的POJO设置为以下内容:

Public Users {
    @Field(fieldType = FieldType.String)
    private String firstName;

    @Field(fieldType = FieldType.String)
    private String lastName

    // mutators
    ...

 }

目前我正在使用弹簧数据弹性ElasticRepository进行搜索,如果我允许进行高级搜索,我认为可能需要更改。一种选择是直接在EntityManager中使用TemplateUserService,但我还不知道该如何去做。

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

谢谢!

2 个答案:

答案 0 :(得分:5)

首先,就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

现在,您需要实施&#34; custom&#34;接触不知何故。这很容易(再一次看到手册,你必须尊重命名方案,以便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);
    }
}

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

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

答案 1 :(得分:0)

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