1

Saisie de l'entrée «quick brown fox sauté» Je souhaite créer toutes les combinaisons de jetons possibles pour les mots. Ainsi, la chaîne exemple serait tokenisé àÉlastique tokenize dans toutes les combinaisons de mots possibles

[ 
"quick", "quick brown", "quick fox", "quick jumped", 
"brown", "brown quick", "brown fox", "brown jumped", 
         ..., 
"jumped quick", "jumped brown", "jumped fox", "jumped" 
] 

je pourrais utiliser shingle tokeniser pour elle, mais elle ne crée de nouveaux jetons en concaténant termes adjacents et je finis avec:

[ 
"quick", "quick brown", "quick brown fox", "quick brown fox jumped", 
"brown", "brown fox", "brown fox jumped", 
"fox", "fox jumped", 
"jumped" 
] 

Quelle est la bonne avant mais pas la chose que je cherche.

+0

Pouvez-vous expliquer le cas d'utilisation que vous recherchez? – Val

+0

@Val Longue histoire courte - pour produire des agrégations de termes non seulement sur des termes simples (["rapide", "brun", "renard", "sauté"]) mais aussi sur des combinaisons de ces mots/termes –

Répondre

0

Dans votre commentaire, vous avez dit que le cas d'utilisation ici est d'obtenir des agrégations de combinaisons de mots qui apparaissent dans le document. Vous pouvez utiliser le tokenizer standard et obtenir cette information. Par exemple, supposons que vous avez les documents avec le champ « corps »:

1: Les sauts de renard brun rapide sur le petit chien

2: Le petit chien mange de la nourriture

Je pense donc que vous voulez voir quelque chose comme:

petit chien: 2

le petit : 2

le chien: 2

les Eats: 1

...

Ensuite, vous pouvez interroger comme ceci:

{ 
    "size": 0, 
    "aggs": { 
    "firstlevel": { 
     "terms": { 
     "field": "body" 
     }, 
     "aggs": { 
     "secondlevel": { 
      "terms": { 
      "field": "body" 
      } 
     } 
     } 
    } 
    } 
} 

et vous obtenez une réponse comme:

"aggregations": { 
    "firstlevel": { 
    "doc_count_error_upper_bound": 0, 
    "sum_other_doc_count": 1, 
    "buckets": [ 
    { 
     "key": "dog", 
     "doc_count": 2, 
     "secondlevel": { 
     "doc_count_error_upper_bound": 0, 
     "sum_other_doc_count": 1, 
     "buckets": [ 
      { 
      "key": "dog", 
      "doc_count": 2 
      }, 
      { 
      "key": "little", 
      "doc_count": 2 
      }, 
      { 
      "key": "the", 
      "doc_count": 2 
      }, 
      { 
      "key": "brown", 
      "doc_count": 1 
      } 
     ... 

Et vous pouvez voir que "petit" et "chien" co-produisent dans 2 documents, et "le" et "chien" co-produisent dans 2 documents, et "chien" et "brun" co-produisent en 1 document. Bien sûr, cela ne fonctionne que si vous voulez unique nombre de co-occurrences. Dans le cas où vous auriez vraiment besoin d'avoir les jetons comme vous l'avez décrit, je pense que vous devez écrire du code pour le faire (soit un tokenizer personnalisé pour Lucene que vous pouvez utiliser depuis Elasticsearch, soit probablement plus facile, un étape de traitement qui ajoute un champ qui est une liste de keyword s).