2017-06-06 2 views
0

J'ai un document dans l'index elasticsearch. Voici le document exemplerecherche elasticsearch boost dans feild ayant plusieurs valeurs

DOC1

{ 
"feild1":["hi","hello","goodmorning"] 
"feild2":"some string" 
"feild3":{} 
} 

DOC2

{ 
"feild1":["hi","goodmorning"] 
"feild2":"some string" 
"feild3":{} 
} 

DOC3

{ 
"feild1":["hi","hello"] 
"feild2":"some string" 
"feild3":{} 
} 

Je veux interroger pour feild1 ayant des valeurs "salut" et "bonjour" si les deux est présent alors ce document devrait venir en premier si quelqu'un est présent alors il devrait venir après cela. Par exemple: résultat devrait être dans l'ordre de DOC1, DOC3, DOC2. J'ai essayé avec une requête boost. mais il ne revient pas dans l'ordre que je veux. Voici la requête que j'essaie.

{ 
    "query": { 
     "bool": { 
      "must": [ 
       { 
        "match_phrase": { 
         "avail_status": true 
        } 
       }, 
       { 
        "bool": { 
         "should": [ 
          { 
           "constant_score": { 
            "filter": { 
            "terms": { 
            "feild1": [ 
             "hi" 
            ] 
            } 
            }, 
            "boost": 20 
           } 
          }, 
          { 
           "constant_score": { 
            "filter": { 
            "terms": { 
            "feild1": [ 
             "hello" 
            ] 
            } 
            }, 
            "boost": 18 
           } 
          } 
         ] 
        } 
       } 
      ] 
     } 
    } 
} 

cela me renvoie d'abord ces documents ayant "salut", puis ceux ayant "bonjour". Merci d'avance!

+0

avec la requête en cours si vous le pouvez vérifiez que vous pouvez e doc3 et doc1 obtiennent le même score depuis l'encapsulation des filtres dans custom_score igonore TDF/IDF. Je ne vois pas pourquoi ES mettrait doc3 au-dessus de doc1. Si vous utilisez un modèle pour placer un tableau avec plus de champs au-dessus du tableau avec moins de champs avec un boost pour les valeurs correspondantes, je suggère de commencer à regarder le score de la fonction. laissez-moi savoir si cela est le cas pour vous – user3775217

+0

oui je suis à la recherche de seulement cela, document ont un score élevé –

+0

j'ai posté pour score de funtion – user3775217

Répondre

1

Pour ajouter un coup de pouce supplémentaire pour les documents avec plus grand field1, vous pouvez mettre funtion_score score de script.

Mappages

{ 
    "mappings": { 
    "document_type" : { 
     "properties": { 
     "field1" : { 
      "type": "text", 
      "fielddata": true 
     }, 
     "field2" : { 
      "type": "text" 
     }, 
     "field3" : { 
      "type": "text" 
     } 
     } 
    } 
    } 
} 

__gVirt_NP_NNS_NNPS<__ documents Index

POST custom_score_index1/document_type 

{ 
"feild1":["hi","hello","goodmorning"], 
"feild2":"some string", 
"feild3":{} 
} 

POST custom_score_index1/document_type 

{ 
"feild1":["hi","goodmorning"], 
"feild2":"some string", 
"feild3":{} 
} 

POST custom_score_index1/document_type 

{ 
"feild1":["hi","hello"], 
"feild2":"some string", 
"feild3":{} 
} 

requête avec score de la fonction ajouter _SCORE supplémentaire pour la taille plus grande pour field1

POST custom_score_index1/document_type/_search 
{ 
    "query": { 
     "function_score": { 
      "query": { 
       "bool": { 
        "must": [{ 
          "match_phrase": { 
           "avail_status": true 
          } 
         }, 
         { 
          "bool": { 
           "should": [{ 
             "constant_score": { 
              "filter": { 
               "terms": { 
                "feild1": [ 
                 "hi" 
                ] 
               } 
              }, 
              "boost": 20 
             } 
            }, 
            { 
             "constant_score": { 
              "filter": { 
               "terms": { 
                "feild1": [ 
                 "hello" 
                ] 
               } 
              }, 
              "boost": 18 
             } 
            } 
           ] 
          } 
         } 
        ] 
       } 
      }, 
      "functions": [{ 
       "script_score": { 
        "script": { 
         "inline": "_score + 10000 * doc['field1'].length" 
        } 
       } 
      }], 
      "score_mode": "sum", 
      "boost_mode": "sum" 
     } 
    } 
}