Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[Python] XML in ElasticSearch? convert to Json != consistent

Pagina: 1
Acties:

  • xychix
  • Registratie: September 2000
  • Laatst online: 10-11 15:50

xychix

FreeBSD Rules !

Topicstarter
Ik draai een tool welke een XML van ~ 900 regels oplevert met een diepgang van ongeveer 9 niveau's. Deze benoem ik in deze post als het XML-document

Ik zal in de komende tijd 100.000+ van deze XML-documenten genereren.

Ik ben een Flask (python web framework) frontend aan het bouwen welke een eigen kleine sql (nu sqlite3, zal postgress worden) database heeft voor wat usermanagement en een paar hoofd variabelen (welke XML-documenten zijn interessant voor welke user en gedurende welke periode in tijd).

Daar naast zoek ik een manier om mijn XML documenten te kunnen opslaan zodat ik ze kan querien op een specifiek veld ergens in de XML.
  • Ik sta open voor suggesties qua opslag, als het maar met python uit te querien is en all info uit de XML kan ophoesten zonder dat ik voor dit document en eventuele toekomst versies een compleet ERD moet gaan tekenen
Voor nu ben ik als NoSQL beginner aan het uitzoeken of een NoSQL database als ElasticSearch mij hierbij kan helpen. Alles wijst er op dat ES het liefst JSON heeft.
Dit lijkt geen enkel probleem met xmltodict kun je een xml in python vrij makkelijk omzetten naar JSON. Ik loop daarbij echter tegen het volgende probleem aan:
De json versie van de XML heeft in sommige gevallen een unicode string (op 2 na laatste regel) en soms meerdere strings die dan in een list zitten. type is dan dus list.

Als ik uiteindelijke een query bouw in ES (moet ik nog uit zoeken) wil ik wel kunnen query-en op 'alle docs waar Person==John

python live example: (ook hier te vinden http://pastebin.com/NMHPqGSd)
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
    >>> import xmltodict
    >>>
    >>> x = """
    ... <xml>
    ...  <group title="persons">
    ...  <person>John</person>
    ...  </group>
    ... </xml>
    ... """
    >>>
    >>> j1 = xmltodict.parse(x)
    >>> j1
    OrderedDict([(u'xml', OrderedDict([(u'group', OrderedDict([(u'@title', u'persons'), (u'person', u'John')]))]))])
    >>>
    >>> x = """
    ... <xml>
    ...  <group title="persons">
    ...   <person>Jaap</person>
    ...   <person>John</person>
    ...  </group>
    ... </xml>
    ... """
    >>>
    >>> j2 = xmltodict.parse(x)
    >>> j2
    OrderedDict([(u'xml', OrderedDict([(u'group', OrderedDict([(u'@title', u'persons'), (u'person', [u'Jaap', u'John'])]))]))])
    >>>
    >>> j1['xml']['group']['person']
    u'John'
    >>> j2['xml']['group']['person']
    [u'Jaap', u'John']
    >>> type(j1['xml']['group']['person'])
    <type 'unicode'>
    >>> type(j2['xml']['group']['person'])
    <type 'list'>
    >>>


Heeft iemand enig idee of ES of een andere database dir voor mij kan oplossen (Of moet ik zelf alle json resultaten aanpassen zodat een enkel item altijd in een list 1 item staat)?

Every failure offers you a new opportunity! | Lokatie database|GoT - Notepad


  • xychix
  • Registratie: September 2000
  • Laatst online: 10-11 15:50

xychix

FreeBSD Rules !

Topicstarter
Om te beginnen met het beantwoorden van mijn eigen vraag (voor het nageslacht in dit forum).

De bovenstaande setup gaat prima in ES. Queryen werkt ook prima.
Ik heb hiervoor geen mappings gemaakt maar ben gewoon gaan uploaden.

Nu blijkt dat de ES wel een versie nummer bijhoud maar geen oude versies kan tonen. Ik ga dus zelf een history bouwen. Daarnaast kom ik door wat query uitdagingen tot de conclusie dat 'Group' een document is en 'person' ook. Ik ga deze Denormaliseren en kijken of ik Group 1 of meer links naar een Person kan geven.
Dit zou ook storage besparen want in complexe situaties is het hoogstwaarschijnlijk dat Person lid is van 1 of meer Groups.

Later meer :)

Every failure offers you a new opportunity! | Lokatie database|GoT - Notepad


  • xychix
  • Registratie: September 2000
  • Laatst online: 10-11 15:50

xychix

FreeBSD Rules !

Topicstarter
Ik heb mijn complexe json gesplit.

tot
1 json Group
en 0-N jsons Person
dan in pseudocode:
group['member'] = Person.uID)

daarna stop ik alles in ES waarbij person is geindexd op uID. Effectief een hash over alle velden zodat ik zeker weet dat een change leid tot een nieuwe person. Dit zou niet wenselijk zijn bij een echte Person maar bij mij is dat een totaal ander object het Person Group idee was alleen als voorbeeld.

Every failure offers you a new opportunity! | Lokatie database|GoT - Notepad