2015-08-12 12 views
5

Sto facendo una ricerca generale contro elasticsearch (1.7) e tutto va bene, tranne che i miei numeri di account hanno barre in avanti in loro. Il campo del numero di account non è il campo id ed è "not_analyzed".escaping le barre in avanti in elasticsearch

Se eseguo una ricerca su un numero di conto, ad es. AC/1234/A01 quindi ottengo migliaia di risultati, presumibilmente perché sta facendo una ricerca regolare (?).

{ 
    "query" : { "query_string" : {"query" : "AC/1234/A01"} } 
} 

posso ottenere il risultato che voglio facendo una ricerca esatta corrispondenza

{ 
    "query" : { "query_string" : {"query" : "\"AC/1234/A01\""} } 
    } 

Questo in realtà mi dà il risultato che voglio e, probabilmente, si inserisce il disegno di legge come opzione di backup (che circonda tutto 'single parola "cerca tra virgolette"). Tuttavia, sto pensando che se fanno una ricerca di più parole, incluso il numero di conto, tornerò a migliaia di risultati e sebbene non riesca a vedere il valore di tale ricerca, vorrei evitare che ciò accada.

In sostanza, ho un'app java che interroga la ricerca elastica e vorrei sfuggire a tutte le barre inserite nella GUI.

mio Googling mi ha detto che

{ 
    "query" : { "query_string" : {"query" : "AC\\/1234\\/A01"} } 
} 

dovrebbe fare questo, ma non fa differenza, le opere di query, ma ho ancora ottenere migliaia di risultati.

Qualcuno potrebbe indicarmi la giusta direzione?

+1

Perché stai usando 'query_string' qui? 'term' corrisponde a un termine così com'è. – Maroun

+0

C'è una casella di immissione per i termini di ricerca che può essere una parola o una frase, con o senza operatori booleani. Alla base, sta interrogando tutti i dati. Funziona bene tranne per il /. A quanto ho capito, un termine query può interrogare solo un campo alla volta (e io dovrei analizzare personalmente la query per usare una query sui termini, credo)? Per favore, correggimi se sbaglio! – gringogordo

+1

La differenza principale tra query 'term' e' match' e 'query_string' è che' term' non sta analizzando l'input. Usando la query 'term' puoi cercare un termine e usando' terms' puoi fare un paio di termini contemporaneamente. Più appropriato per la ricerca su più campi è 'multi_match' o' query_string'. Non ho controllato, ma penso che potresti anche usare la query 'term' con alias' _all', e 'trick' 'terms' query per esaminare più di una colonna in una volta. – slawek

risposta

9

Si dovrebbe ottenere ciò che si vuole senza sfuggire nulla semplicemente specificando un keyword analyzer per la stringa di query, in questo modo:

{ 
    "query" : { 
    "query_string" : { 
     "query" : "AC/1234/A01", 
     "analyzer": "keyword"   <---- add this line 
    } 
    } 
} 

Se non si esegue questa operazione, viene utilizzato l'analizzatore standard (e sarà tokenize la stringa della query) indipendentemente dal tipo di campo o dal fatto che sia not_analyzed o meno.

+0

Mille grazie, questo sembra adattarsi al conto. Credo di aver bisogno di capirlo un po 'meglio prima di metterlo in produzione (influisce sui booleani e su altre tecniche di ricerca più avanzate ... il tempo di studiare di più!) Ma sembra perfetto. Grazie mille. – gringogordo

+8

Questo non sembra funzionare nell'ultima ES! –

Problemi correlati