Elasticsearch 不同的过滤器值

标签 elasticsearch filter distinct nosql

我在 elasticsearch 中有一个大型文档存储,我想检索不同的过滤器值以显示在 HTML 下拉菜单上。

一个例子是这样的

[
    {
        "name": "John Doe",
        "deparments": [
            {
                "name": "Accounts"
            },
            {
                "name": "Management"
            }
        ]
    },
    {
        "name": "Jane Smith",
        "deparments": [
            {
                "name": "IT"
            },
            {
                "name": "Management"
            }
        ]
    }
]

下拉菜单应该有一个部门列表,即 IT、客户和管理。

请好心人指点我从 elasticsearch 中检索不同部门列表的正确方向?

谢谢

最佳答案

这是一项针对terms 聚合 ( documentation ) 的工作。

您可以像这样拥有不同的 departments 值:

POST company/employee/_search
{
  "size":0,
  "aggs": {
    "by_departments": {
      "terms": {
        "field": "departments.name",
        "size": 0 //see note 1
      }
    }
  }
}

在您的示例中,输出:

{
   ...
   "aggregations": {
      "by_departments": {
         "buckets": [
            {
               "key": "management", //see note 2
               "doc_count": 2
            },
            {
               "key": "accounts",
               "doc_count": 1
            },
            {
               "key": "it",
               "doc_count": 1
            }
         ]
      }
   }
}

两个附加说明:

  • size 设置为 0 会将最大桶数设置为 Integer.MAX_VALUE。如果有太多 departments 不同的值,请不要使用它。
  • 您可以看到键是 terms 分析 departments 值的结果。请务必在映射为 not_analyzed 的字段上使用您的 terms 聚合。

例如,使用我们的默认映射(departments.name 是一个analyzed 字符串),添加这个员工:

{
  "name": "Bill Gates",
  "departments": [
    {
      "name": "IT"
    },
    {
      "name": "Human Resource"
    }
  ]
}

会造成这样的结果:

{
   ...
   "aggregations": {
      "by_departments": {
         "buckets": [
            {
               "key": "it",
               "doc_count": 2
            },
            {
               "key": "management",
               "doc_count": 2
            },
            {
               "key": "accounts",
               "doc_count": 1
            },
            {
               "key": "human",
               "doc_count": 1
            },
            {
               "key": "resource",
               "doc_count": 1
            }
         ]
      }
   }
}

有了正确的映射:

POST company
{
  "mappings": {
    "employee": {
      "properties": {
        "name": {
          "type": "string"
        },
        "departments": {
          "type": "object",
          "properties": {
            "name": {
              "type": "string",
              "index": "not_analyzed"
            }
          }
        }
      }
    }
  }
}

同样的请求最终输出:

{
   ...
   "aggregations": {
      "by_departments": {
         "buckets": [
            {
               "key": "IT",
               "doc_count": 2
            },
            {
               "key": "Management",
               "doc_count": 2
            },
            {
               "key": "Accounts",
               "doc_count": 1
            },
            {
               "key": "Human Resource",
               "doc_count": 1
            }
         ]
      }
   }
}

希望这对您有所帮助!

关于Elasticsearch 不同的过滤器值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27020926/

相关文章:

python - 弹性查询失败,并显示以下错误异常:TransportError(400,u'search_phase_execution_exception',u'无法解析查询[*/abc *]')

elasticsearch - 如何在NEST 2.3.0中将 bool 查询与must子句和filter子句一起使用

node.js - 如何使用 mongoosastic 连接到 AWS Elasticsearch

javascript - 如何根据关键字过滤器切换 div 的可见性

android - RxJava 2. 在处理其他不同项目时延迟重试

mysql 与表中不同的记录具有正确的顺序

elasticsearch - Elasticsearch:禁用索引编制,但将copy_to应用于字段

filter - 在 Fortran 中是否可以确定两个多态对象是否是相同的派生类型?

r - 在 dplyr 中结合 grepl 过滤观察

MySQL SELECT DISTINCT ORDER BY问题