2011-09-15 5 views
1

c'est une question très novice mais j'essaie de comprendre comment booster certains éléments dans un document fonctionne.elasticsearch boosting ralentissement requête

J'ai commencé avec cette requête,

{ 
    "from": 0, 
    "size": 6, 
    "fields": [ 
    "_id" 
    ], 
    "sort": { 
    "_score": "desc", 
    "vendor.name.stored": "asc", 
    "item_name.stored": "asc" 
    }, 
    "query": { 
    "filtered": { 
     "query": { 
     "query_string": { 
      "fields": [ 
      "_all" 
      ], 
      "query": "Calprotectin", 
      "default_operator": "AND" 
     } 
     }, 
     "filter": { 
     "and": [ 
      { 
      "query": { 
       "query_string": { 
       "fields": [ 
        "targeted_countries" 
       ], 
       "query": "All US" 
       } 
      } 
      } 
     ] 
     } 
    } 
    } 
} 

alors je besoin pour stimuler certains éléments dans le document plus que les autres donc je l'ai fait

{ 
    "from": 0, 
    "size": 60, 
    "fields": [ 
    "_id" 
    ], 
    "sort": { 
    "_score": "desc", 
    "vendor.name.stored": "asc", 
    "item_name.stored": "asc" 
    }, 
    "query": { 
    "filtered": { 
     "query": { 
     "query_string": { 
      "fields": [ 
      "item_name^4", 
      "vendor^4", 
      "id_plus_name", 
      "category_name^3", 
      "targeted_countries", 
      "vendor_search_name^4", 
      "AdditionalProductInformation^0.5", 
      "AskAScientist^0.5", 
      "BuyNowURL^0.5", 
      "Concentration^0.5", 
      "ProductLine^0.5", 
      "Quantity^0.5", 
      "URL^0.5", 
      "Activity^1", 
      "Form^1", 
      "Immunogen^1", 
      "Isotype^1", 
      "Keywords^1", 
      "Matrix^1", 
      "MolecularWeight^1", 
      "PoreSize^1", 
      "Purity^1", 
      "References^1", 
      "RegulatoryStatus^1", 
      "Specifications/Features^1", 
      "Speed^1", 
      "Target/MoleculeDescriptor^1", 
      "Time^1", 
      "Description^2", 
      "Domain/Region/Terminus^2", 
      "Method^2", 
      "NCBIGeneAliases^2", 
      "Primary/Secondary^2", 
      "Source/ExpressionSystem^2", 
      "Target/MoleculeSynonym^2", 
      "Applications^3", 
      "Category^3", 
      "Conjugate/Tag/Label^3", 
      "Detection^3", 
      "GeneName^3", 
      "Host^3", 
      "ModificationType^3", 
      "Modifications^3", 
      "MoleculeName^3", 
      "Reactivity^3", 
      "Species^3", 
      "Target^3", 
      "Type^3", 
      "AccessionNumber^4", 
      "Brand/Trademark^4", 
      "CatalogNumber^4", 
      "Clone^4", 
      "entrezGeneID^4", 
      "GeneSymbol^4", 
      "OriginalItemName^4", 
      "Sequence^4", 
      "SwissProtID^4", 
      "option.AntibodyProducts^4", 
      "option.AntibodyRanges&Modifications^1", 
      "option.Applications^4", 
      "option.Conjugate^3", 
      "option.GeneID^4", 
      "option.HostSpecies^3", 
      "option.Isotype^3", 
      "option.Primary/Secondary^2", 
      "option.Reactivity^4", 
      "option.Search^1", 
      "option.TargetName^1", 
      "option.Type^4" 
      ], 
      "query": "Calprotectin", 
      "default_operator": "AND" 
     } 
     }, 
     "filter": { 
     "and": [ 
      { 
      "query": { 
       "query_string": { 
       "fields": [ 
        "targeted_countries" 
       ], 
       "query": "All US" 
       } 
      } 
      } 
     ] 
     } 
    } 
    } 
} 

la requête a ralenti considérablement, je suis Je fais ça correctement? Y a-t-il un moyen de l'accélérer? Je suis actuellement en train de faire le booster lorsque j'indexe le document, mais l'utiliser dans la requête de cette façon est le meilleur pour le fonctionnement de mon application. Toute aide est très appréciée

Répondre

2

L'augmentation de la durée de la requête est utilisée pour attribuer un poids plus important à un terme. Si vous voulez augmenter de manière permanente un champ, utilisez index time boosting. Si vous ne voulez pas utiliser ce boost tout le temps, alors il est logique de créer un mapping séparé juste avec store: "no".

+0

Merci Artur, mon problème est que les valeurs de poids vont changer fréquemment alors j'essaie d'éviter de mettre à jour manuellement le mapping chaque fois qu'ils changent. Je suis un peu novice quand il s'agit de cela, alors y a-t-il un moyen de s'en sortir? (par exemple, il suffit d'indexer une valeur boost comme {"item_name": {"_boost": "4", "_value": "anticorps monoclonal anti-cd95 du hamster arménien, pe conjugué, clone jo2"}) cela fonctionnerait-il? – exHash

+0

Le boost est combiné avec d'autres composants (fréquence de terme et facteur de normalisation) et le résultat est stocké dans l'index, donc AFAIK il ne peut pas être changé sans réindexer. Qu'est-ce qui fait que les boosts de champs changent? Peut-être qu'ils ne sont pas le bon outil pour votre problème? –

+0

En fait, je recommanderais une augmentation du temps de requête par rapport à l'augmentation du temps d'indexation, exactement pour la raison que vous avez mentionnée: flexibilité. En outre, l'augmentation du temps d'index réduit la précision des normes de longueur de champ. Je pense que la raison pour laquelle votre requête a été ralentie est que, au lieu d'interroger uniquement le champ "_all", vous interrogez maintenant de nombreux champs. – DrTech