Elasticsearch在Java中的应用与测试
在现代软件开发中,Elasticsearch作为一个强大的搜索引擎,已经被广泛应用于各种数据存储和检索场景。本文将通过一个具体的测试代码,展示如何在Java项目中集成和使用Elasticsearch,并通过JUnit进行测试验证。
核心功能实现
我们将实现以下几个功能:
- 将案件信息添加到Elasticsearch索引中。
- 从本地资源目录中读取文件名。
- 将案件信息的嵌入向量存储到Elasticsearch中。
- 使用嵌入向量进行案件搜索。
以下是核心代码实现:
案件添加功能
@Test
public void addCaseTest() throws IOException {
Case aCase = new Case();
aCase.setCaseId("123");
IndexResponse cases = client.index(i -> i.index("cases").id(aCase.getCaseId()).document(aCase));
System.out.println(cases);
}
读取资源文件名
@Test
public void getFileNamesFromResource() {
URL resource = ResourceUtil.getResource("legal_data/wenshu/dev");
System.out.println(wenShuUtil.getWenShuFileNameByPath(resource.getPath()));
}
存储案件嵌入向量
@Test
public void addCaseEmbeddingTest() throws IOException {
URL resource = ResourceUtil.getResource("legal_data/wenshu/dev");
List<String> names = wenShuUtil.getWenShuFileNameByPath(resource.getPath());
names = names.subList(1, 20);
for (String s : names) {
List<Case> cases = wenShuUtil.parseCases(s);
embeddingService.saveCasesEmbedding(cases);
}
}
案件嵌入向量搜索
@Test
public void searchCaseEmbeddingTest() {
Response<Embedding> response = embeddingService.embed("我设计的产品被其他人侵权使用");
String indexName = NameEnums.generateEmbeddingIndexName(NameEnums.CASE_RECORD_NAME.toString(), NameEnums.DEFAULT_EMBEDDING_MODEL.toString());
EmbeddingStore<TextSegment> store = factory.createEmbeddingStore(NameEnums.CASE_RECORD_NAME.toString(), NameEnums.DEFAULT_EMBEDDING_MODEL.toString(), NameEnums.ELASTIC_SEARCH_STORE.toString());
List<EmbeddingMatch<TextSegment>> relevant = store.findRelevant(response.content(), 8, 0);
for (EmbeddingMatch<TextSegment> emb : relevant) {
System.out.println(emb);
}
}
结论
本文集成Elasticsearch,使用JUnit进行功能测试。这些代码不仅实现了基本的CRUD操作,还展示了如何结合嵌入向量进行复杂的文本搜索。希望通过这些示例代码,能帮助开发者更好地理解和使用Elasticsearch。
进一步的工作可以包括:
- 优化嵌入向量的生成和存储流程。
- 增加更多的测试用例,覆盖更多的业务场景。
- 实现更加复杂的查询和分析功能。
通过不断优化和扩展,我们的系统将变得更加智能和高效。