【问题标题】:Are Elasticsearch object properties really just flat properties with a namespace?Elasticsearch 对象属性真的只是带有命名空间的平面属性吗?
【发布时间】:2022-10-05 16:13:45
【问题描述】:

在 Elasticsearch 文档 (https://www.elastic.co/guide/en/elasticsearch/reference/current/object.html) 中指出,内部的对象属性本质上只是具有命名空间的平面属性。但是,当我这样做时:

POST storage-index/_doc
{
  \"person\": {
    \"lastName\":\"Miller\" 
  },
  \"person.lastName\":\"Smith\"
}

该索引包含以下内容:

    \"_source\" : {
      \"person\" : {
        \"lastName\" : \"Miller\"
      },
      \"person.lastName\" : \"Smith\"
    }

当我查询这些都返回文档时,它变得更加奇怪:

对象属性:

POST /storage-index/_search
{
  \"query\": {
    \"query_string\": {
      \"query\": \"person.lastName:Miller\"
    }
  }
}

平房:

POST /storage-index/_search
{
  \"query\": {
    \"query_string\": {
      \"query\": \"person.lastName:Smith\"
    }
  }
}

我错过了什么?

  • 如果这个问题有答案,请踢我

标签: object elasticsearch mapping


【解决方案1】:

这个问题的关键是es可以store arrays in any field,这意味着在你的例子中你在person.lastName中存储了一个数组。

另一个简单的例子——

让我们创建一个动态映射索引:

PUT my-index-000001/_doc/1
{ 
  "region": "US",
  "manager": { 
    "age":     30,
    "name": { 
      "first": "John",
      "last":  "Smith"
    }
  }
}

并查看索引的映射,GET my-index-000001/_mapping

{
  "my-index-000001" : {
    "mappings" : {
      "properties" : {
        "manager" : {
          "properties" : {
            "age" : {
              "type" : "long"
            },
            "name" : {
              "properties" : {
                "first" : {
                  "type" : "text",
                  "fields" : {
                    "keyword" : {
                      "type" : "keyword",
                      "ignore_above" : 256
                    }
                  }
                },
                "last" : {
                  "type" : "text",
                  "fields" : {
                    "keyword" : {
                      "type" : "keyword",
                      "ignore_above" : 256
                    }
                  }
                }
              }
            }
          }
        },
        "region" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          }
        }
      }
    }
  }
}

manager.name.firstmanager.name.last 完全一样。

让我们在您的问题中添加另一个格式的文档:

PUT my-index-000001/_doc/2
{ 
  "region": "US",
  "manager": { 
    "age":     30,
    "name": { 
      "first": "Lucy",
      "last":  "James"
    },
    "name.first": "Kate"
  }
}

那么猜猜现在索引的映射是什么?它是否添加了额外的manager.name.first?不,映射不会改变。它只是一个存储在数组中的字段,而不是现在的单个对象。

上面的文档是将两个名字存储为一个数组,所以和下一个文档完全一样:

PUT my-index-000001/_doc/3
{ 
  "region": "US",
  "manager": { 
    "age":     30,
    "name": [
      { 
        "first": "Lucy",
        "last":  "James"
      },
      { 
        "first": "Kate"
      }
    ]
  }
}

原来的格式好像不一样,但是底层存储没有区别:

{
  "region" :        "US",
  "manager.age":    30,
  "manager.name.first" : [ "Lucy", "Kate" ],
  "manager.name.last" :  "James"
}

查询:

GET my-index-000001/_search
{
  "query": {
    "match": {
      "manager.name.first": "kate"
    }
  }
}

他们都将被选中:

{
  "took" : 0,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 2,
      "relation" : "eq"
    },
    "max_score" : 0.43445712,
    "hits" : [
      {
        "_index" : "my-index-000001",
        "_type" : "_doc",
        "_id" : "2",
        "_score" : 0.43445712,
        "_source" : {
          "region" : "US",
          "manager" : {
            "age" : 30,
            "name" : {
              "first" : "Lucy",
              "last" : "James"
            },
            "name.first" : "Kate"
          }
        }
      },
      {
        "_index" : "my-index-000001",
        "_type" : "_doc",
        "_id" : "3",
        "_score" : 0.43445712,
        "_source" : {
          "region" : "US",
          "manager" : {
            "age" : 30,
            "name" : [
              {
                "first" : "Lucy",
                "last" : "James"
              },
              {
                "first" : "Kate"
              }
            ]
          }
        }
      }
    ]
  }
}

但只是显示为它们的原始格式。


编辑:至于为什么它总是返回原始格式,请参阅:_source。如果不是specified by other fields when searching,elasticsearch 只返回原始的_source

【讨论】:

    猜你喜欢
    • 2015-04-09
    • 2021-11-14
    • 2018-09-03
    • 2020-10-01
    • 2017-11-30
    • 2011-05-09
    • 2016-10-17
    • 2021-07-28
    • 1970-01-01
    相关资源
    最近更新 更多