2015-09-15 10 views
6

Siamo in grado di cercare tutte le parole in una document.field specifico come questo:elasticsearch Trova tutte le parole dal documento nella query di ricerca

{ "query" : { "match" : { "title": { "query" : "Black Nike Mens", "operator" : "and" } } } } 

Questa cercherà le parole Black, Nike e Mens nel campo title in modo tale che vengano restituiti solo quei documenti che avranno TUTTE queste parole nel campo title.

Ma quello che sto cercando di fare è un po 'diverso.

Desidero cercare in modo tale che se tutte le parole del campo title del documento sono presenti nella query di ricerca, restituirà tale documento.

Ad es.

Supponiamo che ci sia un documento con title : "Nike Free Sparq Mens White" nel database elasticsearch

ora se cerco con un query : "Nike Free Sparq 09 - Mens - White/Black/Varsity Red" allora dovrebbe tornare a questo documento, perché esistono tutte le parole le document.title nella mia domanda

ma se cerco con un query : "Nike Free Lebron - Mens - White/Black" allora non dovrebbe restituire il documento perché la mia domanda ha la parola mancante Sparq

questo è una sorta di ricerca inversa-e-operatore

È possibile? Se sì, allora come?

+1

Dai un'occhiata a questo link. Troverai la tua risposta :) http: // StackOverflow.it/questions/26001002/elastic-search-difference-between-term-match-phrase-and-query-string – betto86

+0

grazie per l'aiuto @ betto86, non ha risposto alla mia domanda ma mi ha aiutato su cose più correlate. –

+2

Anche se hai postato una soluzione, voglio anche conoscere una soluzione più pulita. – akai

risposta

3

Finalmente ho funzionato, ma non con un metodo diretto!

Questo è quello che faccio:

  • creare una lista pulita di parole dalla query di origine, da:
    • modifica minuscolo
    • sostituire eventuali caratteri speciali e la punteggiatura con lo spazio
    • rimuovere le parole duplicate
  • Cerca utilizzando la corrispondenza normale con operatore OR per le parole unite come stringa
  • Ora troveremo i migliori risultati rilevanti nel risultato
  • Prendiamo questi successi uno per uno e facciamo una ricerca parola per parola in php (o in qualunque linguaggio di programmazione tu usi)
  • Questa ricerca di parole controllerà tutte le parole di un documento dagli hit che abbiamo appena trovato e li abbinerà con le parole nella query di origine; in modo tale che tutte le parole del documento hit siano presenti nella stringa di query di origine

Questo ha funzionato per me abbastanza bene!

A meno che qualcuno non abbia un metodo diretto dal linguaggio di query elasticsearch.

Problemi correlati