2014-07-07 2 views
0

J'ai un cas où une entité donne une taille de répertoire dans le cas où il est présent, sinon il donne une chaîne disant "IATEMPDIR n'existe pas".Comment vérifier la plage de numéros et si une valeur de chaîne dans Elasticsearch?

Est-il possible de déterminer si l'entité client.tempsize lt 65594 & & valeur client.tempsize est pas une chaîne (donc quand il a IATEMPDIR does not exist valeur devrait également renvoyer cette requête). Dans ce cas, comment puis-je vérifier à la fois numéro de série ainsi que si une chaîne?

J'utilise percoler

PUT /eg/.percolator/1 
{ 
    "sort": { 
     "rule.step": { "order": "asc" } 
    }, 
    "query": { 
     "filtered": { 
      "query": { 
       "bool": { 
        "must": [ 
         { 
          "match": { 
          "client.name": "Athena" 
          } 
         }, 
         { 
          "range": { 
          "client.tempsize": { 
            "lt": 65594 
          } 
          } 
         } 
        ]     
       }    
      } 
     } 
    }, 
    "rule": { 
     "ruledesc": "Client should be Athena & tempsize should have sufficient space (eg: > 65594) and should not be a string", 
     "step": 1 
    }  
} 

mon doc

GET /eg/message/_percolate 
{ 
    "doc": { 
     "client": { 
      "name": "Athena", 
      "tempsize": "IATEMPDIR does not exist" 
     } 
    } 
} 

Au-dessus doc me donne ...MapperParsingException[failed to parse [client.tempsize]]; nested: NumberFormatException..., mais quand je l'utilise "tempsize": 12 il Redonne bon résultat.

{ 
    "took": 3, 
    "_shards": { 
     "total": 5, 
     "successful": 5, 
     "failed": 0 
    }, 
    "total": 1, 
    "matches": [ 
     { 
     "_index": "eg", 
     "_id": "1" 
     } 
    ] 
} 

Mise à jour

Après avoir traversé la réponse de ppearcy. J'ai changé le mappage

PUT /eg/message/_mapping 
{ 
    "properties": { 
     "client": { 
     "properties": { 
      "name": { 
       "type": "string" 
      }, 
      "tempsize": { 
       "type": "long", 
       "ignore_malformed" : "true" 
      } 
     } 
     } 
    } 
} 

et ci-dessous doc ne donne pas lieu à ma requête, et est une chaîne ignorant

GET /eg/message/_percolate 
{ 
    "doc": { 
     "client": { 
      "name": "Athena", 
      "tempsize": "IATEMPDIR does not exist" 
     } 
    } 
} 

Donc, si je donne "tempsize": "65594", est-ce que considèrent les numéros à l'intérieur des guillemets doubles (comme donnant les nombres inférieurs à 65594 rendent ma requête)? Ou va-t-il casser quelque part?

Répondre

1

Vous devez définir "ignore_malformed": "true" sur votre mappage pour le champ. Cela vous permettra de toujours indexer les documents et les non-numéros qui seront simplement ignorés et peuvent être interrogés avec des types de requête manquants/existants.

Utilisation de la syntaxe de requête Lucene pour simplifier, votre requête final ressemblerait à ceci:

_missing_:client.tempsize OR client.tempsize:[0 TO 65594] 

Vérifiez la section numéro ici pour plus d'informations: http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/mapping-core-types.html

+0

Est-ce que cela veut dire, il ignore la valeur de chaîne et traite tout comme entier? Même "65594" est un nombre entier? – abi1964

+0

Oui, mais cela dépend de la cartographie de votre terrain. Si vous ne définissez pas de mappage, elasticsearch devine en fonction des premières données qu'il voit. Ce comportement supposé est acceptable pour le piratage, mais il devrait définir des mappages explicites pour la plupart des cas d'utilisation. – ppearcy

Questions connexes