我是Elastic和spring-data- elastic的新手。我一直在这里和网络的其他区域进行搜索,但到目前为止,仍找不到我的问题的答案。我希望SO能够提供帮助。
我正在索引Users表中的一些记录(firstName,lastName),并且希望能够允许高级搜索。因此,例如,如果我的名字是“ Frances”,并且输入“ Frank”,那么系统足够智能,可以返回记录。与“鲁宾逊”和“鲁宾森”等相同。
Users
我将POJO设置为以下内容:
Public Users { @Field(fieldType = FieldType.String) private String firstName; @Field(fieldType = FieldType.String) private String lastName // mutators ... }
目前,我正在使用弹簧弹性数据进行ElasticRepository搜索,我认为如果允许高级搜索,可能必须更改。一种选择是直接在中使用EntityManager或,但是我不确定该怎么做。Template``UserService
ElasticRepository
EntityManager
Template``UserService
正如我已经描述的问题,这是索引问题还是搜索问题,或者可能两者兼而有之?我不是在找任何人做这项工作,只是为了指出正确的方向。
谢谢!
首先,就文档而言,不支持自动模糊查询生成
因此,我们将不得不使用自定义存储库方法。
假设您的基本存储库是
@Repository public interface UserRepository extends CrudRepository<UserEntity, Long>
您必须创建一个Custom仓库接口来添加您的自定义方法(这是所有标准Spring数据,没什么特别的)
public interface UserRepositoryCustom { public List<User> findFuzzyByLastNameAndFirstName(String firstName, String lastName); }
并让您的历史存储库实现此接口,即:
@Repository public interface UserRepository extends CrudRepository<UserEntity, Long>, UserRepositoryCustom
现在,您将需要以某种方式实现“自定义”界面。这很容易(再次参见手册,您必须遵守命名方案,以便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); } }
重新编译,重新启动,您应该能够使您的存储库像这样进行模糊搜索。
再一次(请参阅问题注释),您可能还希望将查询定义为字符串,并且不需要自定义实现。这取决于你。