2015-09-08 5 views
9

Sto provando a creare un completamento automatico usando mongoosastic ed Elastic Search, e fino ad ora, sono stato in grado di crearlo usando il senso ma ho difficoltà a portarlo su mongoosastic.Usa mongoosastic per un completamento automatico

Ho seguito this tutorial da documenti elasticsearch, e sono stato in grado di realizzare ciò che volevo con "senso" con una mappatura che assomiglia a questo:

PUT storys/story/_mapping 
{ 
    "story" : { 
     "properties": { 
      "description": { 
       "type": "string" 
      }, 
      "title": { 
       "type" : "completion", 
       "index_analyzer": "simple", 
       "search_analyzer": "simple" 
      } 
     } 
    } 
} 

e una query come questa:

GET storys/_suggest 
{ 
    "story-suggest": { 
     "text": "bow", 
     "completion": { 
      "field": "title" 
     } 
    } 
} 

Tuttavia, sto riscontrando problemi nel portarlo su mongoosastic. Ho provato il seguente approccio:

var StorySchema = new Schema({ 
     title:{ 
      type: String, es_type:'completion', es_index_analyzer: 'simple', es_search_analyzer: 'simple', es_payloads: true 
     }, 
     description: { 
      type: String 
     } 
    }); 

StorySchema.plugin(mongoosastic); 

E quando l'interrogazione dal controller server:

Story.search({ 
    query: { 
     "match": { title : req.query.q } 
    }, 
    suggest: { 
      "my-title-suggestions-1" :{ 
       text: req.query.q, 
       completion: { 
        field: 'title' 
       } 
      } 
     } 
}); 

Capisco che quando uso "senso", sto usando l'endpoint _suggest, e questo è il motivo per cui il "query-suggerimento" funziona. Tuttavia, quando uso mongoosastic, sono limitato ad usare il .search ({}) per interrogare quali azioni come _search suppongo. Tuttavia, non riesco a trovare un modo per realizzare il comportamento più veloce che sto cercando per un completamento automatico, e continuo ad avere errori di analisi in ElasticSearch quando provo a fare una query con un suggerimento.

C'è un modo per realizzare ciò che sto cercando di fare con la ricerca mongoosastic o elastica?

Ho provato a fare questo "senso" che utilizza, ma anche se ho i suggerimenti per "completamento automatico" Ho anche avere un po 'di SearchParseExceptions:

GET _search 
{ 
    "query": { 
     "match": { title : "bow" } 
    }, 
    "suggest": { 
     "story-suggest": { 
      "text": "bow", 
      "completion": { 
       "field": "title" 
      } 
     } 
    } 
} 

risposta

11

Ecco una soluzione completa per un completamento automatico base:

  1. Aggiungere i parametri necessari per lo schema:

    var TagSchema = new Schema({ 
        name: { 
         type: String, 
         unique: true, 
         required: true, 
         es_type: 'completion', 
         es_index_analyzer: 'simple', 
         es_search_analyzer: 'simple', 
         es_payloads: true 
        } 
    }); 
    
  2. a dd il plugin per il vostro schema e creare il modello:

    TagSchema.plugin(mongoosastic); 
    var Tag = mongoose.model('Tag', TagSchema); 
    
  3. utilizzare il metodo creare mapping per registrare il mapping con ES.Se non facciamo questo passo l'indice sarà ottenere registrato con le impostazioni predefinite, quando viene creato il primo documento e indicizzati:

    Tag.createMapping(function(err, mapping) { 
        if (err) { 
         console.log('error creating mapping (you can safely ignore this)'); 
         console.log(err); 
        } else { 
         console.log('mapping created!'); 
         console.log(mapping); 
        } 
    }); 
    
  4. * opzionale - Indice documenti nel database esistente:

    var stream = Tag.synchronize(), 
        count = 0; 
    
    stream.on('data', function(err, doc) { 
        count++; 
    }); 
    stream.on('close', function() { 
        console.log('indexed ' + count + ' documents!'); 
    }); 
    stream.on('error', function(err) { 
        console.log(err); 
    }); 
    
  5. Ricerca con un corpo di query vuoto e fornitura di due opzioni: 1) Utilizzare la query ES suggest che utilizza il campo "es_completion" che abbiamo creato nel nostro schema; 2) size = 0 in modo che nessun tag venga restituito dalla query del corpo vuota.

    Tag.search(null, { 
        suggest: { 
         "tag-suggest": { 
          "text": "aTermToAutocomplete", 
          "completion": { 
           "field": "name" 
          } 
         } 
        }, 
        "size" : 0 
    }, 
    function(err, results) { 
        if (err) { 
         return console.log(JSON.stringify(err, null, 4)); 
        } 
        return console.log(JSON.stringify(results, null, 4)); 
    }); 
    
1

ho trovato un modo. Con l'ultimo aggiornamento alla libreria mongoosastic si può solo fare qualcosa di simile:

GET _search 
{ 
    "query": { 
     "match_all": {} 
    }, 
    "suggest": { 
     "story-suggest": { 
      "text": "bow", 
      "completion": { 
       "field": "title" 
      } 
     } 
    } 
} 

Questo perché la nuova versione supporta mongoosastic suggesters. Basta essere consapevoli di ciò che si sta facendo, specialmente nella parte della query, poiché un "match_all" dovrebbe corrispondere a tutti i documenti e fornire una risposta inutilmente grande; ma qualunque cosa tu inserisca nella parte "testo" del tuo suggeritore ti restituirebbe le parole da completare automaticamente.

essere consapevoli che, per far funzionare tutto questo, è necessario utilizzare il metodo createMapping nella definizione del modello, in questo modo anche:

var StorySchema = new Schema({ 
    title:{ 
     type: String, es_type:'completion', es_index_analyzer: 'simple', es_search_analyzer: 'simple', es_payloads: true 
    }, 
    description: { 
     type: String 
    } 
}); 

StorySchema.plugin(mongoosastic); 
var Story = mongoose.model('Story', StorySchema); 

Story.createMapping({}, function(err, mapping){ 
    // ... 
});