web-dev-qa-db-fra.com

Analyseurs dans elasticsearch

J'ai du mal à comprendre le concept des analyseurs dans elasticsearch avec pneu gem. Je suis en fait un débutant dans ces concepts de recherche. Quelqu'un ici peut-il m'aider avec un article de référence ou expliquer ce que font réellement les analyseurs et pourquoi ils sont utilisés?

Je vois différents analyseurs mentionnés sur elasticsearch comme mot-clé, standard, simple, Snowball. Sans la connaissance des analyseurs, je ne pouvais pas déterminer ce qui correspond réellement à mes besoins.

42
Vamsi Krishna

Permettez-moi de vous donner une réponse courte.

Un analyseur est utilisé à l'heure d'indexation et à l'heure de recherche. Il est utilisé pour créer un index des termes.

Pour indexer une phrase, il pourrait être utile de la diviser en mots. Voici l'analyseur.

Il applique des tokenizers et des filtres de token. Un tokenizer peut être un tokenizer Whitespace. Il a divisé une phrase en jetons à chaque espace. Un tokenizer minuscule divisera une phrase à chaque non-lettre et minuscule toutes les lettres.

Un filtre à jetons est utilisé pour filtrer ou convertir certains jetons. Par exemple, un filtre pliant ASCII convertira des caractères tels que ê, é, è en e.

Un analyseur est un mélange de tout cela.

Vous devriez lire Guide d'analyse et regarder à droite toutes les différentes options dont vous disposez.

Par défaut, Elasticsearch applique l'analyseur standard. Il supprimera tous les mots anglais courants (et de nombreux autres filtres)

Vous pouvez également utiliser Analyze Api pour comprendre comment cela fonctionne. Très utile.

80
dadoonet

Dans Lucene, un analyseur est une combinaison de tokenizer (splitter) + stemmer + filtre de mots vides

Dans ElasticSearch, un analyseur est une combinaison de

  1. Character filter: "ranger" une chaîne avant qu'elle ne soit tokenisée. Exemple: supprimer des balises HTML
  2. Tokenizer: DOIT avoir un seul tokenizer. Il est utilisé pour diviser la chaîne en termes ou jetons individuels
  3. Token filter: modifiez, ajoutez ou supprimez des jetons. Stemmer est un exemple de filtre à jetons, il est utilisé pour obtenir la base du mot, par exemple: "heureux", "bonheur" => "happi".

Voir Démo Snowball ici

C'est le réglage de mon système:

     {
      "settings":{
        "index" : {
            "analysis" : {
                "analyzer" : {
                    "analyzerWithSnowball" : {
                        "tokenizer" : "standard",
                        "filter" : ["standard", "lowercase", "englishSnowball"]
                    }
                },
                "filter" : {
                    "englishSnowball" : {
                        "type" : "Snowball",
                        "language" : "english"
                    }
                }
            }
        }
      }
    }

Réf:

  1. Comparaison des analyseurs Lucene
  2. http://www.elasticsearch.org/guide/en/elasticsearch/guide/current/custom-analyzers.html
11
Tho

Voici un plugin génial sur github repo . C'est en quelque sorte l'extension de Analyze API . Trouvé sur le plugin élastique officiel liste .

Ce qui est génial, c'est qu'il montre des jetons avec tous leurs attributs après chaque étape. Avec cela, il est facile de déboguer la configuration de l'analyseur et de voir pourquoi nous avons obtenu de tels jetons et où nous avons perdu ceux que nous voulions.

J'aurais aimé l'avoir trouvé plus tôt qu'aujourd'hui. Grâce à cela, je viens de découvrir pourquoi mon keyword_repeat token tokenizer semble ne pas fonctionner correctement. Le problème a été causé par le filtre de jeton suivant: icu_transform (utilisé pour la translittération) qui malheureusement n'a pas respecté l'attribut de mot clé et a transformé tous les jetons. Je ne sais pas comment pourrais-je trouver la cause sans ce plugin.

0
slawek