弹性搜索有可能吗?

时间:2015-09-07 14:22:15

标签: php elasticsearch

以下是我的JSON文档的示例格式,它存储在elasticsearch中。

{
    "_index": "in22",
    "_type": "event",
    "_id": "ET00009709",
    "_version": 1,
    "_score": 1,
    "_source": {
        "Group": "Event",
        "Title": "Jurassic World",
        "_boost": 3,
        "inner_hits": [
            {
            "Code": "ET00009709",
            "IsDefault": "",
            "Language": "English",
            "Format": "3D",
            "Region": "MUMBAI"
        },
        {
            "Code": "ET00009710",
            "IsDefault": "Y",
            "Language": "English",
            "Format": "2D",
            "Region": "CHEN"
        },
        {
            "Code": "ET00009713",
            "IsDefault": "",
            "Language": "Hindi",
            "Format": "2D",
            "Region": "MUMBAI"
        },
        {
            "Code": "ET00009714",
            "IsDefault": "",
            "Language": "Tamil",
            "Format": "3D",
            "Region": "MUMBAI"
        },
        {
            "Code": "ET00009715",
            "IsDefault": "",
            "Language": "Hindi",
            "Format": "3D",
            "Region": "MUMBAI"
        },
        {
            "Code": "ET00009716",
            "IsDefault": "",
            "Language": "Bengali",
            "Format": "2D",
            "Region": "MUMBAI"
        }
        ]
    }
}

现在我想要实现的是每当我搜索Title=Jurassic World and region=MUMBAI时,我都应该获得上述文档,但inner_hits不应包含

{
                "Code": "ET00009710",
                "IsDefault": "Y",
                "Language": "English",
                "Format": "2D",
                "Region": "CHEN"
 }

这是可以实现的吗?

我到目前为止尝试的是

{
  "query": {
    "nested": {
      "path": "inner_hits",
      "query": {
        "bool": {
          "must": [
            {
              "match": {
                "inner_hits.Region": "MUMBAI"
              }
            }
          ]
        }
      }
    }
  }
}

但是我无法达到我想要的效果,它根本没有删除包含Region: Chen的块

如果有人知道如何解决这个问题,请分享。 感谢

1 个答案:

答案 0 :(得分:1)

一个解决方法是使用elasticsearch 1.5中添加的inner_hit功能。 这将返回与嵌套查询匹配的嵌套文档。

示例:

   {
   "_source": {
      "exclude": ["inner_hits.*"]
   },
   "query": {
      "nested": {
         "path": "inner_hits",
         "query": {
            "bool": {
               "must": [
                  {
                     "match": {
                        "inner_hits.Region": "MUMBAI"
                     }
                  }
               ]
            }
         },
         "inner_hits": {
              "size" : 10
          }
      }
   }
}

回复

"hits": [
     {
        "_index": "test",
        "_type": "test",
        "_id": "1",
        "_score": 3.8630462,
        "_source": {
           "Group": "Event",
           "_boost": 3,
           "inner_hits": [],
           "Title": "Jurassic World"
        },
        "inner_hits": {
           "inner_hits": {
              "hits": {
                 "total": 2,
                 "max_score": 3.8630462,
                 "hits": [
                    {
                       "_index": "test",
                       "_type": "test",
                       "_id": "1",
                       "_nested": {
                          "field": "inner_hits",
                          "offset": 2
                       },
                       "_score": 3.8630462,
                       "_source": {
                          "Code": "ET00009713",
                          "IsDefault": "",
                          "Language": "Hindi",
                          "Format": "2D",
                          "Region": "MUMBAI"
                       }
                    },
                    {
                       "_index": "test",
                       "_type": "test",
                       "_id": "1",
                       "_nested": {
                          "field": "inner_hits",
                          "offset": 0
                       },
                       "_score": 3.8630462,
                       "_source": {
                          "Code": "ET00009709",
                          "IsDefault": "",
                          "Language": "English",
                          "Format": "3D",
                          "Region": "MUMBAI"
                       }
                    }
                 ]
              }
           }
        }
     }
  ]

除了inner_hits之外,响应中还有一个_source,它只包含匹配的嵌套文档。默认情况下,inner_hits会返回前3个嵌套文档。您可以使用size选项进行调整。