Question

Nous avons mis en place un index Solr contenant 36 millions de documents (~ 1K-2K chacun) et nous essayons d'interroger un maximum de 100 documents correspondant à un seul mot clé. Cela fonctionne assez vite comme nous l'avions espéré. Toutefois, si nous ajoutons maintenant & amp; & sort; create = datate + desc " à la requête (demandant ainsi les 100 meilleurs «nouveaux» documents correspondant à la requête), il s'exécute pendant une période très longue et aboutit à une exception OutOfMemoryException. D'après ce que j'ai compris dans le manuel, cela est dû au fait que Lucene doit charger toutes les valeurs distinctes de ce champ (createDate) en mémoire (le FieldCache afaik) avant de pouvoir exécuter la requête. Comme le champ createDate contient la date et l'heure, le nombre de valeurs distinctes est assez grand. Il est également important de mentionner que nous mettons fréquemment à jour l’index.

Peut-être que quelqu'un peut donner des idées et des indications sur la façon dont nous pouvons ajuster Lucene / Solr ou changer notre approche de telle sorte que les temps d'interrogation deviennent acceptables? Votre contribution sera très appréciée! Merci.

Était-ce utile?

La solution

Le problème est que Lucene stocke les nombres sous forme de chaînes. Certains utilitaires divisent la date en AAAA, MM, JJ et les placent dans des champs différents. Cela donne de bien meilleurs résultats.

La version la plus récente de Lucene (à partir de la version 2.9) prend en charge les champs numériques et les améliorations en termes de performances sont significatives (quelques ordres de grandeur, IIRC.) Vérifiez cet article sur les requêtes numériques.

Autres conseils

Vous pouvez trier les résultats par ordre d'indexation . La spécification de tri décroissant par numéro de document est la suivante:

new SortField(null, SortField.DOC, true)

Vous devez également partitionner les répertoires d'index par le champ de date. Tous les documents correspondants sont examinés par Lucene lors de la collecte des N premiers résultats. Le partitionnement divisera l'ensemble examiné. Vous n'avez pas besoin d'examiner les anciennes partitions si vous avez N résultats dans la partition la plus récente.

Essayez de convertir vos données de type Date en type Chaîne (en millisecondes, par exemple).

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