基于搜索服务定义的JSON索引配置与应用
业务背景与痛点
在工业制造与设备资产管理场景中,业务数据呈现高度动态化、非标准化特征,传统检索方案面临以下挑战:
| 痛点维度 | 具体表现 | 传统方案局限 |
|---|---|---|
| 结构扩展难 | 不同产线/型号需记录差异化工艺参数、传感器配置、维保记录等 | 关系型表结构变更频繁,DDL锁表影响线上 |
| 指标动态化 | 质检临时检测项、自定义阈值、非标工艺备注随批次/工艺路线变化 | 固定索引无法覆盖,需硬编码查询逻辑 |
| 统一检索诉求 | 业务人员期望通过单一入口,快速定位符合特定扩展条件或质量参数的设备/批次 | SQL难以高效处理JSON嵌套结构的分词、过滤与范围检索 |
| 性能与弹性平衡 | 需在灵活存储与稳定检索之间取得平衡 | JSON全文检索易导致全表扫描,过滤性能差 |
数据模型与JSON结构设计
在应用设计态构建设备“Equipment”数据模型,核心属性如下:
| 属性英文名称 | 类型 | 说明 |
|---|---|---|
| asset_code | 文本 | 设备唯一资产编码。 |
| asset_name | 文本 | 设备中文名称。 |
| commission_date | 日期 | 投产日期。 |
| clsAttrs | JSON | 分类属性扩展字段,存储差异化的工艺参数、传感器配置、维保状态等。 |
“clsAttrs”示例结构:
{
"maintenance": {
"status": "running",
"last_service": "2025-03-15"
},
"params": {
"rated_power": 2.5000,
"rated_voltage": 380,
"temp": 85
},
"tags": ["critical", "high-priority"],
"qc": {
"last_date": "2025-07-22",
"inspector": "zhangsan"
},
"fenlei": {
"huanbao_dengji": "国VI",
"fanghu_dengji": "IP65"
}
} 搜索服务定义配置
- 登录应用运行态。
- 在左侧导航栏中,选择,进入“搜索服务定义”页面。
- 单击“创建”,在展开的“服务定义”页签中,参照如下参数说明进行配置。
表2 “服务定义”页签配置信息 参数
配置示例
说明
API英文名称
EquipDynamicSearch
接口技术标识,建议采用驼峰命名。
API中文名称
设备动态属性检索服务
业务可读名称。
API英文描述
Search equipment by dynamic ClsAttrs
接口功能摘要。
API中文描述
支持按设备扩展属性、质检动态指标等JSON字段进行检索
清晰描述检索范围与适用场景。
API责任人
zhangsan
服务维护负责人。
- 完成配置后,单击底部“当前页签”中的“保存”。
- 切换至“索引定义”页签,根据业务检索需求,单击“添加索引”,配置一个JSON类型的索引。
表3 “索引定义”页签配置信息 配置项
配置示例
说明
索引名称
equip_cls_attrs_json
建议带“_json”后缀便于管理。
索引类型
JSON
映射实体中的“ClsAttrs”字段。
分词方法
普通分词或单字分词
文本描述类用普通分词,短代码/缩写用单字分词。
分词选项
不涉及
-
作为过滤条件
Y
允许按JSON路径构建动态筛选面板。
参与关键词搜索
N(JSON类型强制置灰)
JSON不支持全局关键词搜索,需指定路径。
展示
Y
API出参返回完整JSON,供前端渲染。
匹配方法
精确匹配、模糊、范围、短语
按业务场景动态选择,JSON类型均支持。
- 完成配置后,单击底部“当前页签”中的“保存”。
- 切换至“服务配置”页签,选择实体,单击“添加”。
- 选择实体名称(如“Equipment”)、属性名称(如“clsAttrs”)映射至索引“equip_cls_attrs_json”,单击底部“当前页签”中的“保存”。
- 单击底部“全局操作”中的“发布”。
- 在左侧导航栏中,选择,进入“全量数据服务”页面。
- 在“分类”区域的“搜索服务”中,获取已发布的搜索服务及API信息。
典型检索场景与调用示例
URL格式:
POST /rdm/basic/api/searchServ/executeScript/{serviceName}/release/DSL/{pageSize}/{curPage} 实际调用时,将“serviceName”替换为“EquipDynamicSearch”,分页参数按需传入。
场景1:JSON路径精确匹配与模糊检索
业务需求:检索“maintenance.status”为“running”且“tags”包含“critical”的设备。
请求示例:
{
"params": {
"highlight": true,
"complexCondition": [
{
"indexName": "equip_cls_attrs_json",
"path": "maintenance.status",
"matchType": "ACCURATE",
"value": "running"
},
{
"indexName": "equip_cls_attrs_json",
"path": "tags",
"matchType": "FUZZY",
"value": "critical"
}
]
}
} 响应片段:
{
"totalCount": 12,
"items": [
{
"equipCode": "EQP-2025-001",
"ClsAttrs": {
"maintenance": { "status": "running", "lastTime": "2025-07-20" },
"tags": ["critical", "high-priority"]
},
"highlight": {
"tags": ["<em>critical</em>", "high-priority"]
}
}
]
}
多路径查询默认为AND逻辑,不支持OR逻辑嵌套。如需实现“状态为running或tags含critical”,需在业务层拆分查询或前端组合结果。
场景2:JSON路径通配查询
业务需求:检索所有层级下包含“temp”字段且值为“85”的记录。
请求示例:
{
"params": {
"complexCondition": [
{
"indexName": "equip_cls_attrs_json",
"path": "*.temp",
"matchType": "ACCURATE",
"value": "85"
}
]
}
} 场景3:数值与日期范围查询
业务需求:检索额定功率在2.0-3.0之间,且最后质检日期在2025-07-20至2025-07-25之间的设备。
原始数据痛点:分类属性中的数值/日期在底层以字符串存储,范围查询默认按文本字典序(“11 < 2 < 21”),直接传入2.0会返回错误结果。
标准请求体示例:
{
"params": {
"complexCondition": [
{
"indexName": "equip_cls_attrs_json",
"path": "params.rated_power",
"matchType": "RANGE",
"value": "2.0000",
"valueEnd": "3.0000"
},
{
"indexName": "equip_cls_attrs_json",
"path": "qc.last_date.keyword",
"matchType": "RANGE",
"value": "1752969600000",
"valueEnd": "1753401600000"
}
]
}
} 场景4:短语匹配查询
业务需求:要求“process.remark”字段包含完整短语“高温高压工况”,禁止分词打乱词序。
请求示例:
{
"params": {
"complexCondition": [
{
"indexName": "equip_cls_attrs_json",
"path": "process.remark",
"matchType": "PHRASE",
"value": "高温高压工况"
}
]
}
}