我有一个特殊的数据结构。例如:
{
"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成为可能?
答案 0 :(得分:3)
您需要更改custom
数组的索引方式。问题是ES会在分析过程中将其展平,因此custom
将包含令牌tel
,1234567
,weibo
,abcde
等,即2D结构丢失了。
如果您希望能够查询tel
和1234566
,则需要将custom
字段定义为nested
datatype,与此类似。
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"
}
}
]
}
}
}
}
}