ElasticSearch - исключить специальный символ из стандартного стеммера - PullRequest
0 голосов
/ 04 февраля 2020

Я использую стандартный анализатор для моего индекса ElasticSearch, и я заметил, что, когда я ищу запрос с % в нем - анализатор отбрасывает % как часть шагов Stemer (для запроса "2 % milk ")

GET index_name/_analyze 
{
  "field": "text.english",
  "text": "2% milk"
}

Ответом являются следующие 2 токена (2 и milk):

{
  "tokens": [
    {
      "token": "2",
      "start_offset": 0,
      "end_offset": 1,
      "type": "<NUM>",
      "position": 0
    },
    {
      "token": "milk",
      "start_offset": 3,
      "end_offset": 7,
      "type": "<ALPHANUM>",
      "position": 1
    }
  ]
}

Значение, 2% становится 2

Я хочу использовать стандартный инструмент для уменьшения пунктуации, я не хочу использовать космический инструмент или другой инструмент, который не является стандартным, но я хочу использовать знак <number>% в качестве термина в индексе.

Есть ли способ настроить так, чтобы стеммер игнорировал специальный символ, когда он рядом с номером? в худшем случае не игнорировать это вообще?

Спасибо!

1 Ответ

0 голосов
/ 04 февраля 2020

Вы можете добиться желаемого поведения, настроив собственный анализатор, используя символьный фильтр, который сохраняет символ «%» от удаления.

Проверьте документацию Elasticsearch о конфигурации встроенных анализаторов. , чтобы использовать эту конфигурацию в качестве образца для настройки вашего собственного анализатора (см. Elasticsearch Reference: engli sh analyzer )

Добавьте фильтр символов, который отображает символ процента в другую строку , как показано в следующем фрагменте кода:

PUT my_index
{
  "settings": {
    "analysis": {
      "analyzer": {
        "my_analyzer": {
          "tokenizer": "standard",
          "char_filter": [
            "my_percent_char_filter"
          ]
        }
      },
      "char_filter": {
        "my_percent_char_filter": {
          "type": "mapping",
          "mappings": [
            "0% => 0_percent",
            "1% => 1_percent",
            "2% => 2_percent",
            "3% => 3_percent",
            "4% => 4_percent",
            "5% => 5_percent",
            "6% => 6_percent",
            "7% => 7_percent",
            "8% => 8_percent",
            "9% => 9_percent"
          ]
        }
      }
    }
  }
}

POST my_index/_analyze
{
  "analyzer": "my_analyzer",
  "text": "The fee is between 0.93% or 2%"
}

С этим вы можете даже искать определенные c проценты (например, 2%)!

Альтернативное решение

Если вы просто хотите удалить символ процента, вы можете использовать тот же подход, но просто отобразить символ % в пустую строку, как показано в следующем фрагменте кода

"char_filter": {
  "my_percent_char_removal_filter": {
    "type": "mapping",
    "mappings": [
      "% => "]
  }
}

Кстати: этот подход не считается «взломом», это стандартный подход к решению проблемы. Ваша оригинальная строка перед отправкой токенизатору.

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