ElasticSearch字段属性搜索方法?basicField能否过滤嵌套字段?
Elasticsearch字段使用及特定过滤场景实现方案
basicField在默认动态映射规则下会被自动索引为数值类型,完全可以正常参与各类查询、过滤、聚合操作,直接通过term、range等查询语句指定该字段做条件匹配即可。
针对你提到的「筛选键为23的对象内部nested字段值为true的文档」需求,你当前的文档结构无法直接支持通用动态匹配,具体说明如下:
原始结构的问题
Elasticsearch对普通object类型字段默认做扁平化索引处理,你当前用数字作为对象键名的写法,写入数据后会被打平为someObject.22.nested、someObject.23.nested这类独立的布尔字段,存在两个明显缺陷:
- 如果后续
someObject下新增其他数字键,会持续生成新的字段,极易触发索引的字段数上限,导致写入报错 - 字段路径是静态固定的,查询时无法直接引用文档内
basicField的值动态拼接查询路径,也无法保留键名和对应nested属性的关联关系
不同场景的实现方式
固定键名场景
如果someObject下的键是固定枚举值(比如仅存在22、23两个键,不会新增),也不需要动态关联basicField的值,可以直接写死字段路径做过滤,示例查询DSL如下:
{ "query": { "term": { "someObject.23.nested": true } } }
动态键/关联同文档字段场景
如果需要动态匹配键名(比如匹配键名等于当前文档basicField值的子对象),或者someObject下的键会动态新增,必须先调整文档结构与索引mapping,将动态键的写法替换为nested嵌套数组结构,调整后的文档示例:
{ "basicField": 23, "someObject": [ { "fieldKey": 22, "nested": true }, { "fieldKey": 23, "nested": false } ] }
需要提前在mapping中将someObject的类型设置为nested,避免嵌套文档被扁平化处理丢失关联关系。
- 固定筛选键为23、
nested值为true的文档,使用nested查询实现:
{ "query": { "nested": { "path": "someObject", "query": { "bool": { "must": [ {"term": {"someObject.fieldKey": 23}}, {"term": {"someObject.nested": true}} ] } } } } }
- 动态匹配键名等于当前文档
basicField值、且nested值为true的文档,配合script查询实现:
{ "query": { "nested": { "path": "someObject", "query": { "bool": { "must": [ {"script": { "script": "doc['someObject.fieldKey'].value == doc['basicField'].value" }}, {"term": {"someObject.nested": true}} ] } } } } }
内容的提问来源于stack exchange,提问作者Heorhij
相关产品推荐
相关产品推荐

