2017-09-29 5 views
0

J'ai un index pour produits est Solr. Je dois fournir une liste personnalisée de produits pour chaque client, de sorte que je doive exclure certains produits spécifiques pour chaque client. Actuellement, je stocke cette relation du client & exclus les produits dans une base de données SQL, puis les filtrer dans Solr en utilisant une requête de termes. Y at-il un moyen de stocker cette relation dans Solr lui-même afin que je n'ai pas besoin de calculer la liste d'exclusion à chaque fois à partir de SQL.Comment filtrer une énorme liste d'identifiants de Solr à l'exécution

Quelque chose de très similaire à ce que nous pouvons faire dans ElasticSearch en utilisant https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-terms-query.html

façons possibles que je pourrais penser à faire en Solr: indice

  1. Garder une liste de clients dans le produits lui-même, et le filtre sur ça. Mais ce sera vraiment pénible si je dois réindexer tous les documents. Aussi, la liste peut être énorme. Une autre façon que je pourrais penser est de maintenir un noyau séparé pour garder des documents par client et exclu product_id et effectuer une jointure en utilisant {! Join} pour filtrer les produits pour un client. Est-ce une solution évolutive.

Quelle devrait être l'approche idéale pour stocker ce type de données dans Solr.

Répondre

1

Existe-t-il des problèmes de performances avec la base de données SQL? Il est parfaitement possible d'interroger la base de données et d'obtenir les ID, puis de les envoyer à Solr. Vous éviterez la complexité et la duplication des données. Vous devriez de toute façon faire un peu de calcul pour envoyer ces identifiants à Solr.

Mais pour répondre à votre question, oui, vous pouvez stocker les ID de produit exclus par client dans un index distinct. Vous utiliseriez un champ à plusieurs valeurs et update using atomic updates. Si vous faites cela, assurez-vous de garder le schéma d'indexation simple sans utiliser d'analyseur pour les ID (utilisez simplement le type string sans tokenizer ni filtre).

Vous n'avez pas besoin d'effectuer une requête de jointure Solr. Vous n'avez qu'à rechercher les ID de produit par client (1ère requête) et les masquer en tant que CSV, et effectuez le terms query avec les ID de produit extraits de l'index (2ème requête).

+0

Merci pour la réponse ici. Je pense que je vais aller de l'avant avec l'approche SQL seulement. Va filtrer la requête ussig des termes d'ids. –

1

Vous devez trouver le meilleur compromis pour vous

meilleur temps des requêtes Performances Vous ajoutez un champ (multi valuées) à l'indice des produits: allowed_users (ou forbidden_users) en fonction de la cardinalité (que vous voulez minimiser). Cela nécessiterait une réindexation pour la première fois et une mise à jour d'index pour chaque changement d'autorisation utilisateur. Afin de réduire le trafic réseau et d'optimiser les mises à jour, vous pouvez jeter un oeil aux mises à jour atomiques [1].

Meilleur index Performances Temps Si l'approche précédente n'est pas possible dans votre cas ou vous ne pourriez-vous satisfait pas, essayez d'optimiser le côté d'indexation. Vous pouvez indexer un document dans une collection séparée:

<Id> 
<product_id> 
<user_id> 

Vous pouvez utiliser le temps de requête rejoindre pour filtrer la collection pour l'utilisateur actuel, puis récupérer les produits pour les filtrer sur votre requête.

Donc, fondamentalement, vous avez déjà pensé à la fois les idées :)

[1] https://lucene.apache.org/solr/guide/6_6/updating-parts-of-documents.html