2012-04-19 2 views
3

J'ai un document comme celui-ci:
<doc>
<arr name="StartDate">
<date>2012-08-18T17:00:00Z</date>
<date>2012-06-28T17:00:00Z</date>
<date>2013-02-28T17:00:00Z</date>
<date>2012-04-16T17:00:00Z</date>
<date>2012-08-06T17:00:00Z</date>
<date>2012-05-18T17:00:00Z</date>
<date>2012-07-04T17:00:00Z</date>
</arr>
<arr name="EndDate">
<date>2012-09-29T17:00:00Z</date>
<date>2012-06-29T17:00:00Z</date>
<date>2013-04-16T17:00:00Z</date>
<date>2012-05-07T17:00:00Z</date>
<date>2012-08-15T17:00:00Z</date>
<date>2012-06-22T17:00:00Z</date>
<date>2012-08-01T17:00:00Z</date>
</arr>
</doc>
champ Requête en multivalué solr

Je plage de dates et que vous souhaitez trouver une paire de StartDate et EndDate qui couvrent la gamme. Par exemple, la première paire de startDate et de EndDate (2012-08-18 à 2012-09-29) renvoie true si la plage d'entrée (x, y) est 2012-08-18 < x et 2012-09-29 > y.

J'ai écrit une requête comme ceci:
StartDate: [1995-12-31T23: 59: 59.999Z À 2012-08-18T00: 00: 00.000Z] ET EndDate: [2012-09-29T00: 00 : 00.000Z TO 2099-01-01T00: 00: 00.000Z]
mais le problème est SOLR rechercher toutes les dates de correspondance dans l'ensemble de 14 éléments ci-dessus, alors que je veux juste les comparer un par un (1 avec 1, 2 avec 2 ...).

S'il vous plaît aidez-moi à me dire comment faire cela. Merci beaucoup.

Répondre

2

J'ai un modèle similaire, mais à ma connaissance, il n'y a aucun moyen de le faire dans Solr.

Solr a un indice « plat », ce qui signifie que si votre entité de base ressemble à ceci:

dates: [ 
    (start1, end1), 
    (start2, end2), 
    (start3, end3) 
] 

il sera aplati à:

start_date: [ start1, start2, start3 ] 
end_date: [ end1, end2, end3 ] 

Et puisqu'il n'y a pas de lien entre chaque paire start et end, donc il n'y a aucun moyen de faire une requête de plage sur eux. Pour que cela fonctionne directement dans Solr, vous devrez probablement implémenter un type de champ Solr personnalisé qui maintient cette connexion.

Une autre solution consiste à avoir un Solr core distinct avec les champs de date et le id de votre entité principale. L'inconvénient de ceci est que vous ne pouvez pas combiner la recherche de date avec le filtrage sur d'autres champs de l'entité principale.

+0

Pour votre première solution. Je pense à utiliser la requête 'fonction' de Solr. Tant que nous pouvons parcourir les deux tableaux, nous pouvons trouver le moyen de le faire. Juste ma pensée. Je suis très nouveau à Solr. Merci, en attente d'autres réponses. – dtnam

+0

Je doute que l'ordre soit garanti pour les champs à valeurs multiples; Je n'ai pas lu la source pour vérifier cela, mais il est certainement possible que vous vous retrouviez avec '[start2, start1, start3]' à la place. – beerbajay

+0

L'autre façon que je peux voir est de dénormaliser (start1, end1) en une valeur que vous pouvez rechercher. Cependant, cela pourrait ne pas être si facile/possible du tout – Fuxi