Comment faire un cadeau d'anniversaire (non-date de naissance) de recherche dans Solr?

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

  •  22-08-2019
  •  | 
  •  

Question

J'ai un indice qui stocke naissance dates, et je voudrais rechercher toute personne dont la date naissance est dans X jours d'un certain mois / jour. Par exemple, je voudrais savoir si l'anniversaire de personne est à venir dans un certain nombre de jours, peu importe quelle année ils sont nés. Comment puis-je effectuer cette requête en utilisant ce Solr? (Sur le champ "date de naissance")

En tant que suivi, en supposant cette requête est exécutée très souvent, devrais-je indexation autre chose que la date de naissance? Telles que la paire mois-jour? Quelle est la manière la plus efficace de faire une telle requête (du point de vue de la requête et de l'indexation)?

Était-ce utile?

La solution

Vous devez vous rappeler que Solr utilise Lucene, et que maintenant -. Tout est stocké et indexé sous forme de chaîne

requête de l'aire de répartition est ne fonctionnera pas parce que les dates sont généralement en interne indexés comme AAAAMMJJ

Avoir un champ séparé dans l'index qui vient de stocker des chaînes mmjj serait facilement consultable. Ou si vous ne voulez pas un champ supplémentaire, et sont prêts à indexer les dates différemment, réorganiser l'ordre lors de l'indexation de sorte que sont indexés MMDDYYY date de naissance

Ensuite, vous pouvez construire rangequeries, parce que tout ce que vous devez faire correspondre est à l'avant de la chaîne, et Lucene correspond lexiographically

(A rangequery qui était ba -.> Bc correspondrait Batte, BASEBALL, mais pas à cause)

L'indexation comme celui-ci est un coût fixe ci-devant, et ne marche pas détruire quoi que ce soit autre que arrangement interne par ordre chronologique. Si c'est un problème, utilisez deux champs, l'espace disque est pas cher!)

Autres conseils

Si une paire jour / mois est difficile (je ne sais pas si elle est ou non) pourquoi ne pas avoir un champ de « leur anniversaire en 1980 » (si elles étaient en vie alors ou non). Ensuite, il vous suffit de faire la recherche contre 1980. C'est efficacement une paire de jours / mois, mais stocké dans un type que vous pouvez utiliser facilement.

Notez que 1980 est une année bissextile, ce qui est la raison pour laquelle je l'ai choisi -. Sinon ceux qui ont un anniversaire de Février 29 pourrait être difficile à représenter

En variante, une paire « jour / mois » sous la forme d'un nombre entier:

(100 * month) + day

vous donnerait une représentation simple qui serait facile à la recherche et l'index. Je l'ai souvent constaté que le stockage des données dans un seul champ est plus simple que d'utiliser deux champs. Là encore, je ne l'ai jamais utilisé Solr ...

EDIT: J'ai eu une autre idée. Il est un doux de peu, mais quand même ...

Rangez la naissance date dans un format qui est effectivement le mois, jour, année. Je ne sais pas si Solr pourrait facilement le faire en format MM / jj / aaaa, puis faire une recherche de l'ordre lexicographique, mais l'alternative est

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

(Ceci est en supposant que vous n'avez pas besoin pour stocker les dates de naissance plus tôt que 1900. Je suis sûr que vous pouvez l'adapter.)

Vous pouvez toujours récupérer la date de naissance d'origine, mais la commande sera en ordre d'anniversaire, la personne la plus âgée d'abord pour une date donnée.

Il ne signifie pas qu'il est difficile de trier les gens par leur réelle âge bien. Je ne sais pas si c'est un problème pour vous.

Quoi qu'il en soit, comme je l'ai dit est un peu hors le mur, mais il pourrait aider:)

Vous pouvez stocker l'anniversaire comme un numéro de 1 à 366. Ensuite, la recherche de cette valeur. L'avantage est que vous pouvez rechercher avec des plages de jour assez facilement. L'inconvénient est que vous ne pouvez pas utiliser facilement ce domaine pour trouver des personnes dont l'anniversaire est ce mois-ci.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top