Elasticsearch如何匹配二维数组?

时间:2016-03-22 12:40:29

标签: mysql elasticsearch lucene

我有一个特殊的数据结构。例如:

{
 "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成为可能?

1 个答案:

答案 0 :(得分:3)

您需要更改custom数组的索引方式。问题是ES会在分析过程中将其展平,因此custom将包含令牌tel1234567weiboabcde等,即2D结构丢失了。

如果您希望能够查询tel1234566,则需要将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"
              }
            }
          ]
        }
      }
    }
  }
}