SpringBoot與Hibernate Search整合,實(shí)現(xiàn)法律文書智能條款匹配系統(tǒng)
作者:Java知識(shí)日歷
Hibernate Search不僅能夠提供高效、準(zhǔn)確的全文搜索功能,還能夠與現(xiàn)有的JPA體系無(wú)縫集成,簡(jiǎn)化開(kāi)發(fā)流程并降低維護(hù)成本。
Hibernate Search不僅能夠提供高效、準(zhǔn)確的全文搜索功能,還能夠與現(xiàn)有的JPA體系無(wú)縫集成,簡(jiǎn)化開(kāi)發(fā)流程并降低維護(hù)成本。
哪些公司使用了Hibernate Search?
- Red Hat : 作為 Hibernate Search 的主要維護(hù)者,Red Hat 在其多個(gè)產(chǎn)品和服務(wù)中使用了 Hibernate Search。
- BBC:在內(nèi)容管理系統(tǒng)中使用 Hibernate Search 提高新聞報(bào)道的檢索效率。
- CNN:在多媒體資產(chǎn)管理系統(tǒng)中使用 Hibernate Search 支持記者的工作流程。
- Adobe: 在其文檔管理系統(tǒng)中使用 Hibernate Search 來(lái)提供高效的搜索功能。
- MuleSoft:使用 Hibernate Search 提供集成平臺(tái)中的搜索功能。
- WildFly:紅帽的 WildFly 應(yīng)用服務(wù)器也集成了 Hibernate Search 以支持搜索需求。
- US Department of Veterans Affairs (VA):在醫(yī)療記錄管理系統(tǒng)中使用 Hibernate Search 支持醫(yī)療服務(wù)。
- NASA:在數(shù)據(jù)管理系統(tǒng)中使用 Hibernate Search 處理大量的科學(xué)數(shù)據(jù)。
- Stanford University:在學(xué)術(shù)資源管理系統(tǒng)中使用 Hibernate Search 提高文獻(xiàn)檢索效率。
- Harvard University:在圖書館信息系統(tǒng)中使用 Hibernate Search 支持學(xué)生和研究人員的信息查詢。
- AT&T:在客戶服務(wù)系統(tǒng)中使用 Hibernate Search 提供快速響應(yīng)的搜索功能。
- Verizon:在網(wǎng)絡(luò)管理系統(tǒng)中使用 Hibernate Search 優(yōu)化設(shè)備信息的檢索。
應(yīng)用場(chǎng)景
1. 文檔管理與檢索
- 法律文件存儲(chǔ):將大量的法律文件(如合同、判決書、法規(guī)等)存儲(chǔ)在數(shù)據(jù)庫(kù)中,并通過(guò) Hibernate Search 實(shí)現(xiàn)快速檢索。
- 版本控制:記錄每個(gè)條款的歷史版本,支持回滾到之前的版本。
2. 知識(shí)管理系統(tǒng)
- 案例庫(kù):構(gòu)建內(nèi)部案例庫(kù),律師可以通過(guò)關(guān)鍵詞快速查找相關(guān)案例。
- 法律研究:支持復(fù)雜的查詢條件,幫助律師進(jìn)行深入的法律研究。
3. 客戶關(guān)系管理
- 客戶檔案:管理客戶的法律文件和歷史記錄,方便律師隨時(shí)查看。
- 溝通記錄:記錄與客戶的溝通記錄,支持全文搜索和高級(jí)過(guò)濾。
4. 合規(guī)性檢查
- 法規(guī)監(jiān)測(cè):自動(dòng)監(jiān)測(cè)最新的法律法規(guī)變化,并提醒律師進(jìn)行相應(yīng)的調(diào)整。
- 風(fēng)險(xiǎn)評(píng)估:通過(guò)搜索和分析相關(guān)法規(guī),幫助企業(yè)進(jìn)行合規(guī)性風(fēng)險(xiǎn)評(píng)估。
Hibernate Search 的優(yōu)勢(shì)
1. 與JPA無(wú)縫集成
- 現(xiàn)有基礎(chǔ):如果你已經(jīng)在項(xiàng)目中使用了Spring Data JPA來(lái)管理數(shù)據(jù)庫(kù)操作,Hibernate Search可以直接與其集成,無(wú)需額外的配置和學(xué)習(xí)成本。
- 一致性:保持技術(shù)和架構(gòu)的一致性,減少不同技術(shù)棧之間的切換和適配工作。
2. 強(qiáng)大的全文搜索功能
- 多字段搜索:支持在多個(gè)字段上進(jìn)行全文搜索,滿足復(fù)雜的查詢需求。
- 模糊搜索:內(nèi)置的模糊搜索功能可以幫助用戶找到拼寫錯(cuò)誤或類似的條目。
- 高亮顯示:可以通過(guò)配置輕松實(shí)現(xiàn)搜索結(jié)果中的關(guān)鍵字高亮顯示,提高用戶體驗(yàn)。
3. 豐富的查詢功能
- 布爾查詢:支持復(fù)雜的布爾邏輯(AND、OR、NOT),方便用戶構(gòu)建精確的搜索條件。
- 范圍查詢:可以對(duì)數(shù)值型字段進(jìn)行范圍查詢,例如日期范圍、價(jià)格范圍等。
- 排序和分頁(yè):內(nèi)置的支持排序和分頁(yè)功能,確保搜索結(jié)果的相關(guān)性和易用性。
4. 易于擴(kuò)展和維護(hù)
- 模塊化設(shè)計(jì):Hibernate Search的設(shè)計(jì)使得它可以很容易地與其他組件集成,便于未來(lái)的功能擴(kuò)展。
- 社區(qū)和支持:擁有活躍的開(kāi)源社區(qū)和豐富的文檔資源,遇到問(wèn)題時(shí)可以獲得及時(shí)的幫助和解決方案。
5. 高性能
- 索引優(yōu)化:Hibernate Search提供了高效的索引機(jī)制,確??焖俚臄?shù)據(jù)檢索能力。
- 緩存機(jī)制:利用緩存技術(shù)加速常用數(shù)據(jù)的訪問(wèn)速度,提高系統(tǒng)性能。
6. 安全性
- 權(quán)限控制:可以根據(jù)不同的用戶角色分配不同的搜索權(quán)限,確保數(shù)據(jù)的安全性。
7. 自動(dòng)索引管理
- 增量索引:Hibernate Search會(huì)自動(dòng)處理實(shí)體對(duì)象的變化(如新增、修改、刪除),并在后臺(tái)更新索引。
- 批處理:支持批量索引操作,提高索引效率。
8. 靈活的分析器配置
- 多種分析器:提供多種內(nèi)置分析器(如標(biāo)準(zhǔn)分析器、停用詞過(guò)濾器等),并允許自定義分析器以適應(yīng)特定的語(yǔ)言和需求。
- 多語(yǔ)言支持:支持多種語(yǔ)言的文本分析,適合國(guó)際化應(yīng)用。
代碼實(shí)操
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.1.0</version>
<relativePath/><!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>lawmatcher</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>lawmatcher</name>
<description>Law Document Clause Matching System</description>
<properties>
<java.version>17</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.hibernate.search.orm</groupId>
<artifactId>hibernate-search-mapper-orm</artifactId>
<version>6.2.0.Final</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
添加點(diǎn)測(cè)試數(shù)據(jù)
添加一些中國(guó)《勞動(dòng)法》的真實(shí)條款數(shù)據(jù)用于測(cè)試
-- 插入中國(guó)《勞動(dòng)法》的部分條款數(shù)據(jù)
INSERT INTO legal_provision (title, content) VALUES
('第十七條', '勞動(dòng)合同依法訂立即具有法律約束力,當(dāng)事人必須履行勞動(dòng)合同規(guī)定的義務(wù)。'), -- 合同生效即具法律效力
('第三十條', '用人單位解除勞動(dòng)合同,應(yīng)當(dāng)提前三十日以書面形式通知?jiǎng)趧?dòng)者本人。'), -- 解除合同需提前通知
('第四十四條', '有下列情形之一的,用人單位應(yīng)當(dāng)按照下列標(biāo)準(zhǔn)支付高于勞動(dòng)者正常工作時(shí)間工資的工資報(bào)酬:(一)安排勞動(dòng)者延長(zhǎng)工作時(shí)間的,支付不低于工資百分之一百五十的工資報(bào)酬;(二)休息日安排勞動(dòng)者工作又不能安排補(bǔ)休的,支付不低于工資百分之二百的工資報(bào)酬;(三)法定休假日安排勞動(dòng)者工作的,支付不低于工資百分之三百的工資報(bào)酬。'), -- 加班費(fèi)規(guī)定
('第五十條', '工資應(yīng)當(dāng)以貨幣形式按月支付給勞動(dòng)者本人。不得克扣或者無(wú)故拖欠勞動(dòng)者的工資。'), -- 工資發(fā)放規(guī)定
('第八十二條', '用人單位自用工之日起超過(guò)一個(gè)月不滿一年未與勞動(dòng)者訂立書面勞動(dòng)合同的,應(yīng)當(dāng)向勞動(dòng)者每月支付二倍的月工資。'); -- 未簽訂合同的補(bǔ)償規(guī)定
application.properties
spring.datasource.url=jdbc:mysql://localhost:3306/lawmatcher?useSSL=false&serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=123456
# 使用MySQL 8的方言
spring.jpa.database-platform=org.hibernate.dialect.MySQL8Dialect
# 自動(dòng)更新數(shù)據(jù)庫(kù)模式
spring.jpa.hibernate.ddl-auto=update
# 顯示SQL語(yǔ)句
spring.jpa.show-sql=true
# Hibernate Search配置
spring.jpa.properties.hibernate.search.backend.directory.type=lucene
spring.jpa.properties.hibernate.search.backend.directory.root=/tmp/lucene-indexes
法律條款實(shí)體類
package com.example.lawmatcher.model;
import org.hibernate.search.mapper.pojo.mapping.definition.annotation.FullTextField;
import org.hibernate.search.mapper.pojo.mapping.definition.annotation.GenericField;
import org.hibernate.search.mapper.pojo.mapping.definition.annotation.Indexed;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
/**
* 法律條款實(shí)體類
*/
@Entity
@Indexed
publicclass LegalProvision {
/**
* 主鍵ID
*/
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
/**
* 條款標(biāo)題
*/
@GenericField
private String title;
/**
* 條款內(nèi)容
*/
@FullTextField(analyzer = "standard")
private String content;
// Getters and setters
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
}
法律條款倉(cāng)庫(kù)接口
package com.example.lawmatcher.repository;
import com.example.lawmatcher.model.LegalProvision;
import org.hibernate.search.mapper.orm.Search;
import org.hibernate.search.mapper.orm.session.SearchSession;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
import jakarta.persistence.EntityManager;
import jakarta.persistence.PersistenceContext;
import java.util.List;
/**
* 法律條款倉(cāng)庫(kù)接口
*/
@Repository
publicinterface LegalProvisionRepository extends JpaRepository<LegalProvision, Long> {
/**
* 根據(jù)內(nèi)容搜索法律條款
*
* @param query 搜索關(guān)鍵字
* @return 匹配的法律條款列表
*/
default List<LegalProvision> searchByContent(String query) {
EntityManager entityManager = getEntityManager();
SearchSession searchSession = Search.session(entityManager);
return searchSession.search(LegalProvision.class)
.where(f -> f.match()
.fields("title", "content")
.matching(query))
.fetchHits(20);
}
/**
* 根據(jù)多個(gè)條件進(jìn)行復(fù)雜查詢
*
* @param keyword 關(guān)鍵詞
* @param field 字段名
* @return 匹配的法律條款列表
*/
default List<LegalProvision> advancedSearch(String keyword, String field) {
EntityManager entityManager = getEntityManager();
SearchSession searchSession = Search.session(entityManager);
return searchSession.search(LegalProvision.class)
.where(f -> f.match()
.field(field)
.matching(keyword))
.fetchHits(20);
}
@PersistenceContext
EntityManager getEntityManager();
}
Controller
package com.example.lawmatcher.controller;
import com.example.lawmatcher.model.LegalProvision;
import com.example.lawmatcher.repository.LegalProvisionRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@RestController
publicclass LegalProvisionController {
@Autowired
private LegalProvisionRepository legalProvisionRepository;
/**
* 根據(jù)查詢關(guān)鍵字搜索法律條款
*
* @param query 查詢關(guān)鍵字
* @return 匹配的法律條款列表
*/
@GetMapping("/search")
public List<LegalProvision> search(@RequestParam String query) {
return legalProvisionRepository.searchByContent(query);
}
/**
* 根據(jù)多個(gè)條件進(jìn)行復(fù)雜查詢
*
* @param keyword 關(guān)鍵詞
* @param field 字段名
* @return 匹配的法律條款列表
*/
@GetMapping("/advanced-search")
public List<LegalProvision> advancedSearch(@RequestParam String keyword, @RequestParam String field) {
return legalProvisionRepository.advancedSearch(keyword, field);
}
}
主應(yīng)用程序類
package com.example.lawmatcher;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class LawMatcherApplication {
public static void main(String[] args) {
SpringApplication.run(LawMatcherApplication.class, args);
}
}
測(cè)試
GET http://localhost:8080/advanced-search?keyword=工資&field=content
Respons:
[
{
"id": 4,
"title": "第五十條",
"content": "工資應(yīng)當(dāng)以貨幣形式按月支付給勞動(dòng)者本人。不得克扣或者無(wú)故拖欠勞動(dòng)者的工資。"
},
{
"id": 5,
"title": "第八十二條",
"content": "用人單位自用工之日起超過(guò)一個(gè)月不滿一年未與勞動(dòng)者訂立書面勞動(dòng)合同的,應(yīng)當(dāng)向勞動(dòng)者每月支付二倍的月工資。"
},
{
"id": 3,
"title": "第四十四條",
"content": "有下列情形之一的,用人單位應(yīng)當(dāng)按照下列標(biāo)準(zhǔn)支付高于勞動(dòng)者正常工作時(shí)間工資的工資報(bào)酬:(一)安排勞動(dòng)者延長(zhǎng)工作時(shí)間的,支付不低于工資百分之一百五十的工資報(bào)酬;(二)休息日安排勞動(dòng)者工作又不能安排補(bǔ)休的,支付不低于工資百分之二百的工資報(bào)酬;(三)法定休假日安排勞動(dòng)者工作的,支付不低于工資百分之三百的工資報(bào)酬。"
}
]
責(zé)任編輯:武曉燕
來(lái)源:
Java知識(shí)日歷