2013-06-05 23 views
30

Ho utente oggetto con proprietà Nome e Cognome. Voglio cercare in questi campi usando una query, e ho trovato multi_match nella documentazione, ma non so come usarlo correttamente con jolly. È possibile?ElasticSearch come usare multi_match con caratteri jolly

ho provato con una query multi_match ma non ha funzionato:

{ 
    "query": { 
     "multi_match": { 
      "query": "*mar*", 
      "fields": [ 
       "user.name", 
       "user.surname" 
      ] 
     } 
    } 
} 

risposta

47

In alternativa, è possibile utilizzare una query query_string con caratteri jolly.

"query": { 
    "query_string": { 
     "query": "*mar*", 
     "fields": ["user.name", "user.surname"] 
    } 
} 

Questo sarà più lento rispetto all'utilizzo di un filtro Ngram di indice-tempo (vedere la mia altra risposta), ma se siete alla ricerca di una soluzione rapida e sporca ...

Anche io non sono sicuro circa la mappatura, ma se si utilizza user.name invece di name la mappatura ha bisogno di guardare in questo modo:

"your_type_name_here": { 
    "properties": { 
     "user": { 
      "type": "object", 
      "properties": { 
       "name": { 
        "type": "string" 
       }, 
       "surname": { 
        "type": "string" 
       } 
      } 
     } 
    } 
} 
+1

La stringa query fa di più, espone la sintassi della query lucene. Preferirei guardare la query con caratteri jolly. – javanna

+0

Si può incollare un collegamento per i dettagli di cosa 'query_string' fa? Sono un po 'confuso sul comportamento ... – ramseykhalaf

+1

Guarda in fondo a questa pagina per un confronto tra query_string e query di corrispondenza: http://www.elasticsearch.org/guide/reference/query-dsl/match-query/ – javanna

3

non vorrei utilizzare i caratteri jolly, non scala bene. Stai chiedendo molto del motore di ricerca al momento della query. È possibile utilizzare il filtro nGram per eseguire l'elaborazione al momento dell'indice non per la ricerca.

See this discussion on the nGram filter.

Dopo l'indicizzazione del name e surname correttamente (modificare la mappatura, ci sono esempi nel link qui sotto) è possibile utilizzare multi-partita, ma senza caratteri jolly e ottenere i risultati attesi.

+3

Lato negativo: la dimensione dell'indice crescerà molto. – javanna

4

ho appena fatto questo ora:

GET _search { 
    "query": { 
     "bool": { 
      "must": [ 
       { 
        "range": { 
         "theDate": { 
          "gte": "2014-01-01", 
          "lte": "2014-12-31" 
         } 
        } 
       }, 
       { 
        "match" : { 
         "Country": "USA" 
        } 
       } 
      ], 
      "should": [ 
       { 
        "wildcard" : { "Id_A" : "0*" } 
       }, 
       { 
        "wildcard" : { "Id_B" : "0*" } 
       } 
      ],"minimum_number_should_match": 1 
     } 
    } 
} 
11

Tale interrogazione ha funzionato per me:

{ 
    "query": { 
    "filtered": { 
     "query": { 
     "match_all": {} 
     }, 
     "filter": { 
     "bool": { 
      "should": [ 
      {"query": {"wildcard": {"user.name": {"value": "*mar*"}}}}, 
      {"query": {"wildcard": {"user.surname": {"value": "*mar*"}}}} 
      ] 
     } 
     } 
    } 
    } 
} 

Simile a quello che si sta facendo, solo che nel mio caso ci potrebbero essere le maschere diverse per i diversi settori.