首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Elasticsearch -不同的值,而不是计数

Elasticsearch -不同的值,而不是计数
EN

Stack Overflow用户
提问于 2017-05-17 20:57:15
回答 3查看 446关注 0票数 0

我正在尝试执行类似于这个SQL查询的操作:

代码语言:javascript
运行
复制
SELECT * FROM table WHERE fileContent LIKE '%keyword%' AND company_id = '1' GROUP BY email

在阅读了类似于此的帖子之后,我有以下几点:

代码语言:javascript
运行
复制
{
    "query": {
        "bool": {
            "must": [{
                "match": {
                    "fileContent": {
                        "query": "keyword"
                    }
                }
            }],
            "filter": [{
                "terms": {
                    "company_id": [1]
                }
            }]
        }
    },
    "aggs": {
        "group_by_email": {
            "terms": {
                "field": "email",
                "size": 1000
            }
        }
    },
    "size": 0
}

字段映射是:

代码语言:javascript
运行
复制
{
  "cvs" : {
    "mappings" : {
      "application" : {
        "_meta" : {
          "model" : "Acme\\AppBundle\\Entity\\Application"
        },
        "dynamic_date_formats" : [ ],
        "properties" : {
          "email" : {
            "type" : "keyword"
          },
          "fileContent" : {
            "type" : "text"
          },
          "company_id" : {
            "type" : "text"
          }
        }
      }
    }
  }
}

..。它们是从Symfony config.yml生成的:

代码语言:javascript
运行
复制
fos_elastica:
    clients:
        default:
            host: "%elastica.host%"
            port: "%elastica.port%"
    indexes:
        cvs:
            client: default
            types:
               application:
                    properties:
                        fileContent: ~
                        email:
                          index: not_analyzed
                        company_id: ~
                    persistence:
                        driver: orm
                        model: Acme\AppBundle\Entity\Application
                        provider: ~
                        finder: ~

过滤器运行良好,但我发现hits:hits不返回任何项(如果删除size:0,则返回与搜索匹配的所有结果),并且aggregations:group_by_email:buckets有组计数,但没有记录本身。分组的记录没有返回,我需要的就是这些。

如果这是您喜欢的风格,我也尝试过使用FOSElasticBundle,如果这是您的首选风格(这是可行的,但没有分组/聚合):

代码语言:javascript
运行
复制
$boolQuery = new \Elastica\Query\BoolQuery();

$filterKeywords = new \Elastica\Query\Match();
$filterKeywords->setFieldQuery('fileContent', 'keyword');
$boolQuery->addMust($filterKeywords);

$filterUser = new \Elastica\Query\Terms();
$filterUser->setTerms('company_id', array('1'));
$boolQuery->addFilter($filterUser);

$finder = $this->get('fos_elastica.finder.cvs.application');

谢谢。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-05-23 19:50:17

top_hits:{size:1}似乎是我所需要的,我一直在玩弄安德烈的回答。这将为聚合中的每个桶返回一个记录。

代码语言:javascript
运行
复制
  "aggs": {
    "group_by_email": {
      "terms": {
        "field": "email",
        "size": 1000
      },
      "aggs": {
        "sample_docs": {
          "top_hits": {
            "size": 1
          }
        }
      }
    }
  }

参考文献:命中

票数 1
EN

Stack Overflow用户

发布于 2017-05-17 21:02:57

为此,您需要在已经使用的聚合内部使用terms

代码语言:javascript
运行
复制
  "aggs": {
    "group_by_email": {
      "terms": {
        "field": "email",
        "size": 1000
      },
      "aggs": {
        "sample_docs": {
          "top_hits": {
            "size": 100
          }
        }
      }
    }
  }
票数 1
EN

Stack Overflow用户

发布于 2020-03-10 14:36:39

top_hits也帮了我。我也遇到了一些麻烦,但最终还是想出了解决办法。,下面是我的解决方案:

代码语言:javascript
运行
复制
{
    "query": {
        "nested": {
            "path": "placedOrders",
            "query": {
                "bool": {
                    "must": [
                        {
                            "term": {
                                "placedOrders.ownerId": "0a9fdef0-4508-4f9c-aa8c-b3984e39ad1e"
                            }
                        }
                    ]
                }
            }
        }
    },
    "aggs": {
        "custom_name1": {
            "nested": {
                "path": "placedOrders"
            },
            "aggs": {
                "custom_name2": {
                    "terms": {
                        "field": "placedOrders.propertyId"
                    },
                    "aggs": {
                        "custom_name3": {
                            "top_hits": {
                                "size": 1,
                                "sort": [
                                    {
                                        "placedOrders.propertyId": {
                                            "order": "desc"
                                        }
                                    }
                                ]
                            }
                        }
                    }
                }
            }
        }
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44034655

复制
相关文章

相似问题

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