2

Suche mit mehreren Suchbegriffen erstellen

Hallo zusammen,

ich nutze schönen an verschiedenen Stellen in meinen Datenbanken folgende Arten der Suche

 

let mySuche := lower(Suche);

select VC where contains(lower(Projekt + text(id) + Kunde.Firmenname), mySuche)

 

Das funktioniert auch ganz gut. wie bekomme ich es aber hin, das nicht zusammengehörige Begriffe im Suchfeld gefunden werden.

 

Beispiel: 

mySuche := "Adidas Fußballschuhe"

 

Als Ergebnis wünsche ich mir   VC (Verkaufschancen) beim Kunden Adidas mit dem Begriff Fußballschuhe im Projektnamen. oben würde er mir ja nur Ergebnisse anzeigen die entweder mySuche im Firmennamen oder im Projektnamen hat.

In der globalen Suche funktioniert dies ja ähnlich allerdings für alle Tabellen.

3 Antworten

null
    • konzept P Personalmarketing GmbH
    • Aaron_Becher
    • vor 1 Jahr
    • Gemeldet - anzeigen

    Hi zusammen,

    falls hier wie ich jemand eine Antwort sucht, kommt hier zumindest eine, die funktioniert, allerdings bezogen auf eine eigene Suche. Kann ich bei Unverständnis auch auf das obige Beispiel ummünzen.
    Nehme zudem gerne elegantere Varianten entgegen. Bei vielen Ansichten auf einer Such-Seite leidet die Performance doch etwas unter den vielen Schleifen:

    Vorweg:
    Das Feld "Suche" bezieht sich auf das Suchfeld und besteht aus der Formel
    split(lower(Suchbegriff), " ")

    Das Feld "Suchrelevant" in meiner Auftragstabelle ist einfach eine Aneinanderreihung der Felder, die für meine Suche relevant sind. Also "Auftragstitel + 'Externe Nummer' + Standort" usw.

    Die Abfrage am Anfang (if myCounter = 1...) dient lediglich dazu, dass keine Schleifen berechnet werden müssen, solange nur nach einem Wort gesucht wird. Ich erhoffe mir davon eine bessere Performance. Gerne bestätigen oder widerlegen.

    let myID := this;
    let myCounter := cnt(Suche);
    let einzelsuche := first(Suche);
    let myAuftraege := (select 'Aufträge')[Suchrelevant like einzelsuche];
    if myCounter = 1 then
    myAuftraege
    else
    let myAuftraegeVerbleiben := myAuftraege[Nr = 0];
    for a in myAuftraege do
    let myCounterAuftrag := 0;
    for b in Suche do
    if a.Suchrelevant like b then
    myCounterAuftrag := myCounterAuftrag + 1
    end
    end;
    if myCounterAuftrag = myCounter then
    myAuftraegeVerbleiben := array(myAuftraegeVerbleiben, myAuftraege[Nr = a.Nr])
    end
    end;
    myAuftraegeVerbleiben
    end

    • NX Stylist, Prozessmanager & UI Designer
    • Jakob_Jordan
    • vor 1 Jahr
    • Gemeldet - anzeigen

    Ich nutze gerne testx() für Volltextsuche:
     

    let search := deinSuchfeld;
    let filteredList:= select ... ;
    
    filteredList[if search != null then
            testx( Feld1 + "," + Feld2+ "," + Feld3+ ","  , "(?:" + search + ")\.*[^]", "gi")
        else
            true
        end]

    Das else true ist notwendig um dir alle anzuzeigen, falls nichts in deinem Suchfeld steht.

      • chris.3
      • vor 1 Jahr
      • Gemeldet - anzeigen

      Jakob Jordan 

      Dank Dir für den Hinweis mit testx. So ganz passte es noch nicht für meine Frage oben. Folgender Code funktioniert nun aber bei mir. Trennung der einzelnen Suchbegriffe schreibe ich in ein Array und erstelle per for Schleife einen regEx Ausdruck für die testx Funktion.  So kann ich nun mit beliebig vielen Suchparamteren die Suche eingrenzen. 

       

      let mySuche := Suche;
      let sArr := split(mySuche, " ");
      let filteredList := (select Angebote);
      let regEx := "^" + for i from 0 to cnt(sArr) do
                  "(?=.*" + item(sArr, i) + ")"
              end + ".*";
      if mySuche then
        filteredList[testx(Referenznummer + "," + Firmenname + "," + concat(Angebot.Titel) , regEx, "gi")]
      else
        filteredList[days(Datum, today()) <= 90]
      end
      

Content aside

  • 2 „Gefällt mir“ Klicks
  • vor 1 JahrZuletzt aktiv
  • 3Antworten
  • 544Ansichten
  • 4 Folge bereits