1

我是弹性和弹簧数据弹性的新手。我一直在这里和网络的其他领域寻找,但到目前为止一直无法找到我的问题的答案。我希望SO可以提供帮助。如何用弹簧数据弹性查询弹性

我索引从我Users表(名字,姓氏)一些记录,我希望能够让高级搜索。例如,如果我有'Frances'这个名字,并且输入'Frank',那么这个系统足够聪明,可以返回记录。同为“臣”和“Robinsen”等

我设置我的POJO是以下几点:

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

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

    // mutators 
    ... 

} 

目前我使用的是弹簧数据弹性ElasticRepository做我的搜索,如果我准备进行高级搜索,我相信这可能会改变。一种选择是直接在UserService中使用EntityManagerTemplate,但我不确定如何去做。

正如我所描述的问题,这是一个索引问题或搜索问题或可能两者?我不是在寻找任何人来完成这项工作,只是为了让我指向正确的方向。

谢谢!

+0

你吃过看看http://docs.spring.io/spring-data/elasticsearch/docs/current/reference/html/#elasticsearch.query-methods? 顺便说一句,EntityManager是JPA的概念,而不是elasticsearch,所以在这个方向上搜索没有意义。 – GPI

+0

你是对的,这是一个JPA的概念,所以它不适合这里。我已阅读您链接到的文档,但我仍然不知道如何设置它以允许模糊逻辑。这是一个查询问题吗?索引问题?我是否需要更改我的域名实体? – Dan

+0

快速搜索不提供从方法名称生成自动*模糊*查询的方法,但您始终可以使用[基于条件](http://docs.spring.io/spring-data/elasticsearch/docs /current/api/org/springframework/data/elasticsearch/core/query/Criteria.html#fuzzy-java.lang.String-)ones或[hand written](http://docs.spring.io/spring-data /elasticsearch/docs/current/reference/html/#elasticsearch.query-methods.at-query)。 – GPI

回答

3

首先,有没有自动模糊查询生成支持,至于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 

现在,您需要以某种方式实现您的“自定义”界面。这是很容易(再次看到手册,你必须尊重命名方案,使弹簧可以线在运行时接口和实现):

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

重新编译,重新开张,你应该可以有你的版本库像这样的模糊搜索。

话又说回来(见问题的意见),你可能还需要定义查询作为一个字符串,你就不需要自定义实现。这取决于你。