web-dev-qa-db-fra.com

ElasticSearch Analyzer et Tokenizer pour les e-mails

Je n'ai pas pu trouver de solution parfaite dans Google ou ES pour la situation suivante, j'espère que quelqu'un pourrait aider ici.

Supposons que cinq adresses e-mail soient stockées dans le champ "e-mail":

1. {"email": "[email protected]"}
2. {"email": "[email protected], [email protected]"}
3. {"email": "[email protected]"}
4. {"email": "[email protected]}
5. {"email": "[email protected]"}

Je souhaite réaliser les scénarios de recherche suivants:

[Rechercher -> Recevoir]

"[email protected]" -> 1,2

"[email protected]" -> 2,4

"[email protected]" -> 5

"john.doe" -> 1,2,3,4

"john" -> 1,2,3,4,5

"gmail.com" -> 1,2

"Outlook.com" -> 2,3,4

Les trois premiers appariements sont un MUST, et pour les autres, plus ils sont précis, mieux c'est. J'ai déjà essayé différentes combinaisons d'analyseurs d'index/de recherche, de tokeniseurs et de filtres. A également essayé de travailler sur la condition des requêtes de correspondance, mais n'a pas trouvé de solution idéale, toute réflexion est la bienvenue et aucune limite aux mappages, aux analyseurs ou au type de requête à utiliser, merci.

26
LYu

Cartographie:

PUT /test
{
  "settings": {
    "analysis": {
      "filter": {
        "email": {
          "type": "pattern_capture",
          "preserve_original": 1,
          "patterns": [
            "([^@]+)",
            "(\\p{L}+)",
            "(\\d+)",
            "@(.+)",
            "([^-@]+)"
          ]
        }
      },
      "analyzer": {
        "email": {
          "tokenizer": "uax_url_email",
          "filter": [
            "email",
            "lowercase",
            "unique"
          ]
        }
      }
    }
  },
  "mappings": {
    "emails": {
      "properties": {
        "email": {
          "type": "string",
          "analyzer": "email"
        }
      }
    }
  }
}

Données de test:

POST /test/emails/_bulk
{"index":{"_id":"1"}}
{"email": "[email protected]"}
{"index":{"_id":"2"}}
{"email": "[email protected], [email protected]"}
{"index":{"_id":"3"}}
{"email": "[email protected]"}
{"index":{"_id":"4"}}
{"email": "[email protected]"}
{"index":{"_id":"5"}}
{"email": "[email protected]"}

Requête à utiliser:

GET /test/emails/_search
{
  "query": {
    "term": {
      "email": "[email protected]"
    }
  }
}
35
Andrei Stefan