下面是详细讲解“Springboot集成springdataelasticsearch过程详解”的完整攻略:
1. 确认环境和依赖
首先,我们需要确认一下环境和需要的依赖。假设我们已经有了一个Spring Boot项目,并且使用了Maven作为我们的构建工具。在pom.xml文件中,我们需要添加以下依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
<version>7.8.0</version>
</dependency>
还需要确认一下的是,我们需要装好Elasticsearch的服务,并在application.properties中配置好连接ES的地址、账号密码等信息。
2. 创建Elasticsearch的repository
在我们的Spring Boot项目中,我们创建一个新的repository来操作ES。首先,我们需要定义一个实体类,用来映射我们在ES中的数据结构:
@Data
@NoArgsConstructor
@AllArgsConstructor
@Document(indexName = "test")
public class User {
@Id
private String id;
private String name;
private Integer age;
}
这个实体类中,使用了几个注解:
- @Document:用来指定在ES中的索引名称。
- @Id:用来指定实体类中哪个字段作为ES中文档的ID。
接下来,我们创建一个repository来操作ES中的User文档:
@Repository
public interface UserRepository extends ElasticsearchRepository<User, String> {
List<User> findByName(String name);
}
这个repository中,继承了ElasticsearchRepository。这个接口中已经定义了很多基本的ES文档操作方法,我们只需要在这个接口中定义自己的查询方法即可。
3. 编写基本的增删改查测试
接下来,为了测试我们的ES集成是否正常,我们编写一些基本的增删改查测试:
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest
public class UserRepositoryTest {
@Autowired
private UserRepository userRepository;
@Test
public void save() {
User user = new User();
user.setId("1");
user.setName("Tom");
user.setAge(18);
userRepository.save(user);
}
@Test
public void delete() {
userRepository.deleteById("1");
}
@Test
public void update() {
User user = userRepository.findById("1").get();
user.setName("Jerry");
userRepository.save(user);
}
@Test
public void find() {
List<User> users = userRepository.findByName("Tom");
System.out.println(users);
}
}
在这些测试中,我们测试了添加、删除、更新、查询等基本操作。可以通过这些测试验证ES集成是否成功。
示例1:一个简单的文章搜索
下面,我们用一个示例来说明如何使用我们的repository来进行ES搜索。我们假设我们的系统中有一些文章,每篇文章都有标题和内容。我们需要实现一个功能:根据用户输入的关键字,搜索文章标题或内容中包含这个关键字的文章。我们可以使用ES的全文搜索功能来实现这个需求。
首先,我们定义一个Article实体类:
@Data
@NoArgsConstructor
@AllArgsConstructor
@Document(indexName = "article")
public class Article {
@Id
private String id;
private String title;
private String content;
}
然后,我们定义一个ArticleRepository,用来操作ES中的Article文档:
@Repository
public interface ArticleRepository extends ElasticsearchRepository<Article, String> {
Page<Article> findByTitleOrContent(String title, String content, Pageable pageable);
}
在这个repository中,我们定义了一个方法findByTitleOrContent,用来根据标题或内容进行搜索。这个方法使用了Spring Data的命名约定,可以自动地根据方法名和参数来生成ES的查询语句。
接下来,我们可以在我们的controller中使用这个repository来实现搜索功能:
@RestController
@RequestMapping("/articles")
public class ArticleController {
@Autowired
private ArticleRepository articleRepository;
@GetMapping
public Page<Article> search(@RequestParam(value = "q", required = false, defaultValue = "") String q,
@PageableDefault(sort = {"id"}, direction = Sort.Direction.DESC) Pageable pageable) {
return articleRepository.findByTitleOrContent(q, q, pageable);
}
}
在这个controller中,我们定义了一个search方法,用来接收用户输入的关键字。然后,我们使用ArticleRepository来查询标题或内容包含这个关键字的文章,并通过Spring Data提供的分页功能来返回查询结果。
示例2:模糊搜索
除了根据标题或内容进行搜索外,我们还可以实现一个模糊搜索的功能。模糊搜索将用户输入的关键字进行分词,并查询所有包含这些分词的文章。我们可以使用ES的MatchQuery来实现这个功能。
首先,我们需要定义一个新的repository方法:
@Repository
public interface ArticleRepository extends ElasticsearchRepository<Article, String> {
@Query("{\"match\": {\"title\": {\"query\": \"?0\",\"operator\": \"and\"}}}")
Page<Article> findByTitle(String title, Pageable pageable);
}
在这个方法中,我们使用了@Query注解,并定义了一个ES的查询语句。使用"?0"这个占位符来接收用户输入的关键字,并指定了查询的字段是title。
然后,我们可以在controller中添加一个新的接口来调用这个方法:
@GetMapping("/title")
public Page<Article> searchByTitle(@RequestParam(value = "q", required = false, defaultValue = "") String q,
@PageableDefault(sort = {"id"}, direction = Sort.Direction.DESC) Pageable pageable) {
return articleRepository.findByTitle(q, pageable);
}
这个接口中,我们可以调用ArticleRepository中的findByTitle方法,并传入用户输入的关键字。这样,就可以根据文章标题进行模糊搜索了。
总结
这样,我们就完成了Spring Boot集成Elasticsearch的过程,同时,我们也给出了两个示例,说明了如何在实际项目中应用ES搜索。需要注意的是,在实际项目中,我们还需要考虑到ES的分布式、高可用等问题。为了保证系统的性能和稳定性,我们需要针对具体业务场景进行一些优化和调整。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Springboot集成spring data elasticsearch过程详解 - Python技术站