我是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
中使用Template
或UserService
,但我还不知道该如何去做。
正如我所描述的那样,这是一个索引问题或搜索问题,还是可能两者兼而有之?我没有找任何人去做这项工作,只是为了指出我正确的方向。
谢谢!
答案 0 :(得分:5)
因此我们必须使用自定义存储库方法添加。
说你的基础资源库是
@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);
}