Ошибка поиска 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,