ElasticSearch查询子对象 [英] ElasticSearch query sub-objects

查看:82
本文介绍了ElasticSearch查询子对象的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我今天在文档中徘徊了很多,但找不到答案;可能是因为我是Elastic的新手,还真的不了解整个ES术语.

I wandered through the docs a lot today, but can't find the answer; probably because I'm new to Elastic and don't really know the entire ES-terminology yet.

说我有一个 books 类型,其中包含一堆好书.每本书都有一个嵌套的作者.

Say I have a books type containing a bunch of, well - books. Each book has a nested author.

{
  "name": "Me and Jane",
  "rating": "10",
  "author": {
    "name": "John Doe",
    "alias":"Mark Twain"
  }
}

现在,我知道我们可以像这样查询作者字段:

Now, I know we can query the authors fields like this:

"match": {
   "author.name": "Doe"
 }

但是,如果我想搜索所有作者字段怎么办?我尝试了 author._all ,该方法不起作用.

But what if I want to search across all the author fields? I tried author._all, which doesn't work.

推荐答案

另一种方法是使用通配符字段名称的 multi_match :

Another approach is multi_match with wildcard field names: https://www.elastic.co/guide/en/elasticsearch/guide/current/multi-match-query.html#_using_wildcards_in_field_names

我想是这样的

  "query": {
    "nested": {
      "path": "author",
      "query": {
        "multi_match": {
          "query": "doe",
          "fields": [
            "author.*"
          ]
        }
      }
    }
  }

更新:提供了完整的示例

UPDATE: full sample provided

PUT /books
{
  "mappings": {
    "paper": {
      "properties": {
        "author": {
          "type": "nested",
          "properties": {
            "name": {
              "type": "string"
            },
            "alias": {
              "type": "string"
            }
          }
        }
      }
    }
  }
}

POST /books/paper/_bulk
{"index":{"_id":1}}
{"author":[{"name":"john doe","alias":"doe"},{"name":"mark twain","alias":"twain"}]}
{"index":{"_id":2}}
{"author":[{"name":"mark doe","alias":"john"}]}
{"index":{"_id":3}}
{"author":[{"name":"whatever","alias":"whatever"}]}

GET /books/paper/_search
{
  "query": {
    "nested": {
      "path": "author",
      "query": {
        "multi_match": {
          "query": "john",
          "fields": [
            "author.*"
          ]
        }
      }
    }
  }
}

结果是:

   "hits": {
      "total": 2,
      "max_score": 0.5906161,
      "hits": [
         {
            "_index": "books",
            "_type": "paper",
            "_id": "2",
            "_score": 0.5906161,
            "_source": {
               "author": [
                  {
                     "name": "mark doe",
                     "alias": "john"
                  }
               ]
            }
         },
         {
            "_index": "books",
            "_type": "paper",
            "_id": "1",
            "_score": 0.5882852,
            "_source": {
               "author": [
                  {
                     "name": "john doe",
                     "alias": "doe"
                  },
                  {
                     "name": "mark twain",
                     "alias": "twain"
                  }
               ]
            }
         }
      ]
   }

这篇关于ElasticSearch查询子对象的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