2017-05-02 3 views
1

Je veux ajouter un poids pour chaque match (au lieu d'ajouter un poids une fois que si l'un de ceux remplis):ElasticSearch: Ajouter poids pour chaque match de tableau

Avoir docs comme ceci:

[{ 
    "username": "xyz", 
    "categories": [ 
     { 
      "category.id": 1 
     }, 
     { 
      "category.id": 2 
     } 
    ] 
}, { 
    "username": "xyz2", 
    "categories": [ 
     { 
      "category.id": 1 
     } 
    ] 
}] 

Et actuellement, j'ai cette requête:

{ 
    "query": { 
     "filtered": { 
      "query": { 
       "function_score": { 
        "query": { 
         "bool": {} 
        }, 
        "score_mode": "sum", 
        "boost_mode": "sum", 
        "functions": [ 
         { 
          "weight": 1.1, 
          "filter": { 
           "terms": { 
            "category.id": [ 
             1, 
             2 
            ] 
           } 
          } 
         } 
        ] 
       } 
      }, 
      "filter": { 
       "bool": { 
        "must_not": [ 
         { 
          "terms": { 
           "_id": [ 
            8 
           ] 
          } 
         } 
        ] 
       } 
      } 
     } 
    }, 
    "from": 0, 
    "size": 30 
} 

Avec cette requête, les deux entrées recevront un poids de 1.1, mais je veux la première entrée pour obtenir 2 * 1.1 parce que 2 les catégories sont appariées. Comment pourrais-je réaliser cela?

EDIT: Désolé, j'ai manqué d'ajouter la version de recherche élastique. C'est 1.7.2.

+1

Quelle version ES est-ce? –

+0

merci de mentionner que, édité en post. C'est '1.7.2' – Dennis

Répondre

1

Cela peut être un peu lourd, car pour plusieurs ID cette requête devra avoir plusieurs instructions, mais je ne pense pas qu'il y en ait d'autre. Notez également que votre référencement sur le terrain n'est pas complet - il doit être categories.category.id pour être correct. En outre, soyez prudent lors de la mise à niveau avec des points dans les noms de champs. Cela a changé dans certaines versions au fil du temps.

{ 
    "query": { 
    "filtered": { 
     "query": { 
     "function_score": { 
      "query": { 
      "match_all": {} 
      }, 
      "score_mode": "sum", 
      "boost_mode": "sum", 
      "functions": [ 
      { 
       "weight": 1.1, 
       "filter": { 
       "term": { 
        "categories.category.id": 1 
       } 
       } 
      }, 
      { 
       "weight": 1.1, 
       "filter": { 
       "term": { 
        "categories.category.id": 2 
       } 
       } 
      } 
      ] 
     } 
     }, 
     "filter": { 
     "bool": { 
      "must_not": [ 
      { 
       "terms": { 
       "_id": [ 
        8 
       ] 
       } 
      } 
      ] 
     } 
     } 
    } 
    }, 
    "from": 0, 
    "size": 30 
} 
+0

comme vous l'avez dit un peu lourd, mais au moins cela fonctionne - merci beaucoup :) – Dennis