【问题标题】:Elasticsearch - Querying nested objectsElasticsearch - 查询嵌套对象
【发布时间】:2015-09-10 23:54:45
【问题描述】:

我正在像这样在弹性搜索中存储对象

{
  "user":{
           "name":"Johnson",
           "age":24
          }
}

请注意,我没有在 elasticsearch 中设置默认映射。我只是直接插入数据。

现在, 同时使用“嵌套查询”尝试查询数据。

GET user_index/user_document/_search
{

  "query":{
        "nested" : {
            "path" : "user",
            "score_mode" : "avg",
            "query" : {
                "bool" : {
                    "must" : [
                        {
                            "match" : {"user.name" : "Johnson"}
                        }
                    ]
                }
            }
        }
    }
}

这失败了,我得到一个错误

nested object under path [user] is not of nested type

我的问题是

  1. 是否应该为查询嵌套对象创建默认映射?
  2. 为什么不能使用下面这样的查询(哪个有效)?

    GET user_index/_search
     {
    
        "query":{
    
            "match":{
    
                  "user.name":"Johnson"
    
                     }
    
                } 
    
    }
    

【问题讨论】:

    标签: elasticsearch


    【解决方案1】:

    我应该为查询嵌套对象创建一个默认映射吗?

    没有。当您要将许多对象放入数组并需要单独查询它们时,会使用 ES 中的嵌套对象。作为一般规则,在您发现真正需要它们之前,不要创建嵌套对象。在大多数情况下,它们咬你的次数多于它们对你的帮助。

    为什么不能使用下面这样的查询(哪个有效)?

    1. ES 将所有内容小写以方便搜索。
    2. 您还应该在查询整个值时使用“term”查询。

    这里有一个示例:

    PUT test
    
    POST test/index1
    {
      "user":{
               "name":"Johnson",
               "age":24
              }
    }
    
    GET test/index1/_search
    {
      "query": {
        "term": {
          "user.name": {
            "value": "johnson"
          }
        }
      }
    }
    

    【讨论】:

    • 啊,为什么OP的问题中嵌套查询失败了?
    • 大概是因为没有创建明确的“嵌套”映射。您总是需要手动执行此操作,ES 永远不会推断它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-31
    • 2015-01-13
    • 1970-01-01
    • 2016-10-10
    • 2021-02-03
    • 1970-01-01
    相关资源
    最近更新 更多