2015-09-28 5 views
13

Ich habe eine Abfrage (na ja, einen Teil davon - Rest ist unwichtig wie Paginierung):Elasticsearch - boost verschachtelt Abfrage mit einem höheren Wert

"query": { 
    "filtered": { 
     "query": { 
     "bool": { 
      "must": [ 
      { 
       "term": { 
       "is_active": true 
       } 
      } 
      ], 
      "should": [ 
      { 
       "bool": { 
       "must": [ 
        { 
        "nested": { 
         "path": "skills", 
         "query": { 
         "bool": { 
          "must": [ 
          { 
           "bool": { 
           "must": [ 
            { 
            "range": { 
             "skills.value": { 
             "gte": "2" 
             } 
            } 
            }, 
            { 
            "term": { 
             "skills.skill.name": "php" 
            } 
            } 
           ] 
           } 
          } 
          ] 
         } 
         } 
        } 
        } 
       ], 
       "boost": 2 
       } 
      } 
      ] 
     } 
     } 
    } 
    } 

Es ist für die Suche Profil, das eine Fähigkeit „PHP“ mit Wert 2 oder mehr. Benutzer kann nach mehreren Fähigkeiten suchen => Wertepaar. Es funktioniert gut, aber ich habe eine Frage:

Wie man einen kleinen Schub für angepasste Fähigkeiten, die höhere skills.value hat, nur um Menschen mit PHP-Wert 3 höher in Suchergebnissen als jemand mit PHP 2 sogar machen wenn beide korrekt übereinstimmen.

Antwort

3

Ich schlage vor, mit function_score dies zu tun, und insbesondere die field_value_factor function, die einen Feldwert in der Scoring-Berechnung verwenden können (mit einem optionalen Faktor, mit dem der Feldwert zu multiplizieren):

{ 
    "query": { 
    "filtered": { 
     "query": { 
     "bool": { 
      "must": [ 
      { 
       "term": { 
       "is_active": true 
       } 
      } 
      ], 
      "should": [ 
      { 
       "nested": { 
       "path": "skills", 
       "query": { 
        "function_score": { 
        "query": { 
         "bool": { 
         "must": [ 
          { 
          "range": { 
           "skills.value": { 
           "gte": "2" 
           } 
          } 
          }, 
          { 
          "term": { 
           "skills.skill.name": "php" 
          } 
          } 
         ] 
         } 
        }, 
        "functions": [ 
         { 
         "field_value_factor": { 
          "field": "skills.value", 
          "factor": 2 
         } 
         } 
        ] 
        } 
       } 
       } 
      } 
      ] 
     } 
     } 
    } 
    } 
} 
+0

bekommen Ausgabe: : "TransportError: TransportError (500, u'search_phase_execution_exception ', u'org.elasticsearch.index.fielddata.plain.PagedBytesIndexFieldData kann nicht in org.elasticsearch.index.fielddata.IndexNumericFieldData') umgesetzt werden" –

Verwandte Themen