Elasticsearch pattern_replace, заменяя пробелы при анализе

В основном я хочу удалить все пробелы и разметить всю строку как один токен. (Позже я буду использовать nGram поверх этого.)

Это мои настройки индекса:

"settings": {
 "index": {
  "analysis": {
    "filter": {
      "whitespace_remove": {
        "type": "pattern_replace",
        "pattern": " ",
        "replacement": ""
      }
    },
    "analyzer": {
      "meliuz_analyzer": {
        "filter": [
          "lowercase",
          "whitespace_remove"
        ],
        "type": "custom",
        "tokenizer": "standard"
      }
    }
  }
}

Вместо "pattern": " " попробовал тоже "pattern": "\\u0020" и \\s.

Но когда я анализирую текст «beleza na web», он по-прежнему создает три отдельных токена: «beleza», «na» и «web» вместо одного единственного «belezanaweb».


person Sagar Chandarana    schedule 26.04.2015    source источник


Ответы (1)


Анализатор анализирует строку, сначала ее токенизируя, а затем применяя серию фильтров токенов. Вы указали токенизатор в качестве стандартного, что означает, что ввод уже токенизирован с использованием стандарта tokenizer, который создавал токены отдельно. Затем к токенам применяется фильтр замены шаблона.

Используйте токенизатор ключевых слов вместо стандартного токенизатора. Остальное отображение в порядке. Вы можете изменить свое отображение, как показано ниже

"settings": {
 "index": {
  "analysis": {
    "filter": {
      "whitespace_remove": {
        "type": "pattern_replace",
        "pattern": " ",
        "replacement": ""
      }
    },
    "analyzer": {
      "meliuz_analyzer": {
        "filter": [
          "lowercase",
          "whitespace_remove",
          "nGram"
        ],
        "type": "custom",
        "tokenizer": "keyword"
      }
    }
  }
}
person Prabin Meitei    schedule 26.04.2015
comment
Чтобы подробнее рассказать о том, почему вы должны использовать Keyword Tokenizer вместо Standard Tokenizer, Keyword Tokenizer принимает входные данные как один токен, тогда как Standard Tokenizer разделяет токены, используя стандартный список разделителей (который можно настроить). Таким образом, переполнение стека предложений токенизируется как стек и переполняется с помощью стандартного токенизатора, но токенизатор ключевых слов создает переполнение стека токенов, с которым регулярное выражение может затем работать как один ввод. - person Dagrooms; 24.01.2018