[laravel] Elasticsearch + autcomplete/zoeken + one-to-many

Pagina: 1
Acties:

Vraag


Acties:
  • 0 Henk 'm!

  • Crazy-
  • Registratie: Januari 2002
  • Laatst online: 01-10 23:31

Crazy-

Best life ever

Topicstarter
Momenteel bezig met een POC van een autocomplete / zoek functie

Doel:
zoeken naar een contactpersoon en/of een product en als autocomplete hint teruggeven in het HTML formulier.

2 Eloquent models: Product & Relatie
de relaties kunnen zijn:

1) Relatie (1) + Product (N+1)
2) Relatie (1) zonder Product (null)
2) Product (1) zonder Relatie (null)

Optie 1: Gefilterde resultaat (indien gevonden) klik je aan op basis van Product.ID kan het formulier ingevuld en opgeslagen worden.

Optie 2: geen Product is gevonden, maar wel een Relatie kan je een Product aanmaken

Optie 3: geen Relatie gevonden, maar wel een product kan je een relatie aanmaken
(Dat is verdere FrontEnd logica en staat hier los van)

Huidige opzet
via de (onderstaande) package vul ik een ES index, waarbij ik nu Relatie als leidend heb. Hierbij geef ik in de model een makeAllSearchableUsing with('products'). In elk ES document komt dan een output als:

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
 -document: ElasticAdapter\Documents\Document {#1433 ▼
          -id: "14"
          -content: array:17 [▼
            "id" => 14
            "company" => "Tweakers BV"
            "firstname" => "Crazy"
            "middlename" => null
            "lastname" => "Twealker"
            "street" => "Tweakerslaan"
            "number" => "69"
            "addition" => null
            "postcode" => "1234 AA"
            "city" => "Specialcity"
            "phonenumber" => null
            "mobilenumber" => "0123456789"
            "email" => "@gmail.com"
            "product" => array:2 [▼
              0 => array:7 [▼
                "id" => 5
                "internal_code" => "XXX555"
                "code" => "0234"
                "relation_id" => 14
              ]
              1 => array:7 [▼
                "id" => 6
                "internal_code" => "YYY111"
                "code" => "1234"
                "relation_id" => 14
              ]
            ]
          ]
        }


Probleem
In eerste instantie is dit deels prima; echter als ik als zoekterm YYY opgeef wil je uiteraard alleen de Relatie met Product.internal_code = YYY111 terug krijgen. (en niet met beide producten!)

En daar gaat het compleet mis! 8)7

relevantie software c.q. aanvullende packagesIk weet dat er ook een 'autocomplete' analyzer is, heb mij daar echter nog niet volledig in verdiept verder, maar wat ik zo begrijp geldt dat voor puur een enkele regel text analyzer i.p.v. multiple velden

Waar maak ik de denkfout in dit geval?

Ik ben 'bang' dat ik een verkeerde index opzet heb en deze (volledig) los moet gaan trekken van:
1. de package opzet, welke niet goed/slecht om kan gaat relaties c.q. de index mapping incorrect is;
2. de basis opzet van de models;

12,85kWp - ZB 7,5m2/400l - 5kW Pana H WP (CV&SWW) - 13,8kWh accu

Alle reacties


Acties:
  • 0 Henk 'm!

  • Gomez12
  • Registratie: Maart 2001
  • Laatst online: 17-10-2023
Wat gaat er precies mis? Wat krijg je nu terug?

Want in je voorbeeld zie ik maar 1x YYY staan, oftewel je kan (stemming etc daargelaten) volgens je voorbeeld maar 1 antwoord krijgen en dat lijkt me dan gelijk het juiste. Of jij moet aangeven waar het fout gaat.
Maar zeggen "Het gaat compleet mis" daar kunnen niet zoveel mensen iets mee.

Acties:
  • 0 Henk 'm!

  • Crazy-
  • Registratie: Januari 2002
  • Laatst online: 01-10 23:31

Crazy-

Best life ever

Topicstarter
Gomez12 schreef op woensdag 11 november 2020 @ 15:00:
Wat gaat er precies mis? Wat krijg je nu terug?

Want in je voorbeeld zie ik maar 1x YYY staan, oftewel je kan (stemming etc daargelaten) volgens je voorbeeld maar 1 antwoord krijgen en dat lijkt me dan gelijk het juiste. Of jij moet aangeven waar het fout gaat.
Maar zeggen "Het gaat compleet mis" daar kunnen niet zoveel mensen iets mee.
Wel ik gaf het niet helemaal duidelijk aan denk ik : je hebt gelijk de Relatie die ik terug krijg klopt wel maar ik wil niet het tweede Product er bij hebben. Dus als ik zoek naar YYY mag alleen die terugkomen.

Nu komt (soms kom je achter dingen als je aan het typen bent ...) ik de Relaties toevoeg aan de index _relations als 1+N

