Announcement

Collapse
No announcement yet.

Volltextsuche mit contains: Probleme bei den Ergebnissen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Volltextsuche mit contains: Probleme bei den Ergebnissen

    Hallo,

    ich benutze die Volltextsuche des MS SQL-Servers. Entsprechender Katalog ist auch erstellt und die Suche funktioniert.

    Allerdings bin ich hinsichtlich den Ergebnissen bei contains etwas irritiert.

    CONTAINS mit <simple_term>
    Code:
    where contains(content, 'gericht')
    Dürften dann nicht nur Ergebnisse angezeigt werden, die in der Spalte content das Wort gericht enthalten und nicht auch Wörter wie Sozialgerichtsgesetzes?
    Das ist nämlich bei mir der Fall.

    CONTAINS mit <prefix_term>
    Code:
    where contains(content, '"gericht*"')
    Dürften dann nicht nur Ergebnisse angezeigt werden, bei denen das Wort mit gericht beginnt.
    Aber auch hier findet der Server Ergebnisse mit dem Wort Sozialgerichtsgesetzes.

    Mache ich hier einen Denkfehler?

  • #2
    CONTAINS ist etwas komplexer als LIKE:

    Du brauchst keine Denkfehler zu machen, Du kannst die Doku lesen.

    Code:
    CONTAINS (  
         {  
            column_name | ( column_list )  
          | *  
          | PROPERTY ( { column_name }, 'property_name' )    
         }  
         , '<contains_search_condition>'  
         [ , LANGUAGE language_term ]  
       )  
    
    <contains_search_condition> ::=  
      {  
          <simple_term>  
        | <prefix_term>  
        | <generation_term>  
        | <generic_proximity_term>  
        | <custom_proximity_term>  
        | <weighted_term>  
        }  
      |  
        { ( <contains_search_condition> )  
            [ { <AND> | <AND NOT> | <OR> } ]  
            <contains_search_condition> [ ...n ]  
      }  
    <simple_term> ::=  
         { word | "phrase" }  
    
    <prefix term> ::=  
      { "word*" | "phrase*" }  
    
    <generation_term> ::=  
      FORMSOF ( { INFLECTIONAL | THESAURUS } , <simple_term> [ ,...n ] )  
    
    <generic_proximity_term> ::=  
      { <simple_term> | <prefix_term> } { { { NEAR | ~ }  
         { <simple_term> | <prefix_term> } } [ ...n ] }  
    
    <custom_proximity_term> ::=  
      NEAR (  
         {  
            { <simple_term> | <prefix_term> } [ ,...n ]  
         |  
            ( { <simple_term> | <prefix_term> } [ ,...n ] )  
          [, <maximum_distance> [, <match_order> ] ]  
         }  
           )  
    
          <maximum_distance> ::= { integer | MAX }  
          <match_order> ::= { TRUE | FALSE }  
    
    <weighted_term> ::=  
      ISABOUT  
       ( {  
            {  
              <simple_term>  
            | <prefix_term>  
            | <generation_term>  
            | <proximity_term>  
            }  
          [ WEIGHT ( weight_value ) ]  
          } [ ,...n ]  
       )  
    
    <AND> ::=  
      { AND | & }  
    
    <AND NOT> ::=  
      { AND NOT | &! }  
    
    <OR> ::=  
      { OR | | }

    Comment


    • #3
      Ach ne. Das habe ich getan.
      Code:
       
       <simple_term> ::=        { word | "phrase" }
      D.h. doch, dass er das Wort gericht finden soll.
      Oder werden hier auch Wortbestandteile gefunden? Ich verstehe das nicht so.

      Comment


      • #4

        where contains(content, 'gericht')
        vs
        where contains(content, "gericht")
        Christian

        Comment


        • #5
          Die zweite Variante geht nicht. Hier zeigt er ein Syntax Fehler an.
          Folgendes funktioniert, macht aber keinen Unterschied: where contains(content, '"gericht"')

          Comment


          • #6
            Ich hab kein MSSQL, geschweige die Volltextsuche, kann das also nicht nachvollziehen.
            Ich gehe mal davon aus, dass die Spalten / Tabelle richtig volltextindiziert ist und die Grundlagen der Volltextsuche richtig konfiguriert sind oder prüfbare Defaultwerte nutzen.

            Wenn man sowas im Forum nachfragt, ist es hilfreich, ein Beispiel zu zeigen, was man denn erwartet / erwarten kann (auch um die eigenen Angaben und Annahmen zu prüfen)
            Es ist hilfreich, um den spekulativen Teil möglichst zu eleminieren.
            Ein
            Code:
            Select * from meinetabelle where meinfeld like '*muster*'
            wäre also schon mal schön. Damit meine ich stumpf Abfrage>Ausgabe>Copy/Paste ins Forum.
            Auch interessant sind die Createstatements der Tabelle und der Indizes. Sie beschreiben, was definiert ist, nicht was man vermutet.

            Zu den Phrases:
            Ich kann habe die Details nicht nachgeschlagen, aber vielleicht gibt es dazu grundsätzliche Einstellungen bzw. Defaulteinstellungen, die (für Deutsch) solch ein Suchverhalten ergeben.
            Die doublequotes schließen eine Phrase ein, das nackte Suchwort wäre also ganz ohne Quotes? > Mal probieren.
            Die Singlequotes escapen das Asterisk, also "Suche nach einem Text, der einen Stern enthält" > Mal probieren.
            Wenn man keinen "Wildcardeffekt" haben will, sollte man wohl Leerzeichen als 'Delimiter' in der Phrase nutzen. > Mal probieren.
            Oder um den Phrase Gedanken mal ausgeprägter zu testen:
            Code:
            where contains(<feld>, '" gericht OR gewicht OR gesicht*"')
            Die gezielte Suche ohne Ergebnise mit Zusammensetzungen wäre also
            Code:
            where contains(<feld>, '" gericht "')
            Volltextsuche muss länderspezifische Eigenarten berücksichtigen. Im Deutschen wäre das evtl. die grundsätzliche Möglichkeit, Substantive aus anderen zusammenzusetzen. Evtl. gibt es dazu länderspezifische Defaults.
            Zuletzt editiert von defo2; 18.08.2019, 21:19.

            Comment

            Working...
            X