elasticsearch - Elasticsearch查找孙子总数

标签 elasticsearch join

我正在尝试使用Elasticsearch中的JOIN为我的数据建立映射,这些数据具有以下关系:公司与组之间是一对多关系,而组与用户之间是一对多关系。

这是我的映射:

PUT /company
{
  "settings": {
    "number_of_shards": 1, "number_of_replicas": 0,
    "mapping.single_type": true
  },
  "mappings": {
    "doc": {
      "properties": {
        "company": { "type": "text" },
        "group": { "type": "text" },
        "user": { "type": "text" },
        "company_relations": {
          "type": "join",
          "relations": {
            "company": "group",
            "group": "user"
          }
        }
      }
    }
  }
}

创建映射并填充索引之后。如何查询特定公司有多少用户?

最佳答案

首先,将您的映射更改为以下内容。原因是您无法在text字段上应用和执行聚合查询。您将需要keyword字段。

我也不建议您启用fielddata: true,因为一旦索引大小增加,它可能会影响性能,而且毫无意义。有关此here的更多信息

{ 
   "settings":{ 
      "number_of_shards":1,
      "number_of_replicas":0,
      "mapping.single_type":true
   },
   "mappings":{ 
      "doc":{ 
         "properties":{ 
            "company":{ 
               "type":"text",
               "fields":{ 
                  "keyword":{ 
                     "type":"keyword"
                  }
               }
            },
            "group":{ 
               "type":"text"
            },
            "user":{ 
               "type":"text",
               "fields":{ 
                  "keyword":{ 
                     "type":"keyword"
                  }
               }
            },
            "company_relations":{ 
               "type":"join",
               "relations":{ 
                  "company":"group",
                  "group":"user"
               }
            }
         }
      }
   }
}

如下所述,提取您的文档(为简单起见,我只使用了相关字段,而不使用关系)

样本文档:
POST company/doc/1
{
  "company": "daimler",
  "group": "abc",
  "user": "austin"
}

POST company/doc/2
{
  "company": "daimler",
  "group": "abc",
  "user": "matt"
}

现在,您的查询可以像下面这样简单,其中我使用Terms AggregationCardinality Aggregation来获取您要查找的内容:

汇总查询:
POST company/_search
{
  "size": 0,
  "query": {
    "bool": {
      "must": [
        {
          "term": {
            "company.keyword": "daimler"
          }
        }
      ]
    }
  }, 
  "aggs": {
    "my_companies": {
      "terms": {
        "field": "company.keyword",
        "size": 10
      },
      "aggs": {
        "my_users_count": {
          "cardinality": {
            "field": "user.keyword"
          }
        }
      }
    }
  }
}

请注意,我已经在company.keyworduser.keyword字段上使用了聚合。

以下是回应的显示方式

响应:
{
  "took" : 7,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 2,
      "relation" : "eq"
    },
    "max_score" : null,
    "hits" : [ ]
  },
  "aggregations" : {
    "my_companies" : {
      "doc_count_error_upper_bound" : 0,
      "sum_other_doc_count" : 0,
      "buckets" : [
        {
          "key" : "daimler",
          "doc_count" : 2,
          "my_users_count" : {
            "value" : 2
          }
        }
      ]
    }
  }
}

希望有帮助!

关于elasticsearch - Elasticsearch查找孙子总数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58610058/

相关文章:

c# - 使用elasticsearch进行搜索(包含)

sql - 自连接比较来自同一张表的季度数据?

php - 具有多个 COUNT() 的多个 LEFT JOINS

sql - SQL 中的子查询和连接

MySQL 双连接/数据透视表

Python Django 模型执行连接查询

json - 如何编写这些查询?在ElasticSearch和C#中使用

elasticsearch - Elasticsearch ,从头开始无法正常工作

python - 为什么 Haystack 返回非词干结果?

ElasticSearch:经常排序的字段的映射