2017-09-05 6 views
1

Ceci est probablement une chose simple, mais je ne peux pas sembler obtenir ma tête autour:résultats dans un ordre aléatoire Comparaison avec: clause where utilisant searchkick et rails

Je veux revenir ElasticSearch:

@random_books   = Book.search("*", where: { status: :published }, body: { query: { function_score: { random_score: { seed: seed }}}}, page: params[:page], per_page: 12) 

Les results renvoyés n'honorent pas la clause where: {status: :published}. Comment puis-je syntaxe jusqu'à cette requête? Modifications: Trouvé another question demandant fondamentalement la même chose; sans solution de travail/réponse bien sûr.

Répondre

0

D'accord, voici la solution:

seed = Time.zone.now.to_i 

@random_books = Book 
        .search("*", 
         body: { 
         query: { 
          function_score: { 
          query: { 
           match: { status: :published } 
           }, 
          random_score: { 
           seed: seed 
          } 
          } 
         } 
         }, 
         page: params[:random], 
         per_page: 12) 

Searchkick sera ignore the options (comme where: clause) si nous passons à body ElasticSearch. Donc, nous match le query à l'intérieur de function_score comme décrit here.

Facile à faire.

0

S'il vous plaît, remplacer votre clause where comme ceci:

où: { 'statut IN (?)', [ 'Publié']}

+0

J'ai déjà essayé. Erreurs sur 500, sans rien dans les journaux/trace. :-( – marvindanig

+0

Est-ce que 'status' enum? Si oui alors vous pouvez aussi écrire comme' status.published? 'Il retournera vrai ou faux – Asmita

+0

Juste un attribut de modèle ordinaire du livre avec la validation comme ça:' validates: status, inclusion : {dans:% w (brouillon publié brouillon) ...} '. – marvindanig