如何在Elasticsearch查询或Reactive Search组件中映射字段返回值?
实现字段值映射的两种方案
一、在Elasticsearch查询中直接实现
可以通过**运行时字段(Runtime Fields)或者脚本字段(Script Fields)**实现值的映射,无需修改原始数据:
1. 使用运行时字段(推荐)
在查询时定义临时字段,直接返回映射后的值:
{ "runtime_mappings": { "size_result": { "type": "keyword", "script": """ def value = doc['your_field_name'].value; if (value == 'Small' || value == 'Medium') { emit('Yes'); } else if (value == 'Average' || value == 'Big') { emit('No'); } """ } }, "_source": ["your_field_name", "size_result"], // 指定返回原始字段和映射后的字段 "query": { "match_all": {} // 替换为你的实际查询条件 } }
2. 使用脚本字段
若只需额外返回映射值,可使用script_fields:
{ "_source": ["your_field_name"], "script_fields": { "size_result": { "script": { "source": """ def val = doc['your_field_name'].value; return (val == 'Small' || val == 'Medium') ? 'Yes' : 'No'; """ } } }, "query": { "match_all": {} } }
二、通过Reactive Search的列表组件实现
Reactive Search的List组件可通过数据转换或自定义渲染实现映射:
1. 使用transform属性提前转换数据
在组件配置中用transform函数替换原始字段值:
<List componentId="sizeFilter" dataField="your_field_name" title="Size Category" transform={item => { const mapping = { 'Small': 'Yes', 'Medium': 'Yes', 'Average': 'No', 'Big': 'No' }; return { ...item, label: mapping[item.label] || item.label }; }} />
2. 自定义renderItem渲染
通过renderItem实现更灵活的渲染逻辑:
<List componentId="sizeFilter" dataField="your_field_name" title="Size Category" renderItem={(item) => { const displayText = (item.label === 'Small' || item.label === 'Medium') ? 'Yes' : 'No'; return <div>{displayText}</div>; }} />
内容的提问来源于stack exchange,提问作者Guillaume Theret
相关产品推荐
相关产品推荐

