json - 尝试从带有Elasticsearch的多个术语的查询中获取过滤后的响应

标签 json laravel elasticsearch guzzle

如标题所述,我试图进行一个查询,该查询不返回整个文档,而仅返回某些字段,但具有多个确切术语。
我使用laravel的Guzzle构造查询:

            $response = $client->post('cvr-permanent/_search', [
        'auth' => ['USERNAME', 'PASSWORD'],
        'json' => [
            "_source" => ["Vrvirksomhed.attributter", "Vrvirksomhed.deltagerRelation.organisationer.medlemsData.attributter"],
            "query" => [
                "bool"=> [
                    "must"=> [
                        [
                            "term"=> [
                                "Vrvirksomhed.cvrNummer" => $vat
                            ]
                        ]],
                    "must_not"=> [ ],
                    "should"=> [ ]
                ]
                            ],
                    "from"=> 0,
                    "size"=> 10,
                    "sort"=> [ ]
        ]
    ]);

我想要Vrvirksomhed.cvrNummer中的数据,而我想要的数据是Vrvirksomhed.attributter.type => "KAPITAL"Vrvirksomhed.deltagerRelation.deltager.navne以及Vrvirksomhed.deltagerRelation.organisation.attributter.type = "EJERANDEL_PROCENT"的位置

我对如何使此查询有效感到非常困惑,因为它是多个术语,但实际上并非如此。对Elasticsearch来说也很新。
我尝试了“术语”,但无法真正发挥作用。
我在上面进行的查询返回了我不需要的太多数据,而不是我需要的所有数据。

希望你能帮忙

**编辑

也许像这样,但翻译成elasticsearchSELECT attributter.type": "KAPITAL" AND deltagerRelation.deltager.navne AND deltagerRelation.organisation.attributter.type": "EJERANDEL_PROCENT FROM Vrvirksomhed WHERE cvrNummer = $vat
***编辑
希望更多的澄清:

好的,对不起,请尝试使它更清晰。我想要的对象是具有一定增值税号的公司。所以Vrvirksomhed.cvrNummer就是这个,这必须是术语。它返回一个巨大的对象,其中包含多个数组。我不想要所有这些数据,而只是其中一些。我从这个大对象中需要的数据是Vrvirksomhed.attributter数组中的对象,该对象具有type : "KAPITAL字段,而不是所有属性。然后我想要Vrvirksomhed.deltagerRelation.deltager.navne,只需将其放在_source中就可以得到,因为我想要所有这些对象。但是然后我想要Vrvirksomhed. deltagerRelation.organisation.attributter再次是attributter数组中的一堆对象,但是我只想要带有type : "EJERANDEL_PROCENT的对象

所以我不能真正将它们添加为附加的“术语”,因为唯一的真实术语是“cvrNummer”,其他所有内容都只是过滤响应。我尝试使用过滤器等,但无济于事

这是一个粘贴框,因此您可以看到我正在处理的clusterfuck。到目前为止,这就是我能够将其排序为_source的内容,但没有对“KAPITAL”和“EJERANDEL_PROCENT”进行额外的“过滤”
https://pastebin.com/b8hWWz1R

最佳答案

您只想获取符合多个条件的文档,并且只需要这些文档中的一部分字段,对吗?

在SQL中(使用字段名称和结构具有一些自由),查询将类似于:

SELECT cvrNummer
FROM Vrvirksomhed
WHERE attributter_type = 'KAPITAL'
  AND deltagerRelation_deltager_navne = 'you left this out in your question'
  AND deltagerRelation_organisation_attributter_type = 'EJERANDEL_PROCENT'

正如the Elasticsearch Guide†中所解释的,Elasticsearch中的等效项是一个查询,该查询包含一个bool clause,其中包含您的所有条件;一个_source parameter,它指示您要在响应中返回的字段。类似于以下内容:
{
    "_source": ["cvrNummer"]
    "query": {
        "bool": {
            "must": [
                { "term": "attributter.type": "KAPITAL" },
                { "term": "deltagerRelation.deltager.navne": "you left this out in your question" },
                { "term": "deltagerRelation.organisation.attributter.type": "EJERANDEL_PROCENT" }
            ]
        }
    }
}

†请注意,本指南中的语法适用于Elasticsearch2.x。当前版本是7.x,此后发生了许多变化!
  • 有关如何使用新语法构造bool查询的信息,请参见https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-bool-query.html
  • 有关可能如何使用术语级查询的信息,请参见https://www.elastic.co/guide/en/elasticsearch/reference/current/term-level-queries.html
  • 也可以看到https://www.elastic.co/guide/en/elasticsearch/reference/current/query-filter-context.html并考虑使用过滤器上下文,因为您可能并不在乎查询的分数。
  • 关于json - 尝试从带有Elasticsearch的多个术语的查询中获取过滤后的响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56059595/

    相关文章:

    indexing - elasticsearch中的滚动如何处理不断更新的数据?

    couchdb - 我正在将River-couchdb与ElasticSearch一起使用,并想将其last_seq重置为0。有人知道这是否可能吗?

    java - JAXB 条件绑定(bind)

    javascript - 将数组的第一项连接到第二个数组 JavaScript 的第一项

    jquery - JSONP请求错误处理

    mysql - Laravel 原始查询无法识别别名

    python - 使用脚本部分更新文档并添加缺少的字段

    JSON 解析器 -java.lang.NoSuchFieldError : defaultReader

    php - 如何在返回数据时禁用或删除 updated_At 和 Created_at

    javascript - 无法为 Summernote 所见即所得编辑器设置值