繁体   English   中英

ElasticSearch:如何通过不同位置的多个条件进行查询?

[英]ElasticSearch: How to query by multiple conditions in different locations?

到目前为止,我一直在尝试在丹麦 CVR 数据库 API 上构建这个 ElasticSearch Query,但没有成功。 基本上我试图找到公司

  1. 该公司与“deltager”(参与者)有关系,“enhedsNummer”(ID)等于 NUMBER
  2. 关系仍处于活动状态,即“期末”字段为空

如何构建具有多个这样的条件的查询?

    'query': {
        'bool': {
            'must': [
                {
                    'term': {'Vrvirksomhed.deltagerRelation.deltager.enhedsNummer': NUMBER},
        AND            
                    'term': {'Vrvirksomhed.deltagerRelation.organisationer.attributter.vaerdier.periode.gyldigTil': null}
                },
            ],
        },
    },
}

仅供参考:可以在http://distribution.virk.dk/cvr-permanent/_mapping找到数据库映射

你可以试试:

GET /cvr-permanent/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "term": {
            "Vrvirksomhed.deltagerRelation.deltager.enhedsNummer": {
              "value": "your_value_here"
        }
      }
    }
  ],
  "must_not": [
    {
      "exists": {
        "field": "Vrvirksomhed.deltagerRelation.organisationer.attributter.vaerdier.periode.gyldigTil"
       }
     }
   ]
  }
 }
}

这里的技巧是对 nil 值使用must_not/exist

PS我无法检查它,因为它需要授权。

看起来 ElasticSearch 查询不像我想要的那样动态(或者我不知道如何使用它们)。 相反,下面的 Python 代码似乎是生成所需结果的最佳选择:

import requests
import pandas as pd

# creation of empty lists:
virksomhedsnavne = []
virksomhedscvr = []
relation_fra = []
relation_til = []

# Pulling data (apparently limited to 3000 elements at a time):
for i in range(20):

    if i == 0:
        highestcvrnummer = 0
    else:
        highestcvrnummer = max(virksomhedscvr)
    
    headers = {
        'Content-Type': 'application/json',
    }

    json_data = {

        "_source": ["Vrvirksomhed.cvrNummer", "Vrvirksomhed.navne", "Vrvirksomhed.virksomhedMetadata.nyesteNavn.navn", "Vrvirksomhed.deltagerRelation"],

        "sort" : [{"Vrvirksomhed.cvrNummer" : {"order":"asc"}}],
      
        "query": {
            "bool": {
                "must": [
                    {
                        "term": {
                            "Vrvirksomhed.deltagerRelation.deltager.enhedsNummer": "some_value"
                        }
                    },
                    {
                        "range":{
                            "Vrvirksomhed.cvrNummer": {
                                "gt": highestcvrnummer
                            }
                        
                        }
                    }
                ]
            }
        },
        'size': 3000
    }

    response = requests.post('http://distribution.virk.dk/cvr-permanent/virksomhed/_search', headers=headers, json=json_data, auth=('USERNAME', 'PASSWORD'))
    json_data = response.json()['hits']['hits']

    # Aggregate and format data neatly
    for data in json_data:
        virksomhed_data = data['_source']['Vrvirksomhed']
        virksomhedscvr.append(virksomhed_data['cvrNummer'])
        try:
            virksomhedsnavne.append(virksomhed_data['virksomhedMetadata']['nyesteNavn']['navn'])
        except:
            virksomhedsnavne.append(virksomhed_data['navne'][0]['navn'])
        
        # Loop through all "deltagere" and find match with value
        for relation in virksomhed_data['deltagerRelation']:

            # If match found
            if relation['deltager']['enhedsNummer'] == some_value:
                
                # Make sure most recent period is chosen
                antalopdateringer = len(relation['organisationer'])-1
                relation_gyldig = relation['organisationer'][antalopdateringer]['medlemsData'][0]['attributter'][0]['vaerdier'][0]['periode']
                relation_fra.append(relation_gyldig['gyldigFra'])
                relation_til.append(relation_gyldig['gyldigTil'])
                break

#export to excel
dict = {'CVR nummer':virksomhedscvr, 'navn':virksomhedsnavne, 'Relation fra':relation_fra, 'Relation til':relation_til}
df = pd.DataFrame(dict)
df.to_excel("output.xlsx")

如果其他人正在使用丹麦 CVR 寄存器的 API,我希望这会有所帮助!

另外,如果您找到更好的解决方案,请告诉我:)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM