2017-10-10 13 views
0

J'ai un tas de documents de recherche élastiques qui contiennent des informations sur les annonces d'emplois. J'essaie d'agréger le champ attributes.Title pour extraire le nombre d'instances "expérience" de l'offre d'emploi. par exemple. Junior, Senior, Lead, etc. Au lieu de cela ce que je reçois sont des seaux qui correspondent au titre dans son ensemble au lieu de chaque le mot le champ de titre. par exemple. "Junior Java Developer", "Senior .NET Analyst", etc.ElasticSearch - agrégation de termes divisée par des espaces

Comment puis-je dire à la recherche élastique de fractionner l'agrégation en fonction de chaque mot du titre, par opposition à la correspondance avec la valeur de l'ensemble du champ. Je souhaiterais plus tard étendre la requête pour extraire également le «niveau de compétence» et le «rôle», mais il devrait également être correct si les compartiments contiennent tous les mots dans le champ tant qu'ils sont divisés en compartiments séparés .

requête actuelle:

GET /jobs/_search 
{ 
    "query": { 
    "simple_query_string" : { 
     "query": "Java", 
     "fields": ["attributes.Title"] 
    } 
    }, 
    "size": 0, 
    "aggs": { 
    "group_by_state": { 
     "terms": { 
     "field": "attributes.Title.keyword" 
     } 
    } 
    } 
} 

sortie non désiré:

{ 
    ... 
    "hits": { 
    "total": 63, 
    "max_score": 0, 
    "hits": [] 
    }, 
    "aggregations": { 
    "group_by_state": { 
     "doc_count_error_upper_bound": 0, 
     "sum_other_doc_count": 14, 
     "buckets": [{ 
      "key": "Junior Java Tester", 
      "doc_count": 6 
     },{ 
      "key": "Senior Java Lead", 
      "doc_count": 6 
     },{ 
      "key": "Intern Java Tester", 
      "doc_count": 5 
     }, 
     ... 
     ] 
    } 
    } 
} 

souhaité Sortie:

{ 
    ... 
    "hits": { 
    "total": 63, 
    "max_score": 0, 
    "hits": [] 
    }, 
    "aggregations": { 
    "group_by_state": { 
     "doc_count_error_upper_bound": 0, 
     "sum_other_doc_count": 14, 
     "buckets": [{ 
      "key": "Junior", 
      "doc_count": 12 
     },{ 
      "key": "Senior", 
      "doc_count": 8 
     },{ 
      "key": "Tester", 
      "doc_count": 5 
     },{ 
      "key": "Intern", 
      "doc_count": 5 
     },{ 
      "key": "Analyst", 
      "doc_count": 5 
     }, 
     ... 
     ] 
    } 
    } 
} 

Répondre

1

I Je déduis que votre type de mappage est keyword parce que vous avez agrégé sur un champ appelé "attributes.Title.keyword". Le mappage keyword ne marquera pas votre chaîne de sorte que lors de l'agrégation, il traitera la chaîne entière comme une clé unique.

Vous souhaitez mettre à jour votre mappage vers type: "text" pour le champ de titre. Je ne l'appellerais pas title.keyword mais quelque chose comme title.analyzed - si vous ne spécifiez pas un analyseur, Elasticsearch appliquera le standard analyzer ce qui devrait être suffisant pour vous aider à démarrer. Vous pouvez également utiliser le whitespace analyzer si vous voulez seulement que vos titres soient séparés par des espaces (au lieu de stemmed et d'autres choses). Vous obtiendrez beaucoup d'autres mots dans votre agrégation, mais je suppose que vous recherchez ces jetons de modificateur d'expérience partagée et en fonction de la fréquence, ils vont monter au sommet. Si vous utilisez 5.x, veillez à définir 'fielddata: true' depuis textfields aren't available for aggregation by default.

cartographie:

"properties" : { 
    "attributes" : { 
     "properties" : { 
      "title" : { 
       "properties" : { 
        "keyword" : { "type" : "keyword" }, 
        "analyzed" : { "type" : "text", "analyzer" : "whitespace", "fielddata" : true } 
       } 
      } 
     } 
    } 
}