[CC] SQL Volltextsuche bei Artikel

23. September 2015 14:53

Hi,

in VK Aufträgen , bei Eingabe eines Suchbegriff in das Feld ItemNo wird bei uns folgende Suche angewendet:

1. Entspricht der Suchbegriff einer ArtikelNr wird diese geholt.
2. Wenn keine Artikel Nr vorhanden wird geschaut ob es eine Referenz gibt (wegen Barcodes/EAN)
3. Gibt es auch keine EAN werden ArtikelNr gefiltert auf Suchbegriff und im Lookup Form angezeigt
4. Wird in 3. nichts gefunden wird der Suchbegriff im feld KredArtNr angewendet und Ergebnis angezeigt
5. Wird in 4. Nichts gefunden wird der Suchbegriff auf das feld "Search Description" angewendet und Ergebnis im Lookup angezeigt.

Grundsätzlich Doof ist dass nach jedem Schritt (wenn Treffer gefunden wurden) die Suche zu Ende ist.
Werden Treffer im Lookup Form angezeigt, hat man allerdings noch die Möglichkeit den FIlter zu modifizieren oder weitere Filter anzuwenden.
(Allerdings erscheint diese Methode vielen Mitarbeitern nach über 12 Jahre NAV immer noch als störend und Zeitintensiv und wird kaum angewendet)

Das Suchmuster ist bei uns derzeit: *@suchwort*suchwort2*suchwort3*

Größtes Problem bei der bisherigen Suche ist dass bei einigen Suchbegriffen NAV einfriert und es ca 30-60 Sekunden dauert bis die Treffer angezeigt werden,
so dauert die suche nach *fdt* nur ein Bruchteil von Sekunden und liefert 100 Ergebnisse, und die Suche nach *osb* dauert 60 sekunden und liefert 5 ergebnisse, jeweils angewendet auf das Feld Suchbegriff .
Ohne die Suchfunktion (Filter direkt angewendet, ist das verhalten das gleiche )

Im SQL selber kann ich auch nicht herausfinden warum diese Begriffe unterschiedlich lange brauchen, indizierung scheint für beide gleich zu sein...

Nun will ich es mal mit einer Volltextsuche probieren, welche ich aus Navision via Automation so aufrufe:

Code:
 ADORecSet := ADOConnection.Execute(Statement, RecordsAffected, Options);


Die SP sieht wie folgt aus:

Code:
EXEC (
   'SELECT [No_], [Description], [Description 2], [Search Description], [Vendor Item No_]
   FROM [dbo].[DBTESTVERSION 23_08$Item]
   WHERE [Fade Out] = 0 AND
   CONTAINS(*, ''"'+@SearchExpression1+'"'') ')


Oder so, bei Eingabe von 2 Suchbegriffen:
Code:
EXEC (
   'SELECT [No_], [Description], [Description 2], [Search Description], [Vendor Item No_]
   FROM [dbo].[DBTESTVERSION 23_08$Item]
   WHERE [Fade Out] = 0 AND
   CONTAINS(*, ''"'+@SearchExpression1+'" AND "'+@SearchExpression2+'"'')')


Performance bei meinen test sehr gut , aber bin schnell an die Grenzen gestoßen , z.b. bei der Suche nach Sonderzeichen wie "1/2" , dann herausgefunden dass es eine StopWord List gibt (SQL 2008) , und Sonderzeichen Sprachabhängig sind...

Kurz gesagt ich finde nicht so den richtigen Einstieg was die SQL Volltextsuche angeht und was man dabei alles beachten muss/kann, welche Suchmöglichkeiten sich anbieten, ob besser mit Contains oder Freetext abfragen ... ...

Evtl. hat jemand ein Link für mich welches das Prinzip der SQL Volltextsuche näher legt (SQL 2008 R2 oder 2012), möglichst auf Deutsch, auf Englisch komme ich irgendwie nicht rein.

Evtl. Hat auch jemand eine Idee/Anregung wie man eine Benutzerfreundliche SQL Volltextsuche für die Artikelsuche implementieren könnte.

Derzeit zerlege ich den Suchstring (jeweils nach dem * ist ein neues Suchwort) , wende die Volltextsuche an, und fülle mit dem Ergebnis eine Temporäre Tabelle :
Code:

  IF (RecordsAffected <>0) THEN BEGIN
    ADORecSet.MoveFirst;
    REPEAT
      ADOFields := ADORecSet.Fields();
      ADOField := ADOFields.Item(0);
      FieldValue:= ADOField.Value;
     
 IF Item.GET(FieldValue) THEN BEGIN
        ItemTmp.INIT;
        ItemTmp := Item;
        ItemTmp.INSERT;
      END;


      ADORecSet.MoveNext;
    UNTIL ADORecSet.EOF;


IF FORM.RUNMODAL(0, ItemTmp) = ACTION::LookupOK THEN BEGIN
  EXIT(ItemTmp."No.");
END;


Danke