2017-04-12 3 views
0

Ich habe einen Index in ElasticSearch mit dem Feldnamen erstellt, wo ich den vollständigen Namen einer Person speichern: Name und Nachname. Ich möchte eine Volltextsuche über dieses Feld durchführen, so dass ich es mit dem Analysator indiziert habe.Name suchen in ElasticSearch

jetzt Mein Problem ist, dass, wenn ich suche: "John Rham Rham"

Und im Index hatte ich "John Rham Rham Luck", wird dieser Wert höhere Punktzahl hat als "John Rham Rham". Gibt es eine Möglichkeit, auf dem genauen Feld besser als in dem Feld mit mehr Werten in der Zeichenfolge zu erzielen?

Vielen Dank im Voraus!

Antwort

0

arbeitete ich ein kleines Beispiel aus (vorausgesetzt, Sie laufen auf ES 5.x Ursache für den Unterschied in der Wertung):

DELETE test 
PUT test 
{ 
    "settings": { 
    "similarity": { 
     "my_bm25": { 
     "type": "BM25", 
     "b": 0 
     } 
    } 
    }, 
    "mappings": { 
    "test": { 
     "properties": { 
     "name": { 
      "type": "text", 
      "similarity": "my_bm25", 
      "fields": { 
      "length": { 
       "type": "token_count", 
       "analyzer": "standard" 
      } 
      } 
     } 
     } 
    } 
    } 
} 

POST test/test/1 
{ 
    "name": "John Rham Rham" 
} 
POST test/test/2 
{ 
    "name": "John Rham Rham Luck" 
} 
GET test/_search 
{ 
    "query": { 
    "function_score": { 
     "query": { 
     "match": { 
      "name": { 
      "query": "John Rham Rham", 
      "operator": "and" 
      } 
     } 
     }, 
     "functions": [ 
     { 
      "script_score": { 
      "script": "_score/doc['name.length'].getValue()" 
      } 
     } 
     ] 
    } 
    } 
} 

Dieser Code ist der folgende:

  • das Ersetzen Standard BM25 Implementierung mit einer benutzerdefinierten, Feinabstimmung der B-Parameter (Feldlänge Normalisierung) - Sie können auch die Ähnlichkeit zu 'klassisch' ändern, um zurück zu TF/IDF, die diese Normierung nicht hat
  • Erstellen ein inneres Feld für Ihr Namensfeld, das die Anzahl der Token in Ihrem Namensfeld zählt.
  • Aktualisieren der Partitur entsprechend der Länge des Tokens

Dies führt:

"hits": { 
    "total": 2, 
    "max_score": 0.3596026, 
    "hits": [ 
     { 
     "_index": "test", 
     "_type": "test", 
     "_id": "1", 
     "_score": 0.3596026, 
     "_source": { 
      "name": "John Rham Rham" 
     } 
     }, 
     { 
     "_index": "test", 
     "_type": "test", 
     "_id": "2", 
     "_score": 0.26970196, 
     "_source": { 
      "name": "John Rham Rham Luck" 
     } 
     } 
    ] 
    } 
} 

Nicht sicher, ob dies der beste Weg, es zu tun, aber es zeigen Sie vielleicht in der richtige Richtung :)

Verwandte Themen