Come eseguire una ricerca del compleanno (non della data di nascita) in Solr?

StackOverflow https://stackoverflow.com/questions/702168

  •  22-08-2019
  •  | 
  •  

Domanda

Ho un indice che memorizza le date di nascita e vorrei cercare qualcuno la cui data di nascita sia entro X giorni da un determinato mese/giorno.Ad esempio, vorrei sapere se entro un certo numero di giorni arriverà il compleanno di qualcuno, indipendentemente dall'anno di nascita.Come eseguirei questa query utilizzando Solr?(nel campo "data di nascita")

Di conseguenza, supponendo che questa query venga eseguita molto spesso, dovrei indicizzare qualcosa di diverso dalla data di nascita?Ad esempio solo la coppia mese-giorno?Qual è il modo più efficiente per eseguire tale query (dal punto di vista della query e dell'indicizzazione)?

È stato utile?

Soluzione

È necessario ricordare che Solr utilizza Lucene, e che fin d'ora -. Tutto viene memorizzato e indicizzato come stringa

interrogazione Gamma come è non funziona perché le date sono generalmente indicizzati internamente come AAAAMMGG

Avere un campo separato nella indice che memorizza solo le stringhe MMGG sarebbe facili da trovare. Oppure, se non si vuole un campo aggiuntivo, e sono disposti a indicizzare le date in modo diverso, modificare l'ordine durante l'indicizzazione in modo che la data di nascita sono indicizzati MMDDYYY

Quindi è possibile costruire rangequeries, perché tutto è necessario abbinare contro è nella parte anteriore della stringa, e Lucene partite lexiographically

(A rangequery che era ba -.> Bc sarebbe partita pipistrello, baseball, ma non perché)

L'indicizzazione come questo è un costo fisso di un tempo, e pretende di distruggere qualcosa di diverso disposizione interna in ordine cronologico. Se questo è un problema, utilizzare due campi, lo spazio su disco è a buon mercato!)

Altri suggerimenti

Se una coppia giorno/mese è complicata (non so se lo sia o no) perché non inserire un campo "il loro compleanno nel 1980" (indipendentemente dal fatto che fossero vivi allora o meno).Quindi devi solo fare la ricerca rispetto al 1980.Questo è effettivamente una coppia giorno/mese, ma memorizzata in un tipo che puoi usare facilmente.

Tieni presente che il 1980 è un anno bisestile, motivo per cui l'ho scelto, altrimenti chi compie gli anni il 29 febbraio potrebbe essere difficile da rappresentare.

In alternativa, una coppia "giorno/mese" sotto forma di numero intero:

(100 * month) + day

ti darebbe una rappresentazione semplice che sarebbe facile da cercare e indicizzare.Di solito ho scoperto che archiviare i dati in un singolo campo è più semplice che utilizzare due campi.Poi di nuovo, non ho mai usato Solr...

MODIFICARE: Ho avuto un'altra idea.È un po' mite, ma anche così...

Conserva la nascita data in un formato che sia effettivamente mese, giorno, anno.Non so se Solr potrebbe farlo facilmente nel formato MM/gg/aaaa e quindi eseguire una ricerca in ordine lessicografico, ma l'alternativa è

(100000 * month) + (1000 * dayOfMonth) + (year - 1900)

(Ciò presuppone che non sia necessario memorizzare date di nascita precedenti al 1900.Sono sicuro che puoi personalizzarlo.)

Puoi ancora recuperare la data di nascita originale, ma l'ordinamento sarà in ordine di compleanno, con la persona più anziana per prima per ogni data particolare.

Significa che è difficile classificare le persone in base alla loro realtà età Anche se.Non so se questo è un problema per te.

Comunque, come ho detto è un po' fuori dal comune, ma potrebbe aiutare :)

È possibile memorizzare il compleanno come un numero da 1 a 366. Quindi cerca quel valore. Il vantaggio è che si può quindi cercare con gamme di giorno abbastanza facilmente. Lo svantaggio è che non è possibile utilizzare facilmente questo campo per la ricerca di persone il cui compleanno è questo mese.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top