2015-08-05 16 views
13

Quindi il mio problema è sostanzialmente lo stesso descritto in here, tuttavia rimane ancora senza risposta sul gruppo.query multimatch nidificata ricerca elastica

mio mappatura:

{ 
    "abstract": { 
     "properties": { 
      "summary": { 
       "type": "string" 
      } 
     } 
    }, 
    "authors": { 
     "type": "nested", 
     "properties": { 
      "first_name": { 
       "type": "string" 
      }, 
      "last_name": { 
       "type": "string" 
      } 
     } 
    } 
} 

E vorrei per eseguire una ricerca full-text su entrambi questi campi, probabilmente diseguale ponderata. La query che mi viene in mente, ma purtroppo non funziona, sarebbe questo:

{ 
    "query": { 
     "bool": { 
      "should": [{ 
       "multi_match": { 
        "query": "higgs boson", 
        "fields": ["abstract.summary^5", "author.last_name^2"] 
       } 
      }] 
     } 
    } 
} 

non ottengo alcun risultato dal campo autori, a causa della sua mappatura nidificato. Inoltre non posso liberarmi della proprietà annidata - la uso per le aggregazioni. Qualche idea elegante su come risolverlo?

+0

Nella mappatura del documento, non vedo i collegamenti tra i 2 oggetti. Credo che se stai usando l'oggetto 'nested', devi mapparlo come un bambino, all'interno di' properties' e anche specificare una 'query nidificata'. https://www.elastic.co/guide/en/elasticsearch/guide/current/nested-query.html – Jaider

risposta

5

L'unica soluzione che sono riuscito a capire, che non è a portata di mano, né elegante, ma funziona in qualche modo è tale query:

"query": { 
    "bool": { 
     "should": [ 
      { 
       "nested": { 
        "path": "authors", 
        "query": { 
         "multi_match": { 
          "query": "higgs", 
          "fields": ["last_name^2"] 
         } 
        } 
       } 
      }, 
      { 
       "multi_match": { 
        "query": "higgs", 
        "fields": ["abstract.summary^5"] 
       } 
      } 
     ] 
    } 
} 

Io non sono anche sicuro se il potenziamento funzionerà come previsto, fornendo è impostato in diverse query. Ogni suggerimento è apprezzato.

+0

in base a https://www.elastic.co/guide/en/elasticsearch/guide/current/_boosting_query_clauses. html dovrai riscrivere la query multimatch nidificata in diverse semplici query annidate e aggiungere il parametro 'boost'. quindi nel tuo caso semplice con un solo campo per multimatch nidificato, aggiungi semplicemente il parametro 'boost' allo stesso livello con' query' come segue: – ulkas

+0

'" nidificato ": { " percorso ":" autori ", " query ": { "multi_match": { "query": "Higgs", "campi": [" cognome "] }} , "boost": 2}' – ulkas

7

Modifica della mappatura per il successivo che utilizza include_in_root: true vi permetterà di utilizzare la query originale scritto:

{ 
    "abstract": { 
     "properties": { 
      "summary": { 
       "type": "string" 
      } 
     } 
    }, 
    "authors": { 
     "type": "nested", 
     "include_in_root": true, 
     "properties": { 
      "first_name": { 
       "type": "string" 
      }, 
      "last_name": { 
       "type": "string" 
      } 
     } 
    } 
} 

Si consiglia di oggetti interni indice sia come campi annidati e come campi di oggetti appiattiti . Questo può essere ottenuto impostando include_in_parent su true. - Link

Nota: include_in_root potrebbe essere sconsigliato nelle future versioni di elasticsearch a favore di copy_to.