2015-09-28 7 views
13

Ho una domanda (bene una parte di esso - resto è irrilevante come impaginazione):elasticsearch - Spinta di query nidificate con valore superiore

"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 
       } 
      } 
      ] 
     } 
     } 
    } 
    } 

E 'per la ricerca di profilo, che ha una capacità "PHP" con il valore 2 o più. L'utente può cercare più abilità => coppia di valori. Sta funzionando bene, ma ho una domanda:

Come fare un piccolo potenziamento per le abilità abbinate che ha un valore di abilità più alto, giusto per rendere la persona con valore PHP 3 più alta nei risultati di ricerca di una persona con PHP 2 pari se entrambi sono la corrispondenza corretta.

risposta

3

io suggerisco di usare function_score per fare questo e più in particolare il field_value_factor function che permette di utilizzare un valore di campo nel calcolo di punteggio (con un fattore di optional per il quale moltiplicare il valore del campo):

{ 
    "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

ottenere problema: : "TransportError: TransportError (500, u'search_phase_execution_exception", u'org.elasticsearch.index.fielddata.plain.PagedBytesIndexFieldData non può essere trasmesso a org.elasticsearch.index.fielddata.IndexNumericFieldData ') " –