Подтвердить что ты не робот

Анализатор ElasticSearch и токенизатор для электронных писем

Я не мог найти идеальное решение в Google или ES для следующей ситуации, надеюсь, что кто-то может помочь здесь.

Предположим, что в поле "email" указано пять адресов электронной почты:

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

Я хочу выполнить следующие поисковые сценарии:

[Поиск → Получать]

"[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

Первые три матча являются ДОЛЖНЫМИ, а для остальных - более точными, тем лучше. Вы уже пробовали разные комбинации анализаторов индексов/поиска, токенизаторов и фильтров. Также пытался работать над условием для совпадений запросов, но не нашел идеального решения, любая мысль приветствуется, и нет ограничений на сопоставления, анализаторы или какой тип запроса, спасибо.

4b9b3361

Ответ 1

Mapping

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

Данные тестирования:

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]"}

Используемый запрос:

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