Как использовать стандартный токенизатор с preserve_original? - PullRequest
0 голосов
/ 19 октября 2018

Я создал 2 пользовательских анализатора, как показано ниже, но оба не работают так, как я хотел.вот что я хочу в моем инвертированном индексе, например;для слова reb-tn2000xxxl мне нужно иметь reb, tn2000xxl, reb-tn2000xxxl в моем инвертированном индексе.

{  
   "analysis":{  
      "filter":{  
         "my_word_delimiter":{  
            "split_on_numerics":"true",
            "generate_word_parts":"true",
            "preserve_original":"true",
            "generate_number_parts":"true",
            "catenate_all":"true",
            "split_on_case_change":"true",
            "type":"word_delimiter"
         }
      },
      "analyzer":{  
         "my_analyzer":{  
            "filter":[  
               "standard",
               "lowercase",
               "my_word_delimiter"
            ],
            "type":"custom",
            "tokenizer":"whitespace"
         },
         "standard_caseinsensitive":{  
            "filter":[  
               "standard",
               "lowercase"
            ],
            "type":"custom",
            "tokenizer":"keyword"
         },
         "my_delimiter":{  
            "filter":[  
               "lowercase",
               "my_word_delimiter"
            ],
            "type":"custom",
            "tokenizer":"standard"
         }
      }
   }
}

, если я использую my_analyzer, который реализует токенайзер whitespace, результаты выглядят следующим образом, если япроверьте с помощью curl

  curl -XGET "index/_analyze?analyzer=my_analyzer&pretty=true" -d "reb-tn2000xxxl"
{
  "tokens" : [ {
    "token" : "reb-tn2000xxxl",
    "start_offset" : 0,
    "end_offset" : 14,
    "type" : "word",
    "position" : 0
  }, {
    "token" : "reb",
    "start_offset" : 0,
    "end_offset" : 3,
    "type" : "word",
    "position" : 0
  }, {
    "token" : "rebtn2000xxxl",
    "start_offset" : 0,
    "end_offset" : 14,
    "type" : "word",
    "position" : 0
  }, {
    "token" : "tn",
    "start_offset" : 4,
    "end_offset" : 6,
    "type" : "word",
    "position" : 1
  }, {
    "token" : "2000",
    "start_offset" : 6,
    "end_offset" : 10,
    "type" : "word",
    "position" : 2
  }, {
    "token" : "xxxl",
    "start_offset" : 10,
    "end_offset" : 14,
    "type" : "word",
    "position" : 3
  } ]
}

, поэтому здесь я пропускаю разделение tn2000xxxl, которое можно получить, если я использую токенайзер standard вместо whitespace, но проблема заключается в том, что я использую стандартный, например my_delimiter custom analyzerиспользует.У меня нет первоначального значения в инвертированном индексе.Кажется, что standard tokinezer и preserve_original filter вместе не работают.Я где-то читал, что, поскольку стандартный токенизатор уже разделяется на оригинал до применения фильтра, поэтому оригинал уже не тот.но как я могу решить эту задачу, чтобы предотвратить расщепление оригинала, как стандартный токенизатор?

curl -XGET "index/_analyze?analyzer=my_delimiter&pretty=true" -d "reb-tn2000xxxl"
{  
   "tokens":[  
      {  
         "token":"reb",
         "start_offset":0,
         "end_offset":3,
         "type":"<ALPHANUM>",
         "position":0
      },
      {  
         "token":"tn2000xxxl",
         "start_offset":4,
         "end_offset":14,
         "type":"<ALPHANUM>",
         "position":1
      },
      {  
         "token":"tn",
         "start_offset":4,
         "end_offset":6,
         "type":"<ALPHANUM>",
         "position":1
      },
      {  
         "token":"tn2000xxxl",
         "start_offset":4,
         "end_offset":14,
         "type":"<ALPHANUM>",
         "position":1
      },
      {  
         "token":"2000",
         "start_offset":6,
         "end_offset":10,
         "type":"<ALPHANUM>",
         "position":2
      },
      {  
         "token":"xxxl",
         "start_offset":10,
         "end_offset":14,
         "type":"<ALPHANUM>",
         "position":3
      }
   ]
}

1 Ответ

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

В Elasticsearch у вас может быть несколько полей в вашем отображении.Поведение, которое вы описываете, на самом деле довольно распространено.Ваше основное поле text может быть проанализировано с помощью анализатора standard, а также поля keyword.Вот пример отображения с использованием нескольких полей из документации.https://www.elastic.co/guide/en/elasticsearch/reference/current/multi-fields.html

PUT my_index
{
  "mappings": {
    "_doc": {
      "properties": {
        "city": {
          "type": "text",
          "fields": {
            "raw": { 
              "type":  "keyword"
            }
          }
        }
      }
    }
  }
}

В этом примере поле "city" будет проанализировано с помощью анализатора standard, а "city.raw" будет не проанализировано keyword.Другими словами, "city.raw" является исходной строкой.

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