Elasticsearch如何匹配二维数组



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

{
 "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包含令牌tel1234567weiboabcde等,即 2D 结构丢失。

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

相关内容

  • 没有找到相关文章