IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

NoSQL Discussion :

ElasticSearch analyzer terms aggregation + Custom Analyzer


Sujet :

NoSQL

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2015
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2015
    Messages : 3
    Points : 3
    Points
    3
    Par défaut ElasticSearch analyzer terms aggregation + Custom Analyzer
    Bonjour,

    Voici le contexte dans lequel je travaille :
    J'utilise ElasticSearch 1.5.0. et AngularJS (inutile ici pour ma question).
    J'ai des instanceDescritpion, si lesquelles je veux faire des requêtes REST (ici seul le descriptionCode est utile).

    Le mapping (abrégé pour une meilleur lisibilité) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    {
      "properties": 
      {
        "descriptionCode":
        {
          "type": "string",
          "index" : "analyzed"
        },
        ....
      }
    }
    Exemple de données :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    {
      "_index" : "foo",
      "_type" : "instanceDescriptions",
      "_id" : "MedName-10",
      "_source" : {
        "descriptionCode" : "MedName-10",
        ....
      }
    }
    Je fais déjà une requête sur les descriptionCode, en utilisant l'index analyzed du mapping, pour de l'auto complétion (qui fonctionne très bien ).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    {
      "query" : {
        "filtered" : {
          "filter" : {
            "or" : [{
              "terms" : {
                "descriptionCode" : ["medname","10"],
                "execution" : "and" 
              }
            },
            ... ]
          }
        }
      }
    }
    Tout va bien jusque maintenant, mais c'est maintenant que mon problème arrive, après de mainte recherches, dans la doc d'Elasticsearch, ou sur Google.
    Je voudrais maintenant faire une requête pour grouper sur les descriptionCode :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    {
      "query" : {
        "match_all" : {
        }
      },
      "aggs" : {
        "group_by_descriptionCode" : {
          "terms" : {
            "field" : "descriptionCode" 
          }
        }
      }
    }
    Et là, il me renvoie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
     
    {
      "took" : 1,
      "timed_out" : false,
      "_shard" : { ... },
      "hits" : {...},
      "aggreagations" : {
        "group_by_descriptionCode" : {
          ...,
          "bucket" : [10]
            0 : {
              "key" : "medname",
              "doc_count" : 10
            },
            1 : {
              "key" : "10",
              "doc_count" : 1
            },
            2 : {
            ...
            },
            ...
        }
      }
    }
    Je voudrais donc savoir s'il existe un moyen de faire une aggreagation sur le field descriptionCode, comme s'il était "not_analyzed" dans le mapping, mais sans changer le mapping, et si possible ne pas ajouter de champs dans le mapping.

    En gros, mes deux requêtes sont correctes, mais l'un d'elle ne me donne pas ce que j'attends, et si je change l'index analyzed en not_analyzed, la requête qui ne me donnait pas le bon resultat, fonctionne bien, mais l'autre ne me donne plus le bon resultat.

    J'espère avoir été assez claire, sinon n'hésitez pas à me demander plus d'informations, ou à critiquer ce que j'ai fais.

    Merci !!

  2. #2
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2015
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2015
    Messages : 3
    Points : 3
    Points
    3
    Par défaut
    Pour ceux qui aurait à peu prés le même problème, je suis entrain de tester une solution.

    Créer mon propre analyzer (en passant de la version d'Elasticsearch 1.5.1 à 1.6.0). Avec Custom Analyzer, Pattern Tokenizer, et Pattern Capture TokenFilter.

    J'insert ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
     
    {
    	"index" : {
    		"analysis" : {
    			"analyser" : {
    				"my_analyzer" : {
    					"type" : "custom",
    					"tokenizer" : "my_tokenizer",
    					"filter" : ["my_tokenfilter"] 
    				}
    			},
    			"tokenizer" : {
    				"my_tokenizer" : {
    					"type" : "pattern",
    					"max_token_length" : 100
    				}
    			},
    			"filter" : {
    				"my_tokenfilter" : {
    					"type" : "pattern_capture",
    					"preserve_original" : 1,
    					"patterns" : ["(^[a-z]+(-[0-9]+)?$)i"]
    				}
    			}
    		}
    	}
    }
    Et j'obtiens dans mes settings, ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
     
    {
      settings: {
        index: {
          creation_date: "...",
          uuid: "...",
          analysis: {
            analyser: {
              my_analyzer: {
                type: "custom",
                filter: ["my_tokenfilter"],
                tokenizer: "my_tokenizer"
              }
            },
            filter: {
              my_tokenfilter: {
                type: "pattern_capture",
                preserve_original: "1",
                patterns: ["(^[a-z]+(-[0-9]+)?$)i"]
              }
            },
            tokenizer: {
              my_tokenizer: {
                type: "pattern",
                max_token_length: "100"
              }
            }
          },
          number_of_replicas: "1",
          number_of_shards: "5",
          version: {
            created: "..."
          }
        }
      }
    }
    Dîtes moi si vous trouvez une erreur, parce que l'insertion se passe bien, mais lors du mapping et que j'utilise "analyzer" : "my_analyzer", j'ai comme erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    Exception in thread "main" org.elasticsearch.index.mapper.MapperParsingException: Analyzer [my_analyzer] not found for field [descriptionCode]
    	at org.elasticsearch.index.mapper.core.TypeParsers.parseField(TypeParsers.java:213)
    	at org.elasticsearch.index.mapper.core.StringFieldMapper$TypeParser.parse(StringFieldMapper.java:153)
    	at org.elasticsearch.index.mapper.object.ObjectMapper$TypeParser.parseProperties(ObjectMapper.java:290)
    	at org.elasticsearch.index.mapper.object.ObjectMapper$TypeParser.parseObjectOrDocumentTypeProperties(ObjectMapper.java:214)
    	at org.elasticsearch.index.mapper.object.RootObjectMapper$TypeParser.parse(RootObjectMapper.java:136)
    	at org.elasticsearch.index.mapper.DocumentMapperParser.parse(DocumentMapperParser.java:211)
    	at org.elasticsearch.index.mapper.DocumentMapperParser.parseCompressed(DocumentMapperParser.java:192)
    	at org.elasticsearch.index.mapper.MapperService.parse(MapperService.java:449)
    	at org.elasticsearch.cluster.metadata.MetaDataMappingService$4.execute(MetaDataMappingService.java:505)
    	at org.elasticsearch.cluster.service.InternalClusterService$UpdateTask.run(InternalClusterService.java:374)
    	at org.elasticsearch.common.util.concurrent.PrioritizedEsThreadPoolExecutor$TieBreakingPrioritizedRunnable.runAndClean(PrioritizedEsThreadPoolExecutor.java:188)
    	at org.elasticsearch.common.util.concurrent.PrioritizedEsThreadPoolExecutor$TieBreakingPrioritizedRunnable.run(PrioritizedEsThreadPoolExecutor.java:158)
    	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    	at java.lang.Thread.run(Thread.java:745)

    Merci.

    Maxime

Discussions similaires

  1. [VS.NET][Debutant] Web Log Analyzer Starter Kit
    Par quanou dans le forum Visual Studio
    Réponses: 5
    Dernier message: 21/08/2006, 16h11
  2. [DBMS_STATS][9i]Réaliser la même opération qu'avec ANALYZE.
    Par Le nain Attila dans le forum Oracle
    Réponses: 7
    Dernier message: 09/06/2006, 18h35
  3. declarer une variable dans le query analyzer
    Par graphicsxp dans le forum MS SQL Server
    Réponses: 8
    Dernier message: 29/03/2005, 11h26
  4. [PocketPC] MemoryLeak analyzer
    Par baert dans le forum C++
    Réponses: 1
    Dernier message: 12/11/2004, 16h23
  5. analyze stats
    Par pinocchio dans le forum Administration
    Réponses: 16
    Dernier message: 20/09/2004, 16h36

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo