Как выбрать самый длинный токен в ES-фильтре - PullRequest
1 голос
/ 23 сентября 2019

Ввод - это список имен людей, и я хочу создать точное совпадение с небольшой нечеткостью.

Текст индекса - Бао-Ань Фэн, Мой анализатор ниже

PUT trim
{
  "settings": {
    "index": {
      "analysis": {
        "filter": {
          "word_joiner": {
            "type": "shingle",
            "output_unigrams": false,
            "token_separator": "",
            "output_unigrams_if_no_shingles": true,
            "max_shingle_size": 5
          }
        },
        "analyzer": {
          "word_join_analyzer": {
            "type": "custom",
            "tokenizer": "standard",
            "filter": [
              "lowercase",
              "word_joiner"
            ]
          }
        },
        "tokenizer": {}
      }
    }
  }
}

Он сгенерирует три токена

{
  "tokens": [
    {
      "token": "baoan",
      "start_offset": 0,
      "end_offset": 6,
      "type": "shingle",
      "position": 0
    },
    {
      "token": "baoanfeng",
      "start_offset": 0,
      "end_offset": 11,
      "type": "shingle",
      "position": 0,
      "positionLength": 2
    },
    {
      "token": "anfeng",
      "start_offset": 4,
      "end_offset": 11,
      "type": "shingle",
      "position": 1
    }
  ]
}

Я хочу только "baoanfeng", я не могу использовать "min_shingle_size", потому что можно вводить два слова.

1 Ответ

0 голосов
/ 23 сентября 2019

Я не уверен, почему вы используете фильтр shingle, если все, что вам нужно, это самый длинный гонт ...

Почему бы не просто токенизатор keyword с шаблоном шаблонов, который удаляет всеэто не персонаж?Вот так:

PUT trim
{
  "settings": {
    "index": {
      "analysis": {
        "filter": {
          "pattern": {
            "type": "pattern_replace",
            "pattern": "\\W+",
            "replacement": ""
          }
        },
        "analyzer": {
          "word_join_analyzer": {
            "type": "custom",
            "tokenizer": "keyword",
            "filter": [
              "lowercase",
              "pattern"
            ]
          }
        },
        "tokenizer": {}
      }
    }
  }
}

Затем проверьте:

POST trim/_analyze
{
  "analyzer": "word_join_analyzer",
  "text": "Bao-An Feng"
}

Результаты:

{
  "tokens" : [
    {
      "token" : "baoanfeng",
      "start_offset" : 0,
      "end_offset" : 12,
      "type" : "word",
      "position" : 0
    }
  ]
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...