2010-02-11 9 views
3

Je veux essentiellement Solr pour rechercher chaque enregistrement du champ pour mon multivalué paramètre de recherche .. lire sur mon exemple:En Solr, Comment interroger contre un champ pour ensemble de valeurs distinctes dans un champ multivalué

J'utilise Solr pour indexer mes données. J'ai des données d'application dans des tableaux parallèles (sous la forme de champs à valeurs multiples) qui correspondent à un produit donné. Voir l'exemple suivant, où marque, le modèle et l'année sont des champs à valeurs multiples:

<-solr record start->
sku: 1234
make: acura, acura, acura
model: integra, rsx, rsx
year: 1997, 2004, 2000
engine: 3.4, 4.5, 4.5
<-solr record end->

J'utilise des requêtes de filtre (& fq de =) pour affiner mes sélections. Le problème est que si quelqu'un recherche un Acura Integra 2000, il correspondra à l'enregistrement ci-dessus, mais comme les données make, model et year sont codées en parallèle, il n'y a pas d'Acura Integra 2000 pour ce produit. Solr fait correspondre le make dans le champ make, le modèle dans le champ du modèle, et le champ année dans l'année (comme il se doit) et retourne ce résultat, et ne respecte pas mon parallélisme. Ma Recherche ressemblerait à ceci jusqu'à présent:


fq=make:"acura"&fq=model:"integra"&fq=year:2000 (I would normally escape URL characters when I POST to Solr, this is just an example)

Donc ma solution était de créer un autre champ multivalué, appelé champ résumé, dans lequel je mettrais toute la marque, le modèle, l'année et d'autres données (comme moteur) ensemble séparés par un espace. Il est nécessaire d'avoir des citations autour des mots afin que les termes avec des mots multiples ne correspondent pas aux paramètres de recherche par inadvertance. L'exemple ci-dessus maintenant ressembler à ceci:

<-solr record start->
sku: 1234
make: acura, acura, acura
model: integra, rsx, rsx
year: 1997, 2004, 2000
engine: 3.4, 4.5, 4.5
summary: "acura" "integra" "1997" "3.4", "acura" "rsx" "2004" "4.5", "acura" "rsx" "2000", "4.5"
<-solr record end->

Je puis ajouter à ma requête les éléments suivants:

summary:(""acura" AND "integra" AND "2000")

Je me attends, si j'ajouté que ma requête, que cette l'enregistrement ne viendrait plus, puisqu'il n'y a pas acura integra 2000 dans le champ résumé. Cependant, cela ne fonctionne pas. Le disque arrive toujours. Je suis perplexe. Quelqu'un at-il une solution à ce problème. Ça me tue depuis des jours.

Je souhaite fondamentalement Solr pour rechercher chaque enregistrement du champ à valeurs multiples pour mon paramètre de recherche .. est-ce possible? Y a-t-il une meilleure façon de faire ce que j'essaie de faire?

Merci

Répondre

3

Je ne suis toujours pas sûr de la façon de maintenir le parallélisme sans un champ de résumé, mais j'ai trouvé comment le faire avec un champ de résumé.Au lieu d'utiliser les instructions AND, qui je crois rechercher chaque match dans le champ à valeurs multiples pour une correspondance (chaque terme AND pourrait correspondre à une ligne différente dans le champ Multivalued, pas nécessairement la même ligne), vous mettez plutôt les termes exacts re recherche, dans le même ordre que vous avez construit votre résumé d'origine, et utilisez l'opérateur ~.

Jetez un oeil à l'exemple suivant:

Voici le contenu du champ de résumé dans l'une des lignes dans le champ à valeurs multiples, que je souhaite faire correspondre: "Honda" "Accord" "2004" "3.5L"

Voici la requête que je vais exécuter: summary_field:("\"Honda\" \"2004\"")

La requête ci-dessus ne fonctionnera pas seule. Même si je peux avoir une fonction qui place l'entrée utilisateur de l'application dans le même ordre que le champ de résumé original, car les utilisateurs de l'application peuvent entrer une donnée (une marque, année du modèle) dans n'importe quel ordre, peut-être d'autres mots entre les données que j'essaie de faire correspondre. Dans l'exemple ci-dessus, je veux faire correspondre Honda 2004 à ce record. Cependant, Accord est entre elle. Pour contourner ce problème, utilisez simplement l'opérateur ~ n, où n est le nombre maximal d'autres termes entre les termes que vous recherchez. Donc, si je l'utilise à la place:

summary_field:("\"Honda\" \"2004\""~1)

Je dis que entre Honda et 2004, il y a une possibilité d'être là 1 autre mot. Par conséquent, cette requête ci-dessus correspondra. Même si vous ajoutez plusieurs termes à votre champ récapitulatif, tant que vous l'interrogez avec les valeurs dans le même ordre et que votre logique de recherche floue utilise un nombre qui correspond à la distance maximale entre deux valeurs, votre requête correspondra toujours correctement le champ de résumé correct. Donc, si vous avez 20 champs que vous ajoutez à votre champ de résumé pour maintenir le parallélisme, vous devez simplement utiliser ~ 18, car c'est la distance maximale possible dans le pire des cas entre les mots qui pourraient être choisis par l'utilisateur.

3

Il semble que votre schéma ne soit pas correct. Vous devez complètement dénormaliser vos données et créer un document par véhicule. Ce que signifie un "véhicule" dépend du type de recherches que vous exécuterez. Par exemple, un schéma possible serait:

sku: 1234 
make: acura 
model: integra 
years: 1997 
engines: 3.4, 4.5 

sku: 1235 
make: acura 
model: rsx 
years: 2000, 2004 
engines: 4.5 

Le champ sommaire serait un copyField de maquillage + modèle + ans + moteurs

+0

Salut. C'était ma solution originale exactement, et cela fonctionne parfaitement! Le seul problème est, lorsque vous allez à l'écran du produit de mon site, vous visualisez le nombre d'applications au lieu du nombre de produits. Si la même marque, le même modèle et la même année appartiennent à un sku, et que seul le moteur ou le sous-modèle est différent, je l'indique simplement dans une section "ajustée" en dessous du produit. Par exemple, je pourrais rouler 4 applications ensemble dans 1 "boîte" de produit sur mon site. Les résultats de la recherche devraient indiquer la visualisation 1 de 1. Au lieu de cela, il est indiqué de regarder 4 sur 4 (même s'il y a une boîte sur l'écran). Par conséquent, mon nouveau schéma ... – Dan

+0

@Dan: jetez un oeil à l'effondrement de champ: http://wiki.apache.org/solr/FieldCollapsing –

+0

Parce que le problème est un SKU (12345) peut s'adapter à plusieurs véhicules. avoir chacun un SKU + un véhicule en tant que son propre enregistrement est agréable, mais les voir comme un client est horrible. En enroulant chaque véhicule (et applications) et en l'attachant au même SKU, il le rend plus visible. Cependant, vous pourriez voir 10 applications par page, mais vous n'avez que 3 "boîtes" dans lesquelles un utilisateur peut acheter quelque chose. Donc, il est dit Affichage des articles 1 à 10, mais seulement 3 "boîtes" avec des images et un "bouton pour acheter" est répertorié. – Dan

0

Pouvez-vous pas juste faire une requête comme suit?

make:acura AND model:integra AND year:2000 

I.e. Sans les citations autour de la marque et du modèle.

Questions connexes