2016-06-08 33 views
6

Ho un link come http://drive.google.com e voglio abbinare "google" al link.Come faccio una corrispondenza parziale in Elasticsearch?

ho:

query: { 
    bool : { 
     must: { 
      match: { text: 'google'} 
     } 
    } 
} 

Ma questo corrisponde solo se l'intero testo è 'google' (case insensitive, in modo che corrisponda anche Google o Google, ecc). Come faccio a trovare il "google" all'interno di un'altra stringa?

+0

Forse corrispondenza: {testo: '. * Google. *'} 'Può essere d'aiuto. –

+0

Incredibile che ha funzionato! Puoi inserire la tua risposta come una "Risposta" in modo da poterla scegliere come migliore? – user3835653

+0

Ho aggiunto la risposta e fornito alcuni riferimenti rilevanti. –

risposta

5

Il punto è che la regex elasticsearch si utilizza requires a full string match:

modelli di Lucene sono sempre ancorati. Il modello fornito deve corrispondere all'intera stringa.

Così, per soddisfare qualsiasi carattere (ma un ritorno a capo), è possibile utilizzare .* modello:

match: { text: '.*google.*'} 
       ^^  ^^ 

più Una variazione è per i casi in cui la stringa può avere ritorni a capo: match: { text: '(.|\n)*google(.|\n)*'}. Questo orribile (.|\n)* è un must in ElasticSearch perché questo flavor regex non consente alcuna soluzione alternativa a [\s\S], né alcun flag DOTALL/Singleline. "The Lucene regular expression engine is not Perl-compatible but supports a smaller range of operators."

+0

Questo non funziona per me. – Battousai

+0

@Battousai Sentitevi liberi di inviare una domanda. Molto probabilmente c'è un problema con * come * stai usando la regex. –

0

Per una soluzione più generica, è possibile esaminare utilizzando un diverso analizzatore o definendo il proprio. Suppongo che tu stia utilizzando l'analizzatore standard che dividerebbe http://drive.google.com nei token "http" e "drive.google.com". Questo è il motivo per cui la ricerca di Google solo non funziona perché sta tentando di confrontarlo con l'intero "drive.google.com".

Se invece i tuoi documenti sono stati indicizzati utilizzando il semplice analizzatore, l'avrebbero diviso in "http", "unità", "google" e "com". Questo ti permetterà di abbinare qualcuno di questi termini per conto proprio.

Problemi correlati