我正在尝试进行术语过滤查询,以获取域名列表中每个域的文档数量:
GET /myindex/_count
{
"query": {
"filtered": {
"filter": {
"terms": {
"domain": ["w3.org"]
}
}
}
}
}
返回25.我有一个包含几千个域的列表,并且希望在1个查询中执行此操作。那可能吗?我试过了:
GET /myindex/_count
{
"query": {
"bool": {
"must": {
"terms": {
"domain": [
"w3.org",
"google.com",
...,
]
}
}
}
}
}
但这给了我一个数字(而我需要按每个域分解),例如:
w3.org: 25,
google.com: 143,
...
答案 0 :(得分:1)
query
不会为找到的每个匹配字词返回计数,它会显示找到了多少匹配的文档,基本上是在弹性搜索术语中命中的。要获得您发现的每个字词的数字,必须使用aggregations
,可以获得更多可用数据here。
对于您的特定情况,您必须使用Terms Aggregation
,提供更多可用数据here。
您的查询将如下所示
GET /myindex/_search
{
"query": {
"bool": {
"must": {
"terms": {
"domain": [
"w3.org",
"google.com"
]
}
}
}
},
"aggregations":{
"domain_count":{
"terms":{
"field": "domain"
}
}
}
}
响应看起来像这样,doc_count
中的key
和buckets
是您所需的结果。
{
...
"aggregations" : {
"domain_count" : {
"doc_count_error_upper_bound" : 46,
"buckets" : [
{
"key" : "w3.org",
"doc_count" : 100
},
{
"key" : "google.com",
"doc_count" : 52
},
...
]
}
}
}
确保您使用的是_search
终结点,而不是_count
。
如果您不想限制w3.org
或google.com
等特定域的查询,可以提供match_all
查询。它会为您提供domain
所有可能的doc_count
值。
GET /myindex/_search
{
"query": {
"bool": {
"must": {
"match_all": {
}
}
}
},
"aggregations":{
"domain_count":{
"terms":{
"field": "domain"
}
}
}
}