2013-05-27 1 views
30

Ho una query con più corrispondenze in ES e desidero aggiungere un filtro.ElasticSearch, multi-match con filtro?

{ 
    "multi_match" : { 
    "query" : "this is a test", 
    "fields" : [ "subject^2", "message" ] 
    } 
} 

Qual è la sintassi per aggiungere questo filtro?

ho provato:

{ 
    "multi_match" => { 
    "query" => "list", 
    "fields" => [ "username" ] 

    }, 
"filter" => { 
     "term" => { "username" => "slimkicker"} 
    } 
} 

risposta

54

A seconda di cosa hai bisogno devi mettere il filtro nella posizione corretta. Sono disponibili due opzioni:

utilizzare un filtro di primo livello e applicare il filtro solo ai risultati di ricerca, ma non per le sfaccettature

{ 
    "query" : { 
     "multi_match" { 
      "query" : "this is a test", 
      "fields" : [ "subject^2", "message" ] 
     } 
    }, 
    "filter" : { 
     "term" : {"username":"slimkicker"} 
    } 
} 

Utilizzare una query filtrata e applicare il filtro sia risultati di ricerca e le sfaccettature

{ 
    "query" :{ 
     "filtered" : { 
      "query" : { 
       "multi_match" : { 
        "query" : "this is a test", 
        "fields" : [ "subject^2", "message" ] 
       } 
      }, 
      "filter" : { 
       "term" : {"username":"slimkicker"} 
      } 
     } 
    } 
} 
+10

Potresti spiegare un po 'di più sulla differenza tra due opzioni? in quali casi d'uso dovrebbero essere usati? –

+1

è il 2 ° sui filtri sul lato come amazon.com ad esempio? – batmaci

35

Con elasticsearch 5 la sintassi è cambiato all'utilizzo di interrogazione bool, es

{ 
    "from" : 0, 
    "size" : 10, 
    "sort" : "publishDate", 
    "query": { 
    "bool": { 
     "must" : { 
     "multi_match" : { 
      "query":  "wedding", 
      "type":  "most_fields", 
      "fields":  [ "title", "text" ] 
     } 
     }, 
     "filter": { 
     "term": { 
      "locale": "english" 
     } 
     } 
    } 
    } 
} 

La documentazione è here.

+0

Penso che questo sia alias dopo la versione 2.x.x, non solo 5 – batmaci