2015-10-28 11 views
8

Tutti, stavo cercando di applicare Twitter typeahead e Bloodhound nel mio progetto basato su un campione funzionante, ma non riesco a capire sotto il codice.Understanding Bloodhound.tokenizers.obj.whitespace

datumTokenizer: Bloodhound.tokenizers.obj.whitespace('songs'), 
queryTokenizer: Bloodhound.tokenizers.whitespace, 

Il codice originale si presenta come di seguito.

var songlist = new Bloodhound({ 
       datumTokenizer: Bloodhound.tokenizers.obj.whitespace('songs'), 
       queryTokenizer: Bloodhound.tokenizers.whitespace, 
       limit: 10, 
       remote: '/api/demo/GetSongs?searchTterm=%QUERY' 

      }); 

Il official document appena detto:

datumTokenizer - Una funzione con la firma (dato) che trasforma un dato in un array di token di stringa. Necessario.

queryTokenizer - Una funzione con la firma (query) che trasforma una query in una matrice di token stringa. Necessario.

Che cosa significa? Qualcuno potrebbe aiutarmi a dirmi di più su di esso in modo da avere una migliore comprensione?

+4

Questi sono davvero sotto documentati. La mia impressione è che quando un utente fa una query, ad esempio "Cane gatto", la query di spazio biancoTokenizer la divide in spazi vuoti, risultando in una matrice come "[" Cane "," gatto "]'. Quindi, quando arrivano i risultati, il datumTokenizer divide anche quelli. Quindi, se hai un risultato con il nome di una canzone di "Cani e gatti scoppiano", questo verrà diviso in un array. Infine, Bloodhound confronta i due array, e se la totalità dell'array di query si trova nell'array di riferimento, la considera una corrispondenza. Sono sicuro all'80% di questo. – mlissner

risposta

1

È il token utilizzato per suddividere i dati o eseguire una query in una serie di parole per eseguire la ricerca/corrispondenza. datumTokenizer si riferisce ai tuoi dati e queryTokenizer si riferisce alla query fatta (di solito il testo digitato nell'input).

Se i dati sono una matrice di oggetto (ad esempio, json), datumTokenizer consente di specificare su quale campo (i) del proprio oggetto si desidera eseguire la ricerca. Ad esempio, se si desidera effettuare una ricerca sui campi nome e codice, è possibile immettere qualcosa come Bloodhound.tokenizers.obj.whitespace(['name','code']) o fornire una funzione personalizzata.

Potete trovare ulteriori informazioni all'indirizzo: https://github.com/twitter/typeahead.js/blob/master/doc/migration/0.10.0.md#tokenization-methods-must-be-provided

4

ho trovato alcune informazioni utili qui:

https://github.com/twitter/typeahead.js/blob/master/doc/migration/0.10.0.md#tokenization-methods-must-be-provided

I metodi tokenizzazione più comuni divisi una determinata stringa su spazi bianchi o non-word . Bloodhound fornisce implementazioni per quei metodi fuori dalla scatola:

// returns ['one', 'two', 'twenty-five'] 
    Bloodhound.tokenizers.whitespace(' one two twenty-five'); 

    // returns ['one', 'two', 'twenty', 'five'] 
    Bloodhound.tokenizers.nonword(' one two twenty-five'); 

per la query tokenizzazione, probabilmente si vorrà utilizzare uno dei metodi di cui sopra. Per la tokenizzazione dei dati, è qui che potresti voler fare qualcosa di leggermente più avanzato.

Per i riferimenti, a volte si desidera che i token vengano sottoposti a dervying da più di una proprietà. Ad esempio, se si stavano costruendo un motore di ricerca per i repository GitHub, probabilmente sarebbe saggio avere gettoni derivati ​​dal nome, il proprietario del pronti contro termine, e la lingua primaria:

var repos = [ 
    { name: 'example', owner: 'John Doe', language: 'JavaScript' }, 
    { name: 'another example', owner: 'Joe Doe', language: 'Scala' } 
    ]; 

    function customTokenizer(datum) { 
    var nameTokens = Bloodhound.tokenizers.whitespace(datum.name); 
    var ownerTokens = Bloodhound.tokenizers.whitespace(datum.owner); 
    var languageTokens = Bloodhound.tokenizers.whitespace(datum.language); 

    return nameTokens.concat(ownerTokens).concat(languageTokens); 
    } 

Ci possono essere anche lo scenario in cui si vuoi che la tokenizzazione dei dati venga eseguita sul back-end. Il modo migliore per farlo è semplicemente aggiungere una proprietà ai tuoi dati che contiene quei token. È quindi possibile fornire una tokenizzatore che restituisce solo i gettoni già esistenti:

var sports = [ 
    { value: 'football', tokens: ['football', 'pigskin'] }, 
    { value: 'basketball', tokens: ['basketball', 'bball'] } 
    ]; 

    function customTokenizer(datum) { return datum.tokens; } 

Ci sono molti altri modi si potrebbe andare su creazione di token datum, è in realtà solo dipende da ciò che si sta cercando di realizzare.

Sembra spiacevole che questa informazione non sia stata più facile da trovare dalla documentazione principale.

Problemi correlati