Как обозначить звезду (‘*’)?

#elasticsearch

Вопрос:

Я пытаюсь написать анализатор, который также будет маркировать звезды (‘*’). Я пытался написать что-то вроде:

 "test_analyzer": { 
          "type": "pattern",
          "pattern": "\W|_",
          "flags": "CASE_INSENSITIVE|COMMENTS"
        }
 

Это сработало нормально для большинства случаев, которые меня интересуют. Однако, в случае, если у меня есть звезда, она просто игнорирует ее.

Например, для:

 GET test_index_06/_analyze 
{
  "analyzer": "test_analyzer", 
  "text":     "other_table*"
}
 

Я получаю:

 
{
  "tokens" : [
    {
      "token" : "other",
      "start_offset" : 0,
      "end_offset" : 5,
      "type" : "word",
      "position" : 0
    },
    {
      "token" : "table",
      "start_offset" : 6,
      "end_offset" : 11,
      "type" : "word",
      "position" : 1
    }
  ]
}
 

где я хотел получить также знак *.

Есть какие-нибудь идеи?

редактировать: Также пытался:

         "test_analyzer": { 
          "type": "pattern",
          "pattern": "_|\t|\n|\s|\v ",
          "flags": "CASE_INSENSITIVE"
        }
 

но получение: [другое, таблица*] вместо получения [другое, таблица, *]

Спасибо, С Уважением, Нир.

Комментарии:

1. Смогли ли вы решить эту проблему?

2. @Gibbs — ну, на самом деле я остановился на [другом, таблица*] решении, которое для меня достаточно хорошо. Спасибо вам за помощь!

Ответ №1:

Причина:

Pattern анализатор маркирует символы, не содержащие слов. Вот * не-словесный символ as - . Следовательно, токены создаются без них.

Чтобы справиться с этим с помощью того же анализатора шаблонов:

 "test_analyzer": { 
          "type": "pattern",
          "pattern": "_",
          "flags": "CASE_INSENSITIVE|COMMENTS"
        }
 

Это приводит к следующим маркерам из-за токенизатора по умолчанию, фильтров маркеров анализатора шаблонов.

 {
    "tokens": [
        {
            "token": "other",
            "start_offset": 0,
            "end_offset": 5,
            "type": "word",
            "position": 0
        },
        {
            "token": "table*",
            "start_offset": 6,
            "end_offset": 12,
            "type": "word",
            "position": 1
        }
    ]
}
 

Если вам нужны токены в определенном месте, вам необходимо обновить регулярное выражение/маркеры.

Комментарии:

1. спасибо @Gibbs. Но я также хочу разделиться на пробелы. Поэтому для «другого стола» я хочу получить [другой, стол]. Поэтому пытаюсь добавить пробелы, вкладки и тому подобное.

2. Вы определенно можете это сделать, добавив пробел в шаблон. s

3. хм, посмотрите на правку в исходном сообщении. Я хочу получить следующие токены [другое, таблица, *]

4. Как насчет использования ingest конвейера перед индексацией документа?

5. не совсем знаком с этим. Я прочту об этом. Я ничего не могу сделать, используя шаблон?