2014-11-24 10 views
5

È possibile implementare un cercapersone affidabile dei risultati di ricerca elasticsearch se più documenti hanno punteggi uguali?Cercapersone in Elasticsearch quando i risultati hanno punteggi uguali

Sto sperimentando con il punteggio personalizzato in elasticsearch. Molte delle espressioni di punteggio che cerco producono serie di risultati in cui molti documenti hanno punteggi uguali. Sembrano venire nello stesso ordine ogni volta che provo, ma può essere garantito?

AFAIU non può, specialmente se non c'è più di un frammento in un cluster. Documenti con punteggio uguale wrt. una determinata query elasticsearch viene restituita in ordine casuale non deterministico che può cambiare tra le invocazioni della stessa query, anche se il database sottostante non cambia (e pertanto il paging non è affidabile) a meno che non contenga una delle seguenti:

  1. Io uso function_score per garantire che il punteggio sia univoco per ogni documento (ad esempio utilizzando un campo numerico univoco).
  2. Io uso sort e garantisco che l'ordinamento definisce un ordine totale (ad esempio utilizzando un campo unico come fallback se tutto il resto è uguale).

Qualcuno può confermare (e forse indicare qualche riferimento)?

Cambia questo se so che esiste un solo frammento primario senza repliche (vedere altra interrogazione simile: Inconsistent ordering of results across primary /replica for documents with equivalent score)? Per esempio. se garantisco che c'è un frammento E non vi è alcun cambiamento nel database tra due invocazioni della stessa query, allora quella query restituirà i risultati nello stesso ordine?

Quali sono altre alternative (se presenti)?

risposta

1

Ho finito per utilizzare un ordinamento aggiuntivo nei casi in cui è probabile che si verifichino i punteggi parziali, ad esempio la ricerca per categoria di prodotto. Questo ordinamento aggiuntivo potrebbe essere id, data di creazione o simile. Il setup è 2 server, 3 shards e 1 replica.

+1

Questo è il metodo consigliato, per ordinare prima per '_score' e poi per il campo secondario di spareggio. –

+0

@LeeH come si aggiunge il tiebreaker con _id? – Lion789

Problemi correlati