首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在一个记录中获得多个匹配字段的命中次数?

如何在一个记录中获得多个匹配字段的命中次数?
EN

Stack Overflow用户
提问于 2015-08-08 15:27:48
回答 1查看 182关注 0票数 0

我有类似的记录

代码语言:javascript
复制
{
    "who": "John",
    "hobby": [
        {"name": "gardening",
         "skills": 2
         },
        {"name": "sleeping",
         "skills": 3
         },
        {"name": "darts",
         "skills": 2
         }
    ]
}
,
{
    "who": "Mary",
    "hobby": [
        {"name": "gardening",
         "skills": 2
         },
        {"name": "volleyball",
         "skills": 3
         },
        {"name": "kung-fu",
         "skills": 2
         }
    ]
}

我正在构建一个查询,该查询将回答以下问题:“我们对skills=2有多少爱好?”

上面的例子的答案是3 ("gardening"对两者来说都是通用的,而且每一个都有另一个唯一的)。

我尝试过的每一个"query""query"+"aggs"都在['hits']['hits']"aggs"中返回,每个都满足查询的要求)。

是否有一种方法可以构建一个查询,以便返回字段总数(在上面的示例中:与该查询相匹配的列表"hobby"**)元素?**(字段,而不是文档)

注:如果我的文件是平的:

代码语言:javascript
复制
{"who": "John", "name": "gardening", "skills": 2},
{"who": "John", "name": "sleeping", "skills": 3},
(...)
{"who": "Mary", "name": "kung-fu", "skills": 2}

那么一个简单的"query"来匹配"skills": 2 + "name"上的一个聚合“就可以完成这项工作。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-08-09 04:03:10

是的,您可以使用 type并使用inner_hits和/或 aggregations来实现这一点。

下面是您应该使用的映射:

代码语言:javascript
复制
curl -XPUT localhost:9200/hobbies -d '{
  "mappings": {
    "hob": {
      "properties": {
        "who": {
          "type": "string"
        },
        "hobby": {
          "type": "nested",      <--- the hobby list is of type nested
          "properties": {
            "name": {
              "type": "string",
              "index": "not_analyzed"
            },
            "skills": {
              "type": "integer"
            }
          }
        }
      }
    }
  }
}

然后,我们可以使用_bulk端点插入两个示例文档,如下所示:

代码语言:javascript
复制
curl -XPOST localhost:9200/hobbies/hob/_bulk -d '
{"index":{}}
{"who":"John", "hobby":[{"name": "gardening","skills": 2},{"name": "sleeping","skills": 3},{"name": "darts","skills": 2}]}
{"index":{}}
{"who":"Mary", "hobby":[{"name": "gardening","skills": 2},{"name": "volley-ball","skills": 3},{"name": "kung-fu","skills": 2}]}
'

最后,我们可以查询您的索引中有多少爱好有这样的skills: 2

代码语言:javascript
复制
curl -XPOST localhost:9200/hobbies/hob/_search -d '{
  "_source": false,
  "query": {
    "nested": {
      "path": "hobby",
      "query": {
        "term": {
          "hobby.skills": 2
        }
      },
      "inner_hits": {}         <---- this will return only the matching nested fields with skills=2
    }
  },
  "aggs": {
    "hobbies": {
      "nested": {
        "path": "hobby"
      },
      "aggs": {
        "skills": {
          "filter": {
            "term": {
              "hobby.skills": 2
            }
          },
          "aggs": {
            "by_field": {         <--- this will return a breakdown of the fields with skills=2
              "terms": {
                "field": "name"
              }
            }
          }
        }
      }
    }
  }
}'

此查询将返回的内容是

  1. hits部分中,具有skills: 2的四个字段
  2. aggs部分中,有skills: 2的三个不同字段的细分
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31895541

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档