Waarschijnlijk moet ik 1 centrale index maken & hierin elk (enke) product, (enkel) relatie en product/relatie als een platte rij toevoegen; zoiets als:


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
37
38
39
40
[
    [
        "id"                    => 14,
        "company"               => "Tweakers BV",
        "firstname"             => "Crazy",
        "middlename"            => null,
        "lastname"              => "Twealker",
        "street"                => "Tweakerslaan",
        "number"                => "69",
        "addition"              => null,
        "postcode"              => "1234 AA",
        "city"                  => "Specialcity",
        "phonenumber"           => null,
        "mobilenumber"          => "0123456789",
        "email"                 => "@gmail.com",
        "product_id"            => 5,
        "product_internal_code" => "XXX555",
        "product_code"          => "0234",
        "product_relation_id"   => 14,
    ],
    [
        "id"                    => 14,
        "company"               => "Tweakers BV",
        "firstname"             => "Crazy",
        "middlename"            => null,
        "lastname"              => "Twealker",
        "street"                => "Tweakerslaan",
        "number"                => "69",
        "addition"              => null,
        "postcode"              => "1234 AA",
        "city"                  => "Specialcity",
        "phonenumber"           => null,
        "mobilenumber"          => "0123456789",
        "email"                 => "@gmail.com",
        "product_id"            => 6,
        "product_internal_code" => "YYY111",
        "product_code"          => "1234",
        "product_relation_id"   => 14,
    ],
];

[ Voor 62% gewijzigd door Crazy- op 11-11-2020 15:21 ]

12,85kWp - ZB 7,5m2/400l - 5kW Pana H WP (CV&SWW) - 13,8kWh accu


Acties:
  • 0 Henk 'm!

  • Gomez12
  • Registratie: Maart 2001
  • Laatst online: 17-10-2023
Crazy- schreef op woensdag 11 november 2020 @ 15:07:
[...]
Wel ik gaf het niet helemaal duidelijk aan denk ik : je hebt gelijk de Relatie die ik terug krijg klopt wel maar ik wil niet het tweede Product er bij hebben. Dus als ik zoek naar YYY mag alleen die terugkomen.
Dan wil je dus niet de relatie leidend hebben (want die bevat namelijk alle producten).
Maar je wilt het product leidend hebben en vandaaruit de relatie erbij zoeken (of die includen)
Waarschijnlijk moet ik 1 centrale index maken & hierin elk (enke) product, (enkel) relatie en product/relatie als een platte rij toevoegen; zoiets als:
Kan, maar ik zou er waarschijnlijk voor kiezen om gewoon een nieuw object te introduceren : Autocomplete_xxx object.
Waarbij je gewoon een uniforme set kenmerken introduceert zoals bijv : Name etc ipv dat je in je view-laag allerlei rare if-statements moet gaan bouwen voor if-companyname is null elseif productname is null elseif ...

[ Voor 43% gewijzigd door Gomez12 op 11-11-2020 16:00 ]


Acties:
  • 0 Henk 'm!

  • Crazy-
  • Registratie: Januari 2002
  • Laatst online: 01-10 23:31

Crazy-

Best life ever

Topicstarter
Gomez12 schreef op woensdag 11 november 2020 @ 16:00:
[...]

Dan wil je dus niet de relatie leidend hebben (want die bevat namelijk alle producten).
Maar je wilt het product leidend hebben en vandaaruit de relatie erbij zoeken (of die includen)
Dat is juist de crux , ze kunnen beide leidend zijn ;-) daarom ook mijn laatste opmerking qua nieuwe index
Kan, maar ik zou er waarschijnlijk voor kiezen om gewoon een nieuw object te introduceren : Autocomplete_xxx object.
Waarbij je gewoon een uniforme set kenmerken introduceert zoals bijv : Name etc ipv dat je in je view-laag allerlei rare if-statements moet gaan bouwen voor if-companyname is null elseif productname is null elseif ...
Je geeft aan object > doel je hier op een ES index? Wat in principe heb ik de autocomplete_xxx niet nodig in de (sql)-database

dus als ik je goed begrijp : puur een eigen index/object aanmaken in ES met de data die ik nodig heb t.b.v. het zoeken. (wat eigenlijk ook vrij logisch is. |:( )

12,85kWp - ZB 7,5m2/400l - 5kW Pana H WP (CV&SWW) - 13,8kWh accu


Acties:
  • +1 Henk 'm!

  • HamuNaptra
  • Registratie: April 2002
  • Niet online
Ik mis in dit verhaal vooral de ES query die je probeert uit te voeren, ik vermoed een completion suggester?

Mijn raad, begin bij de basis:
- start met je index template aan te maken
- bekijk op welke velden je wil zoeken en welke velden je wil terugsturen als resultaat, zet dus niet alle db velden zomaar in je index
- beslis welke analyzers je nodig hebt
- denk na over je query, selecteer de juiste fields die je wel gebruiken en pas de weights per field aan (indien van toepassing)

Van wat ik uit je verhaal kan halen kan je verschillende richtingen uit:
- maak een document van type Relatie en zet hierin een array van producten (zoals je had)
- maak hiernaast ook een document van het type Product aan en gebruik dit om je producten te indexeren
- je kan trouwens die array in je Relatie document automatisch laten opvullen door een ingest pipeline te gebruiken tijds de creatie en een watcher om updates te pushen

of gebruik een parent/child relation tussen het Relatie & Product document ipv een array... maw veel richtingen die je nog uit kan om dit te optimaliseren.
Pagina: 1