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 :)