Ошибка создания Elastic Search 6.4 при создании пользовательского фильтра символов - PullRequest
2 голосов
/ 07 июня 2019

Так что я почти уверен, что мне что-то не хватает в синтаксисе, но я не могу понять, что именно. Я пытаюсь создать фильтр токенов захвата шаблона телефонного номера, определенный здесь . В нем говорится, чтобы определить фильтр ключевых слов, а затем применить маркер захвата шаблона сверху. Вот что я сделал:

{
    "mappings": {
        "_doc": {
            "properties": {
                "phone": {
                    "type": "text",
                    "analyzer": "my_phone_analyzer"
                }
            }
        }
    },
    "settings": {
        "analysis": {
            "analyzer": {
                "my_phone_analyzer": {
                    "type": "custom",
                    "tokenizer": "keyword",
                    "char_filter": [
                        "phone_number"
                    ]
                }
            }
        },
        "char_filter": {
            "phone_number": {
                "type": "pattern_capture",
                "preserve_original": 1,
                "patterns": [
                    "1(\\d{3}(\\d+))"
                ]
            }
        }
    }
}

Что вызывает следующую ошибку:

{
    "error": {
        "root_cause": [
            {
                "type": "illegal_argument_exception",
                "reason": "unknown setting [index.char_filter.phone_number.patterns] please check that any required plugins are installed, or check the breaking changes documentation for removed settings"
            }
        ],
        "type": "illegal_argument_exception",
        "reason": "unknown setting [index.char_filter.phone_number.patterns] please check that any required plugins are installed, or check the breaking changes documentation for removed settings",
        "suppressed": [
            {
                "type": "illegal_argument_exception",
                "reason": "unknown setting [index.char_filter.phone_number.preserve_original] please check that any required plugins are installed, or check the breaking changes documentation for removed settings"
            },
            {
                "type": "illegal_argument_exception",
                "reason": "unknown setting [index.char_filter.phone_number.type] please check that any required plugins are installed, or check the breaking changes documentation for removed settings"
            }
        ]
    },
    "status": 400
}

Если кто-нибудь может указать, что я делаю неправильно, это было бы здорово!

Ответы [ 2 ]

2 голосов
/ 07 июня 2019

Ссылка, которую вы упомянули, выглядит довольно старой.

pattern_capture больше не применяется к char_filter, а только к token filter

Ниже показано, как будет отображаться карта, если вы используете Elasticsearch выше 5.x

PUT <your_index_name>
{  
   "mappings":{  
      "_doc":{  
         "properties":{  
            "phone":{  
               "type":"text",
               "analyzer":"my_phone_analyzer"
            }
         }
      }
   },
   "settings":{  
      "analysis":{  
         "analyzer":{  
            "my_phone_analyzer":{  
               "type":"custom",
               "tokenizer":"keyword",
               "filter":[  
                  "phone_number"
               ]
            }
         },
         "filter":{  
            "phone_number":{  
               "type":"pattern_capture",
               "preserve_original":true,
               "patterns":[  
                  "1(\\d{3}(\\d+))"
               ]
            }
         }
      }
   }
}

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

POST <your_index_name>/_analyze
{
  "analyzer": "my_phone_analyzer",
  "text": "19195557321"
}

Лексемы:

{
  "tokens" : [
    {
      "token" : "19195557321",
      "start_offset" : 0,
      "end_offset" : 11,
      "type" : "word",
      "position" : 0
    },
    {
      "token" : "9195557321",
      "start_offset" : 0,
      "end_offset" : 11,
      "type" : "word",
      "position" : 0
    },
    {
      "token" : "5557321",
      "start_offset" : 0,
      "end_offset" : 11,
      "type" : "word",
      "position" : 0
    }
  ]
}

Надеюсь, это поможет!

2 голосов
/ 07 июня 2019

Есть несколько проблем с вашей конфигурацией создания my_phone_analyzer.

  1. pattern_capture разрешено в фильтре токенов, а не в фильтре символов, подробнее здесь https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-pattern-capture-tokenfilter.html

  2. preserve_original параметр не принимает значение 1 вместо того, чтобы использовать true, false в качестве значения.

Итак, учитывая все эти вещи, я смог создать my_phone_analyzer с такими же настройками, как у вас.

{
   "settings" : {
      "analysis" : {
         "filter" : {
            "code" : {
               "type" : "pattern_capture",
               "preserve_original" : true,
               "patterns": [
                    "1(\\d{3}(\\d+))"
                ]
            }
         },
         "analyzer" : {
            "code" : {
               "tokenizer" : "keyword",
               "filter" : [ "code", "lowercase" ]
            }
         }
      }
   }
}

Дайте мне знать, если у вас возникнут какие-либо проблемы.

...