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

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

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

我正在为我的Users 表(名字、姓氏)中的一些记录建立索引,并且希望能够允许高级搜索。例如,如果我的名字是“Frances”并且我输入“Frank”,那么系统足够聪明,可以返回记录。对于“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>

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

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

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

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

现在,您需要以某种方式实现您的“自定义”界面。这很简单(再次查看手册,您必须遵守命名方案,以便 Spring 可以在运行时连接接口(interface)和实现):

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

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

然后(请参阅问题评论),您可能还想将查询定义为字符串,并且不需要自定义实现。这取决于你。

关于java - 如何使用 Spring-data-elastic 查询 Elastic,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39790434/

相关文章:

java - 无法从类中获取 int 值到另一个类 : android studio

java - Camel JMS 事务处理不起作用

java - 只需要熟悉 HTTPClient 的人检查一段代码

c# - Elasticsearch/Nest - 将 MatchPhrase 与 OnFieldsWithBoost 结合使用

spring-data - spring data elasticsearch - 使用配置文件进行设置

java - 当 OneToOne 关系与 MapsId 映射时,findAll() 方法不返回最近插入的记录

java - 在 PHP 页面上发送字符串的方法

elasticsearch - 为什么弹性索引存储大小增加而更新的索引不插入?

php - Elasticsearch-php查询

Spring Data CrudRepository 的保存抛出 InvocationTargetException