Ошибка поиска Elasticsearch в поле со специальным символом и подстановочным знаком
у меня есть поле в Elasticsearch со значением " PEI.Х. 02354.01.". Когда я ищу с querystring
as
{
"query":{
"query_string":{
"query":"field:PEI.H.02354.01.",
"default_operator":"AND"
}
}
}
затем возвращается результат, который является правильным поведением. Но если я ищу с подстановочным знаком, то результаты не возвращаются, например
{
"query":{
"query_string":{
"query":"field:PEI.H.02354.01.*",
"default_operator":"AND"
}
}
}
поле имеет тип string и анализируется. Ниже приведен код, который создает индекс, включая анализатор и сопоставления.
{
"settings":{
"analysis":{
"analyzer":{
"number":{
"type":"custom",
"tokenizer":"keyword",
"filter":[
"lowercase"
],
"char_filter":[
"number_filter"
]
},
"diacritical":{
"type":"custom",
"tokenizer":"standard",
"filter":[
"standard",
"lowercase",
"asciifolding",
"nfd_normalizer"
]
}
},
"filter":{
"nfd_normalizer":{
"type":"icu_normalizer",
"name":"nfc"
}
},
"char_filter":{
"number_filter":{
"type":"pattern_replace",
"pattern":"[^d]+",
"replacement":""
}
}
}
},
"mappings":{
"testType":{
"_source":{
"enabled":false
},
"_all":{
"enabled":false
},
"_timestamp":{
"enabled":"true",
"store":"yes"
},
"properties":{
"field":{
"store":"yes",
"type":"string",
"index":"analyzed",
"analyzer":"diacritical"
}
}
}
}
наконец, образец вставить is
{
field: "PEI.H.02354.01."
}
кто-нибудь знает, почему это происходит и как это решить?
1 ответов
посмотреть добавить документы:
Wildcarded термины не анализируются по умолчанию - они строчные (lowercase_expanded_terms по умолчанию true), но дальнейший анализ не выполняется
ваши сохраненные данные разбиты на два термина:
curl -XGET 'localhost:9200/myindex/_analyze?analyzer=diacritical&pretty' -d 'PEI.H.02354.01'
{
"tokens" : [ {
"token" : "pei.h",
"start_offset" : 0,
"end_offset" : 5,
"type" : "<ALPHANUM>",
"position" : 1
}, {
"token" : "02354.01",
"start_offset" : 6,
"end_offset" : 14,
"type" : "<NUM>",
"position" : 2
} ]
}
но как ваш поисковый запрос с подстановочным знаком превращается только в pei.h.02354.01.*
он не будет соответствовать.
вместе с analyze_wildcard
значение правда, вы получаете хиты:
curl -XGET "http://localhost:9200/myindex/testType/_search?pretty" -d'
> {
> "query":{
> "query_string":{
> "query":"field:PEI.H.02354.01.*",
> "default_operator":"AND",
> "analyze_wildcard": true
> }
> }
> }'
{
"took" : 5,
"timed_out" : false,
"_shards" : {
"total" : 5,
"successful" : 5,
"failed" : 0
},
"hits" : {
"total" : 2,
"max_score" : 1.4142135,