Как объединить pattern_replace char_filter с фильтром синонимов (пропускает синонимы?) - PullRequest
0 голосов
/ 05 октября 2018

У меня есть индекс, в котором я пытаюсь принудительно добавить начальный токен и конечный токен.(Большая картинка. Я пытаюсь использовать match_phrase для соответствия всей фразе, а не только подфразе адреса).У меня есть рабочий char_filter, который выполняет это, но, похоже, вызывает проблемы с фильтрами синонимов.Все это делается в ElasticSearch 6.2.14.

Вот наименьшая часть работы, которую я должен продемонстрировать в своей проблеме:

{
  "settings": {
    "analysis": {
      "analyzer": {
        "working_street_analyzer": {
          "type": "custom",
          "char_filter": [
            "html_strip"
          ],
          "tokenizer": "classic",
          "filter": [
            "street_synonyms"
          ]
        },
        "broken_street_analyzer": {
          "type": "custom",
          "char_filter": [
            "extraTokenAtEnds"
          ],
          "tokenizer": "classic",
          "filter": [
            "street_synonyms"
          ]
        }
      },
      "char_filter": {
        "extraTokenAtEnds": {
          "type": "pattern_replace",
          "pattern": "^(.*)$",
          "replacement": "wordyword $1 wordyword"
        }
      },
      "filter": {
        "street_synonyms": {
          "type": "synonym",
          "synonyms": [
            "south, s",
            "west, w"
          ]
        }
      }
    }
  }
}

Вот две проверки конечной точки _analyze:

{
   "analyzer": "working_street_analyzer",
   "text":     "40 s 50 w"
}

{
   "analyzer": "broken_street_analyzer",
   "text":     "40 s 50 w"
}

working_street_analyzer дает то, что вы ожидаете:

{
    "tokens": [
        {
            "token": "40",
            "start_offset": 0,
            "end_offset": 2,
            "type": "<ALPHANUM>",
            "position": 0
        },
        {
            "token": "s",
            "start_offset": 3,
            "end_offset": 4,
            "type": "<ALPHANUM>",
            "position": 1
        },
        {
            "token": "south",
            "start_offset": 3,
            "end_offset": 4,
            "type": "SYNONYM",
            "position": 1
        },
        {
            "token": "50",
            "start_offset": 5,
            "end_offset": 7,
            "type": "<ALPHANUM>",
            "position": 2
        },
        {
            "token": "w",
            "start_offset": 8,
            "end_offset": 9,
            "type": "<ALPHANUM>",
            "position": 3
        },
        {
            "token": "west",
            "start_offset": 8,
            "end_offset": 9,
            "type": "SYNONYM",
            "position": 3
        }
    ]
}

broken_street_analyzer пропускает шаг синонима.Запуск _analyze с «объяснением»: «истина» показывает, что шаг синонима действительно выполнен, просто не удается найти синонимы:

{
    "tokens": [
        {
            "token": "wordyword",
            "start_offset": 0,
            "end_offset": 8,
            "type": "<ALPHANUM>",
            "position": 0
        },
        {
            "token": "40",
            "start_offset": 8,
            "end_offset": 8,
            "type": "<ALPHANUM>",
            "position": 1
        },
        {
            "token": "s",
            "start_offset": 8,
            "end_offset": 8,
            "type": "<ALPHANUM>",
            "position": 2
        },
        {
            "token": "50",
            "start_offset": 8,
            "end_offset": 8,
            "type": "<ALPHANUM>",
            "position": 3
        },
        {
            "token": "w",
            "start_offset": 8,
            "end_offset": 8,
            "type": "<ALPHANUM>",
            "position": 4
        },
        {
            "token": "wordyword",
            "start_offset": 8,
            "end_offset": 9,
            "type": "<ALPHANUM>",
            "position": 5
        }
    ]
}

1 Ответ

0 голосов
/ 05 октября 2018

Кажется, что synonym фильтр токенов полагается на смещения сгенерированных токенов, но pattern_replace символьный фильтр ломает смещения: поля start_offset и end_offset для токенов 40, s, 50,w имеет то же значение в broken_street_analyzer выходных данных.

Это известная проблема в Apache Lucene, который является базовым уровнем для Elasticsearch.Неправильные смещения, сгенерированные pattern_replace, также вызывают другие ошибки в Elasticsearch, например, при выделении результатов - вы можете прочитать ясное объяснение того, почему это происходит.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...