2013-01-15 19 views
7

Stiamo eseguendo ElasticSearch e stiamo riscontrando alcuni problemi durante la ricerca di termini che contengono uno spazio. Un esempio concreto: c'è una persona di nome JM Bruno, ma durante la ricerca di questo non vengono restituiti risultati. Ricordo vagamente che la ricerca di questo esatto termine ha restituito il risultato, ma non posso riprodurlo proprio ora.ElasticSearch per termini con spazi

Ho provato ad aggiungere uno spazio e "\" al mio pattern di tokenizer, senza molta fortuna. Le impostazioni ES sono le seguenti (utilizzando la gemma Tyre in un'applicazione Ruby on Rails)

module Search 
def self.included base 
base.send :include, Tire::Model::Search 
base.send :include, Tire::Model::Callbacks 

base.class_eval do 
    settings analysis: { 
       filter: { 
       ngram: { 
        type: 'nGram', 
        max_gram: 12, 
        min_gram: 3 
       }, 
       url_stop: { 
        type: "stop", 
        stopwords: %w[http https] 
       } 
       }, 
       tokenizer: { 
       url_email_tokenizer: { 
        pattern: '[^\w\-\[email protected]]+', 
        type: 'pattern' 
       } 
       }, 
       analyzer: { 
       url_analyzer: { 
        tokenizer: "url_email_tokenizer", 
        filter: %w[url_stop ngram], 
        type: "custom" 
       }, 
       name_analyzer: { 
        tokenizer: 'url_email_tokenizer', 
        filter: 'ngram', 
        type: 'custom' 
       } 
       } 
      } 


    end 
    end 
end 

Usiamo questi tokenizers per la ricerca di nomi di dominio e indirizzi e-mail pure.

risposta

3

Provare a eseguire _analyze API con l'analizzatore applicato al campo.

curl -XGET 'localhost:9200/_analyze?analyzer=name_analyzer' -d 'JM Bruno' 

Vedrete come elasticsearch spezza il contenuto del campo in token e perché non è possibile cercare utilizzando un TermQuery. Un TermQuery non viene analizzato quindi confronta la query esattamente come è con l'indice invertito.

+0

restituisce un codice 400 con l'errore 'riuscito a trovare analizzatore'. L'ES non è a conoscenza di ciò che utilizzo per le impostazioni nella gemma di Tyre quando si tratta di analizzatori? – HannesFostie

+0

Prova MyModel.index.analyze "Il mio testo", analizzatore: "name_analyzer" – karmi

+0

capito che avevo bisogno di aggiungere l'indice, ma la risposta non significa molto per me. Certo, trova un mucchio di token come mi aspetterei che venissero tokenizzati dal ngram, ma questo non spiega il motivo per cui non è incluso nella ricerca (almeno, non è chiaro per me) – HannesFostie

0

Ho riscontrato lo stesso problema e l'unica cosa a cui sono giunto è stata la sostituzione del carattere dello spazio con "?" jolly. Sembrava che il tokenizer predefinito e uno che stavo specificatamente richiedendo in query string search fossero ignorati.

Problemi correlati