2017-07-10 3 views
2

Ich verwende Query String mit Boost Fields in . Es funktioniert gut, aber in einigen Szenarien bekomme ich nicht das erwartete Ergebnis.
Abfrage:Abfragezeichenfolge mit Boost-Feldern in der elastischen Suche

query 
{ 
    "from": 0, 
    "size": 10, 
    "explain": true, 
    "query": { 
     "function_score": { 
     "query": { 
      "query_string": { 
       "query": "account and data", 
       "fields": [ 
        "title^5" 
        "authors^4", 
        "year^5", 
        "topic^6" 
       ], 
       "default_operator": "and", 
       "analyze_wildcard": true 
      } 
     }, 
     "score_mode": "sum", 
     "boost_mode": "sum", 
     "max_boost": 100 
     } 
    } 
} 

Beispieldaten:

{ 
    "took": 50, 
    "timed_out": false, 
    "_shards": { 
     "total": 5, 
     "successful": 5, 
     "failed": 0 
    }, 
    "hits": { 
     "total": 4, 
     "max_score": 12.833213, 
     "hits": [ 
     { 
      "_id": "19850", 
      "_score": 12.833213, 
      "_source": { 
       "ID": "19850", 
       "Year": "2010", 
       "Title": "account and data :..." 
      } 
     }, 
     { 
      "_id": "16896", 
      "_score": 11.867042, 
      "_source": { 
       "ID": "16896", 
       "Year": "2014", 
       "Title": "effectivness of data..." 
      } 
     }, 
     { 
      "_id": "59862", 
      "_score": 9.706333, 
      "_source": { 
       "ID": "59862", 
       "Year": "2007", 
       "Title": "best system to..." 
      } 
     }, 
     { 
      "_id": "18501", 
      "_score": 9.685843, 
      "_source": { 
       "ID": "18501", 
       "Year": "2010", 
       "Title": "management of..." 
      } 
     } 
     ] 
} 

I unter Verwendung von Abfrage über Beispieldaten immer bin und das ist laut Erwartung. Aber jetzt, wenn ich weight von year auf 100 erhöhe dann erwarte ich 4. Ergebnis auf 3. Position und 3. Ergebnis auf 4. Position. Ich habe viele Dinge ausprobiert, aber ich weiß nicht, was ich falsch mache.

Antwort

4

Der Boost wird nur verwendet, wenn die Abfrage mit dem Feld übereinstimmt, das Sie verstärken, und multipliziert die Berechnung der elastischen Ergebnisse mit der von Ihnen definierten Boosting-Funktion. In Ihrer Suchanfrage suchen Sie nach "account and data" und das passt nicht zu einem Jahr, so dass das Boosting im Jahr nicht verwendet wird.

Versuchen Sie, das Jahr bei der Bestellung zu berücksichtigen? Wenn das der Fall ist, können Sie versuchen, die field_value_factor auf Ihre Abfrage wie folgt ergänzt:

"query" : { 
    "function_score": { 
     "query": { <your query goes here> }, 
     "field_value_factor": { 
      "field": "year" 
     } 
    } 
} 

Dies wird das Jahr mit der Partitur Elasticsearch berechnet multiplizieren, so dass es das Jahr Rechnung ohne notwendige Bestellung bis zum Jahr stattfinden wird. Sie können mehr darüber hier lesen https://www.elastic.co/guide/en/elasticsearch/guide/current/boosting-by-popularity.html.

Sie können immer das EXPLAIN-Werkzeug verwenden, um herauszufinden, wie die elastische Suche mit der Punktzahl gekommen ist und somit die Ergebnisse in dieser Reihenfolge zurückgegeben hat. https://www.elastic.co/guide/en/elasticsearch/reference/current/search-explain.html

+0

Muss ich alle Felder hinzufügen, die ich bei der Bestellung berücksichtigen möchte? –

+0

Sie müssen die Felder hinzufügen, die Sie bei der Bestellung berücksichtigen möchten. aber das 'field_value_factor'' field' Attribut nimmt nur ein Feld. Wenn Sie eine Kombination aus zwei Feldern erstellen und benutzerdefinierte Logik hinzufügen möchten, sollten Sie statt dessen den 'script_score' verwenden, wie hier erwähnt https://www.elastic.co/guide/en/elasticsearch/guide/current/function-score -query.html –

+0

Wenn dies Ihr Problem gelöst hat, denken Sie daran, die Antwort als akzeptiert zu markieren. –

Verwandte Themen