弹性搜索中的多级嵌套

时间:2016-03-01 11:55:50

标签: elasticsearch

我有以下结构(一个非常大的弹性搜索文件的一小部分)

sample: {
   {
       "md5sum":"4002cbda13066720513d1c9d55dba809",
       "id":1,
       "sha256sum":"1c6e77ec49413bf7043af2058f147fb147c4ee741fb478872f072d063f2338c5",
       "sha1sum":"ba1e6e9a849fb4e13e92b33d023d40a0f105f908",
       "created_at":"2016-02-02T14:25:19+00:00",
       "updated_at":"2016-02-11T20:43:22+00:00",
       "file_size":188416,
       "type":{
          "name":"EXE"
       },
       "tags":[

       ],
       "sampleSources":[
          {
             "filename":"4002cbda13066720513d1c9d55dba809",
             "source":{
                "name":"default"
             }
          },
         {
             "filename":"4002cbda13066720332513d1c9d55dba809",
             "source":{
                "name":"default"
             }
          }
       ]

    }
}

我想使用的过滤器是通过'名称'包含在sample.sampleSources.source中,使用弹性搜索。

我尝试了以下查询

curl -XGET "http://localhost:9200/app/sample/_search?pretty" -d {query} 其中,{query}是

{
   "query":{
      "nested":{
         "path":"sample.sampleSources",
         "query":{
            "nested":{
               "path":"sample.sampleSources.source",
               "query":{
                  "match":{
                     "sample.sampleSources.source.name":"default"
                  }
               }
            }
         }
      }
   }
}

然而,它并没有给我任何结果。我的文档中有一些案例,其中嵌套比这更深。有人可以指导我如何制定这个查询,以便它适用于所有情况?

编辑1 映射:

{
   "app":{
      "mappings":{
         "sample":{

               "sampleSources":{
                  "type":"nested",
                  "properties":{
                     "filename":{
                        "type":"string"
                     },
                     "source":{
                        "type":"nested",
                        "properties":{
                           "name":{
                              "type":"string"
                           }
                        }
                     }
                  }
               }

}

编辑2 由Waldemar Neto发布的解决方案适用于match query,但不适用于a wild-card or neither for a regexp

你能指导吗?我需要使用通配符和正则表达式查询才能正常工作。

1 个答案:

答案 0 :(得分:2)

我在这里尝试使用你的例子并且工作正常。 看看我的数据。 映射:

PUT /app
{
      "mappings": {
         "sample": {
            "properties": {
               "sampleSources": {
                  "type": "nested",
                  "properties": {
                     "source": {
                        "type": "nested"
                     }
                  }
               }
            }
         }

   }
}

索引数据

POST /app/sample
{
   "md5sum": "4002cbda13066720513d1c9d55dba809",
   "id": 1,
   "sha256sum": "1c6e77ec49413bf7043af2058f147fb147c4ee741fb478872f072d063f2338c5",
   "sha1sum": "ba1e6e9a849fb4e13e92b33d023d40a0f105f908",
   "created_at": "2016-02-02T14:25:19+00:00",
   "updated_at": "2016-02-11T20:43:22+00:00",
   "file_size": 188416,
   "type": {
      "name": "EXE"
   },
   "tags": [],
   "sampleSources": [
      {
         "filename": "4002cbda13066720513d1c9d55dba809",
         "source": {
            "name": "default"
         }
      },
      {
         "filename": "4002cbda13066720332513d1c9d55dba809",
         "source": {
            "name": "default"
         }
      }
   ]
}

搜索查询

GET /app/sample/_search
{
   "query": {
      "nested": {
         "path": "sampleSources.source",
         "query": {
             "match": {
                "sampleSources.source.name": "default"
             }
         }
      }
   }
} 

使用通配符的示例

GET /app/sample/_search
{
   "query": {
      "nested": {
         "path": "sampleSources.source",
         "query": {
             "wildcard": {
                "sampleSources.source.name": {
                   "value": "*aul*"
                }
             }
         }
      }
   }
}

我看到的唯一不同之处在于路径中,您不需要在嵌套路径中设置示例(类型),只需要设置内部对象。 测试并给我一个反馈。