Я создал 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
}
]
}