我有一个特殊的数据结构。例如:
{
"name": "test",
"age": 20,
"gender": "M",
"custom": [
["tel", "1234567"], ["weibo", "abcde"], ["weixin", "abcdefg"]......
]
}
{
"name": "test1",
"age": 30,
"gender": "F",
"custom": [
["电话", "1234567"], ["微博", "abcde"], ["微信", "abcdefg"]......
]
}
自定义文件是一个二维数组,我想搜索["tel", "1234567"]
.如何通过ES使之成为可能?
您需要
更改索引custom
数组的方式。问题是 ES 会在分析过程中将其展平,以便custom
包含令牌tel
、1234567
、weibo
、abcde
等,即 2D 结构丢失。
如果您希望能够查询tel
和1234566
,则需要将custom
字段定义为nested
数据类型,与此类似。
PUT index
{
"mappings": {
"type": {
"properties": {
"name": {
"type": "string"
},
"age": {
"type": "integer"
},
"gender": {
"type": "string"
},
"custom": {
"type": "nested",
"properties": {
"key": {
"type": "string"
},
"value": {
"type": "string"
}
}
}
}
}
}
}
然后,您可以像这样为文档编制索引:
PUT index/type/1
{
"name": "test",
"age": 20,
"gender": "M",
"custom": [
{"key": "tel", "value": "1234567"},
{"key": "weibo", "value": "abcde"},
{"key": "weixin", "value": "abcdefg"}
]
}
最后,您可以查询"tel 1234567"并通过以下查询获取所需的文档:
POST index/type/_search
{
"query": {
"nested": {
"path": "custom",
"query": {
"bool": {
"must": [
{
"term": {
"custom.key": "tel"
}
},
{
"term": {
"custom.value": "1234567"
}
}
]
}
}
}
}
}