2016-06-09 13 views
0

Ich möchte "Benutzer" Daten mit der "% LIKE%" Bedingung in der elastischen Suche abrufen.PHP Elastic Suche Volltextsuche - Sortieren nach Relevanz

GET user/_search 
{ 
    "query": { 
     "query_string": { 
      "fields": ["firstname", "lastname"], 
      "query": "*a*" 
     } 
    }, 
    "sort": { 
     "_score": "desc" 
    } 
} 

Es gibt die Ergebnisse mit "_score": 1 für alle Daten.

Die Daten mit dem Namen "Kunal Dethe" sind die ersten und "Abhijit Pingale" ist die zweite.

Aber wie erwartet sollte "Abhijit Pingale" zuerst kommen, weil der Buchstabe "a" zweimal in diesem Namen und nicht in "Kunal Dethe" vorkommt.

Irgendwelche Ideen warum?

EDIT: verwendet, um die "Ngram" Lösung, aber für einen Text wie "ab", werden die Gramm als "a", "b" und dann "ab" als "min_gram" eingestellt ist aufgeschlüsselt 1 weil das Ergebnis zurückgegeben werden soll, auch wenn ein einzelnes Zeichen eingegeben wird.

Aber ich möchte die Suche nur als "ab" durchgeführt werden.

Natürlich, kann die "min_gram" erhöhen, aber kann es dynamisch auf die Länge des gesuchten Textes eingestellt werden?

POST /user 
{ 
    "settings": { 
     "analysis": { 
      "filter": { 
       "substring": { 
        "type": "nGram", 
        "min_gram": 1, 
        "max_gram": 15 
       } 
      }, 
      "analyzer": { 
       "substring_analyzer": { 
        "tokenizer": "standard", 
        "filter": [ 
         "lowercase", 
         "substring" 
        ] 
       } 
      } 
     } 
    }, 
    "mappings": { 
     "user": { 
      "properties": { 
       "id": { 
        "type": "long" 
       }, 
       "firstname": { 
        "type": "string", 
        "analyzer": "substring_analyzer" 
       }, 
       "lastname": { 
        "type": "string", 
        "analyzer": "substring_analyzer" 
       } 
      } 
     } 
    } 
} 

//Searching via 

GET user/_search 
{ 
    "query": { 
     "query_string": { 
      "fields": ["firstname^2", "lastname"], 
      "query": "ab" 
     } 
    } 
} 
+0

Scoring macht keinen Sinn, wenn Sie Platzhalter verwenden. Deshalb macht es das. Auch die Verwendung eines Präfix-Platzhalters verlangt nach Schwierigkeiten, da es jeden Ausdruck im invertierten Index buchstäblich prüfen muss. – pickypg

+0

Aber ich brauche die "\ * a \ *" wie Abfrage durchgeführt werden. Gibt es einen anderen Weg, dies zu erreichen? –

+0

Wenn Sie Platzhalter vermeiden möchten, benötigen Sie eine Lösung mit Nigrammen. Siehe hierzu: http://stackoverflow.com/questions/34331249/elasticsearch-query-string-dont-search-by-word-part/34331544#34331544 – Val

Antwort

2

Eine Möglichkeit, zu erreichen, was Sie wollen, ist ein Analysegerät angeben, zu verwenden (das heißt standard) bei Suchzeit so Ihre Eingabe nicht durch die Standard-ngram analysiert bekommt. Auf diese Weise werden nur ab Token und weder a noch b Tokens abgeglichen.

GET user/_search 
{ 
    "query": { 
     "query_string": { 
      "fields": ["firstname^2", "lastname"], 
      "query": "ab", 
      "analyzer": "standard"  <--- add this 
     } 
    } 
} 

Ein besserer Ansatz ist jedoch "search_analyzer": "standard" in Ihrer Zuordnung setzen stattdessen auf der Suchzeit der Verwendung als auch den ngram Ansatzes, was der Fall ist, wenn nur "analyzer": "substring_analyzer" angeben. Wenn Sie also nach ab suchen, werden Sie nur ab Tokens finden, da diese zur Suchzeit nicht ngram'ed werden.

"mappings": { 
    "user": { 
     "properties": { 
      "id": { 
       "type": "long" 
      }, 
      "firstname": { 
       "type": "string", 
       "analyzer": "substring_analyzer", 
       "search_analyzer": "standard"  <-- add this 
      }, 
      "lastname": { 
       "type": "string", 
       "analyzer": "substring_analyzer", 
       "search_analyzer": "standard"  <-- add this 
      } 
     } 
    } 
} 
+0

Das hat gut funktioniert. Vielen Dank. Verwendete die "Mappings" -Lösung. –

+0

Super, froh, dass es geklappt hat! – Val

+0

Ich brauche auch eine Hilfe mit einer Sache .. wenn mit "ab", d. H. Mit einem Leerzeichen, können wir Ergebnisse mit "ab" erhalten höhere Punktzahl und dann andere Ergebnisse mit einem "Raum"? –