2

J'ai beaucoup de Produits indexés dans elasticsearch. J'ai besoin d'exclure une liste d'identifiants (que je récupère à partir d'une base de données SQL), à partir d'une requête dans elasticsearch. Supposons que produits sont stockés comme,Comment exclure un grand nombre d'ID du résultat elasticsearch?

{ 
    "id" : "1", 
    "name" : "shirt", 
    "size" : "xl" 
} 

Nous montrons une liste de produits recommandés à un client basé sur un algorithme utilisant ElasticSearch. Si un client marque un produit comme «non intéressé», nous n'avons pas besoin de lui montrer à nouveau ce produit. Nous tenir ces produits dans une table SQL séparée avec Product_ID, CUSTOMER_ID et statut 'not_interested'.

Maintenant, en allant chercher des recommandations pour un client sur l'exécution, nous obtenons la liste des produits « not_interested » de la base de données SQL et envoyer le tableau de product_ids dans un filtre à ne pas ElasticSearch de les exclure de la recommandation. Mais le problème se pose, lorsque la taille de product_ids array devient trop grande.

Comment dois-je stocker les mappages id_produit et id_client dans elasticsearch pour filtrer les produits 'not_interested' à l'exécution en utilisant uniquement elasticsearch?

Est-il sensé de les stocker comme des objets imbriqués ou des documents parents/enfants? Ou tout à fait un autre moyen de stocker tel que je peux exclure certains identifiants du résultat de manière efficace.

Répondre

1

Vous pouvez exclure les ID (ou toute autre chaîne littérale) de manière efficace à l'aide d'un terms query.

Elasticsearch et Solr l'ont tous deux. C'est très puissant et très efficace. Elasticsearch a ceci avec IDS query. Cette requête est en fait une requête de termes sur le champ _uid. Assurez-vous d'utiliser cette requête dans une clause mustNot dans une requête bool. Voir: https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-ids-query.html

Dans Solr vous pouvez utiliser le terms query dans un fq comme fq=-{!terms f=id}doc334,doc125,doc777,doc321,doc253. Notez le signe moins pour indiquer que c'est une négation. Voir: http://yonik.com/solr-terms-query/

+0

Cela ne sera-t-il pas un problème si la liste des ID à annuler est une liste énorme. Disons des dizaines de milliers de ces documents. –

+0

Pas de problème si vous faites ce côté serveur car cette requête est optimisée pour votre cas d'utilisation. Je l'ai fait pour des dizaines de milliers et c'était encore très rapide!Pour voir quand il devient lent, vous devez le tester car cela dépend de la taille de votre index, mais ce sera un nombre très élevé. – drjz

+0

@drjz L'implémentation dans elasticsearch est bien documentée ici https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-terms-query.html. Puis-je avoir quelque chose de similaire à Solr aussi? _fq = - {! termes f = id} doc334, doc125, doc777, doc321, doc253_, atteindra la limite de longueur de requête si docIds est énorme. Existe-t-il un autre moyen d'implémenter cela dans Solr, comme cela a été fait dans ES. –

0

Ajouter Terms sous must_not section comme ce qui suit:

{ 
    "must_not": [ 
    { 
     "terms": { 
     "id": [ 
      "1", 
      "3", 
      "5" 
     ] 
     } 
    } 
    ] 
}