如何使用 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
中使用 EntityManager
或 Template
,但我还不确定如何去做。
正如我所描述的问题,这是索引问题还是搜索问题,或者两者都有?我不是在找任何人来做这项工作,只是为了给我指明正确的方向。
谢谢!
首先不支持自动生成模糊查询,至于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);
}
我是 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
中使用 EntityManager
或 Template
,但我还不确定如何去做。
正如我所描述的问题,这是索引问题还是搜索问题,或者两者都有?我不是在找任何人来做这项工作,只是为了给我指明正确的方向。
谢谢!
首先不支持自动生成模糊查询,至于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);
}