Contao-Camp 2024
Ergebnis 1 bis 14 von 14

Thema: Textfilter - UND-Suche

  1. #1
    Contao-Nutzer
    Registriert seit
    13.03.2019.
    Beiträge
    40

    Standard Textfilter - UND-Suche

    Hallo,
    ich möchte einen Filter erstellen, der eine UND-Suche ermöglicht.
    Mit mehreren Text-Filtern über ein Such-Parameter in einem ODER verknüpft habe ich eine ODER-Suche erstellen können. Aber mit einer UND-Verknüpfung funktioniert das nicht.
    Wie muss der Filter aussehen, damit eine Suchanfrage wie VORNAME NAME dann auch nur die passenden Einträge anzeigt?

  2. #2
    Contao-Urgestein Avatar von zonky
    Registriert seit
    19.03.2010.
    Ort
    Berlin, Rdf
    Beiträge
    9.713
    User beschenken
    Wunschliste

    Standard

    Wir reden vom FE oder BE?

    Ich gehe mal vom FE aus...

    Vorweg: MM hat per se eine Filterung und keine Suche - der Unterschied ist, dass immer erst die Gesamtmenge aller Einträge ausgegeben wird, die dann durch den Filter eingegrenzt wird.

    Suche wäre umgedreht: erst wird nix angezeigt und dann die Ergebnisse.

    Bei MM kann man das aber auch so drehen, dass die Filterung wie eine Suche aussieht ....

    Die Filterregeln in einem Filter sind als Standard immer mit UND (AND) verknüpft, d.h. wenn Du eine Filterregel "Vorname" hast und eine "Nachname" werden nur noch die Items angezeigt wo Vorname UND Nachname passen.

    Es gibt die Filterregel UND wenn diese in Verschachtelungen benötigt wird.

    Poste mal einen Screenshot Deiner Filterregeln.

  3. #3
    Contao-Nutzer
    Registriert seit
    13.03.2019.
    Beiträge
    40

    Standard

    Danke für die Rückantwort,
    folgende Filterregeln habe ich schon ausprobiert (0 Ergebnisse...):
    Angehängte Grafiken Angehängte Grafiken

  4. #4
    Contao-Urgestein Avatar von zonky
    Registriert seit
    19.03.2010.
    Ort
    Berlin, Rdf
    Beiträge
    9.713
    User beschenken
    Wunschliste

    Standard

    die Anordnung wie in Textfiler_OHNE_ODER.jpg wäre schon die Richtige - das AND zum Start kannst Du weg lassen...

    Du müsstest nun im FE 20 Eingabefelder sehen - korrekt?

    was Dich ggf. verwirrt, ist die Einstellung Suchtyp - das ist wenn in einem Suchwidget mehrere Wörter hast - die werden anhand des Delimeter (Default: Leerzeichen) getrennt und je nach Einstellung gesucht

    Wenn du "Pilot Koffer" suchts würde per se genau nach dem String gesucht werden also nach den 13 Zeichen inkl. Leerzeichen - mit entsprechender Einstellung kann aber nach "Pilot" und "Koffer" bzw. "Pilot" oder "Koffer" gesucht werden

    ;-)

  5. #5
    Contao-Nutzer
    Registriert seit
    13.03.2019.
    Beiträge
    40

    Standard

    Es wird 1 Eingabefeld angezeigt, da ich ja allen Textfiltern den gleichen URL-Parameter zugewiesen habe, wie im MM-Kochbuch beim Thema Oder-Suche erklärt. Oder funktioniert das mit einer UND-Suche so nicht?

  6. #6
    Contao-Urgestein Avatar von zonky
    Registriert seit
    19.03.2010.
    Ort
    Berlin, Rdf
    Beiträge
    9.713
    User beschenken
    Wunschliste

    Standard

    Zitat Zitat von Trichter Beitrag anzeigen
    Es wird 1 Eingabefeld angezeigt, da ich ja allen Textfiltern den gleichen URL-Parameter zugewiesen habe, wie im MM-Kochbuch beim Thema Oder-Suche erklärt.
    Das war für mich aus Deinem Text nicht raus zu lesen, das Du mit einer Eingabe in mehreren Spalten suchen möchtest...

    Aber was genau soll denn passieren?

    * Du gibst in ein Feld "VORNAME NAME" ein
    * es sollen 20 Spalten durchsucht werden
    * es soll ein Ergebnis kommen wenn in irgendeiner der 20 Spalten "VORNAME" UND "NAME" vorkommt aber nur dann, wenn auch beide gleichzeitig irgendwo vorkommen?

    Poste mal Dein Query, mit dem das geht...

    ... was ggf. gehen könnte wären z.B. zwei Eingabefelder eins für "Vorname" und eins für "NAME" - alle Spalten mit OR verknüpft und dann beide Blöcke mit AND

  7. #7
    Contao-Nutzer
    Registriert seit
    13.03.2019.
    Beiträge
    40

    Standard

    Genau das soll passieren, eine Suche/Filterung mit mehreren Begriffen über alle Spalten. Die Zeile wird nur ausgegeben, wenn alle Suchbegriffe vorkommen.
    Mit (SQL)-Querys kenne ich mich nicht aus, um in der Hinsicht etwas zu liefern. Meine Frage war auch nur, wie man das als Filter zusammenstellen kann. Wenn das nicht geht, dann muss der Kunde halt mit der ODER-Suche leben.

  8. #8
    Contao-Urgestein Avatar von zonky
    Registriert seit
    19.03.2010.
    Ort
    Berlin, Rdf
    Beiträge
    9.713
    User beschenken
    Wunschliste

    Standard

    Zitat Zitat von Trichter Beitrag anzeigen
    Die Zeile wird nur ausgegeben, wenn alle Suchbegriffe vorkommen.
    müsste wohl eher heißen, "Die Zeile wird nur ausgegeben, wenn alle Suchbegriffe mindestens einmal irgendwo vorkommen."

    spontan und auch nach etwas Überlegung hab ich keine Idee, wie man das in ein Query packen könnte - und wenn das schon nicht geht, wirds in MM auch eng ;-)

    wenn die Spaltenabfragen mit AND verknüpft sind und bei einer nichts gefunden wird, würde sofort das Gesamtergebnis zu nix - was aber nicht gewünscht wird

    man müsste den String splitten und alle Elemente einzeln durchsuchen und wenn beide was finden, dann die IDs der Items mergen und wenn dann noch was übrig ist, das ausgeben...

    Mit einem speziellen Filter, für genau diesen Anwendungsfall, wäre das sicher machbar...

  9. #9
    Contao-Nutzer
    Registriert seit
    13.03.2019.
    Beiträge
    40

    Standard

    Müsste ich es programmieren, würde ich die Suchbegriffe in ein Array kopieren, dann eine Schleife durch die Zeilen und Schleife durch die Spalten, und bei jedem Spalten-String prüfen, ob ein Suchbegriff aus dem Array vorkommt. Wenn ja -> Begriff aus Array entfernen. Ist am Ende der Spalte das Array leer, Zeile ausgeben, Array wieder füllen, nächste Zeile...

    Das wäre ja auch in der Form schnell in ein Template getippt, aber da das 64000 Datensätze sind, habe ich natürlich die Pagination aktiviert. Und ich gehe mal davon aus, dass die mir dazwischenfunkt, weil ich so dann nur einen Teil des Datensatzes durchprüfen könnte...

  10. #10
    Contao-Urgestein Avatar von zonky
    Registriert seit
    19.03.2010.
    Ort
    Berlin, Rdf
    Beiträge
    9.713
    User beschenken
    Wunschliste

    Standard

    Am Einfachsten wäre es, für eine maximale Anzahl von gleichzeitigen Suchbegriffen einzelne Widgets anzulegen - sagen wir drei oder fünf ... nach mehr Wörtern kann dann eben nicht gleichzeitig gesucht werden...

    Andere Variante wäre, das Anlegen eines Attributes "Kombinierte Werte" - das ist schon vom Typ Text https://github.com/MetaModels/attrib...Values.php#L40 ... da passt also einiges rein...

    In das Attribut müssen alle Spalten, die Du eigentlich filtern willst, d.h. du hast eine "Textleberwurst" wo alles drinn steht ... und in der suchst Du mit einer Text-Filterregel und der Einstellung beim Filterwidget "Suche nach allen Wörtern (AND)" und Delimenter Leerzeichen (Default).

    Damit muss dann VORNAME und NAME in dem Textwust vorhanden sein - bei Einstellung OR mindestens eins der beiden und bei der Standardeinstellung wird genau "VORNAME NAME" gesucht.

  11. #11
    Contao-Nutzer
    Registriert seit
    13.03.2019.
    Beiträge
    40

    Standard

    Danke für den Tipp.
    Die Idee mit der Textwurst ist ansich ganz gut, aber das heißt natürlich, dass dann alle Einträge einmal abgespeichert werden müssen, um diese Wurst-Einträge zu erstellen. Das ist bei 64000 Zeilen schon nicht ohne, und dazu will der Kunde in Zukunft per CSV-Import neue Einträge hinzufügen, damit wird das zu fummelig. Aber trotzdem Danke, die Lösung ist ja vielleicht für ein anderes Projekt mal ganz hilfreich.

  12. #12
    Contao-Urgestein Avatar von zonky
    Registriert seit
    19.03.2010.
    Ort
    Berlin, Rdf
    Beiträge
    9.713
    User beschenken
    Wunschliste

    Standard

    zum Speichern der vorhandenen kann man das per "Mehrere Bearbeiten" machen - zumindest in 500er Blöcken

    oder man baut sich ein Query mit CONCAT und lässt das einmal laufen

    wenn der Import über die MM-API-läuft muss man sich darum nicht kümmern - könnte aber schon vor dem Import ein entsprechendes Feld mit den "Keywords" erstellen

  13. #13
    Contao-Nutzer
    Registriert seit
    13.03.2019.
    Beiträge
    40

    Standard

    Geht ja doch...
    Falls mal jemand danach sucht und fragt...

    Lösung für 4 Suchbegriffe

    Filterset mit "Eigenes SQL":

    Code:
    SELECT *
    FROM {{table}}
    WHERE (
    s_name LIKE (CONCAT('%',{{param::get?name=search1&default=%%}},'%')) OR 
    s_vorname LIKE (CONCAT('%',{{param::get?name=search1&default=%%}},'%')) OR 
    s_adresse LIKE (CONCAT('%',{{param::get?name=search1&default=%%}},'%')) OR 
    s_nasenlaenge LIKE (CONCAT('%',{{param::get?name=search1&default=%%}},'%'))
    ) AND (
    s_name LIKE (CONCAT('%',{{param::get?name=search2&default=%%}},'%')) OR 
    s_vorname LIKE (CONCAT('%',{{param::get?name=search2&default=%%}},'%')) OR 
    s_adresse LIKE (CONCAT('%',{{param::get?name=search2&default=%%}},'%')) OR 
    s_nasenlaenge LIKE (CONCAT('%',{{param::get?name=search2&default=%%}},'%'))
    ) AND (
    s_name LIKE (CONCAT('%',{{param::get?name=search3&default=%%}},'%')) OR 
    s_vorname LIKE (CONCAT('%',{{param::get?name=search3&default=%%}},'%')) OR 
    s_adresse LIKE (CONCAT('%',{{param::get?name=search3&default=%%}},'%')) OR 
    s_nasenlaenge LIKE (CONCAT('%',{{param::get?name=search3&default=%%}},'%'))
    ) AND (
    s_name LIKE (CONCAT('%',{{param::get?name=search4&default=%%}},'%')) OR 
    s_vorname LIKE (CONCAT('%',{{param::get?name=search4&default=%%}},'%')) OR 
    s_adresse LIKE (CONCAT('%',{{param::get?name=search4&default=%%}},'%')) OR 
    s_nasenlaenge LIKE (CONCAT('%',{{param::get?name=search4&default=%%}},'%'))
    )
    Dazu muss man sich dann noch ein Suchfeld bauen, dass per js aus "mustermann max allee" eine /liste/search1/mustermann/search2/max/search3/allee.html erzeugt...

    z.B. (mit Rausfiltern von ein paar ungewollten Sonderzeichen)
    Code:
    <form id="form_servicesql" action="javascript:send_sql()">
        <div class="form-group row">
             <input id="fsuche_sql" class="col-9 form-control" type="text" name="fsuche_sql" value="" />
            <button type="submit" onclick="send_sql();" class="col-2 ml-3 btn btn-primary submit" form="form_servicesql" value="">Suchen</button>
        </div>
    
    </form>
    
    
    <script>
        function send_sql(){
    
            let path_begin = '/liste';
            let path_string = '';
            let path_end = '.html';
    
            let input = document.querySelector('#fsuche_sql').value;
            input = input.replace(/['"]+/g, '');
            input = input.replace('+', '');
            input = input.replace('?', '');
            input = input.replace('#', '');
            input = input.replace('&', '');
            let inputs = input.split(' ');
    
            for (var i = 0; i < inputs.length; i++) {
                path_string += '/search' + (i+1) + '/' + inputs[i];
            }
    
            let path = path_begin + path_string + path_end;
    
            window.open(path,'_self');
        }
    
    </script>
    Geändert von Trichter (31.01.2022 um 14:14 Uhr)

  14. #14
    Contao-Urgestein Avatar von zonky
    Registriert seit
    19.03.2010.
    Ort
    Berlin, Rdf
    Beiträge
    9.713
    User beschenken
    Wunschliste

    Standard

    sollte auch ohne JavaScript gehen, wenn man das als Basis nimmt https://metamodels.readthedocs.io/de...wo-fields.html - die Text-Felder aber nicht mit AND sondern mit OR verknüpft und wie oben beschrieben die Einstellungen so wählt, dass der String automatisch beim Leerzeichen getrennt wird... dann ist es egal, ob du zwei oder 10 Begriffe eingibst

Aktive Benutzer

Aktive Benutzer

Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)

Lesezeichen

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •