Похоже, вы используете text
тип данных для хранения Unit.DailyAvailability
(который также используется по умолчанию для строк, если вы используете динамическое отображение ).Вам следует рассмотреть возможность использования keyword
типа данных.
Позвольте мне объяснить более подробно.
Почему мое регулярное выражение соответствует чему-то в середине text
field?
Что происходит с типом данных text
, так это то, что данные анализируются для полнотекстового поиска.Он выполняет некоторые преобразования, такие как нижний регистр и разбиение на токены.
Давайте попробуем использовать Analyze API против вашего ввода:
POST _analyze
{
"text": "UIAOUUUUUUUIAAAAAAAAAAAAAAAAAOUUUUIAAAAOUUUIAOUUUUUUUUUUUUUUUUUUUUUUUUUUIAAAAAAAAAAAAAAAAAAAAAAOUUUUUUUUUUIAAAAAOUUUUUUUUUUUUUIAAAAOUUUUUUUUUUUUUIAAAAAAAAOUUUUUUIAAAAAAAAAOUUUUUUUUUUUUUUUUUUIUUUUUUUUIUUUUUUUUUUUUUUIAAAOUUUUUUUUUUUUUIUUUUIAOUUUUUUUUUUUUUUUUUUUUUUUUUUUUUIAAAAAAAAAAAAOUUUUUUUUUUUUUUUUUUUUIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
}
Ответ:
{
"tokens": [
{
"token": "uiaouuuuuuuiaaaaaaaaaaaaaaaaaouuuuiaaaaouuuiaouuuuuuuuuuuuuuuuuuuuuuuuuuiaaaaaaaaaaaaaaaaaaaaaaouuuuuuuuuuiaaaaaouuuuuuuuuuuuuiaaaaouuuuuuuuuuuuuiaaaaaaaaouuuuuuiaaaaaaaaaouuuuuuuuuuuuuuuuuuiuuuuuuuuiuuuuuuuuuuuuuuiaaaouuuuuuuuuuuuuiuuuuiaouuuuuuuuuuuuuuu",
"start_offset": 0,
"end_offset": 255,
"type": "<ALPHANUM>",
"position": 0
},
{
"token": "uuuuuuuuuuuuuuiaaaaaaaaaaaaouuuuuuuuuuuuuuuuuuuuiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
"start_offset": 255,
"end_offset": 510,
"type": "<ALPHANUM>",
"position": 1
},
{
"token": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaouuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
"start_offset": 510,
"end_offset": 732,
"type": "<ALPHANUM>",
"position": 2
}
]
}
Как видите, Elasticsearch разделил ваши входные данные на три токена и поместил их в нижний регистр.Это выглядит неожиданно, но если вы думаете, что оно на самом деле пытается облегчить поиск слов на человеческом языке, это имеет смысл - таких длинных слов нет.
Вот почему теперь regexp
query ".{7}a{7}.*"
будет соответствовать: есть токен, который на самом деле начинается с большого числа a
, что является ожидаемым поведением из regexp
запроса.
... Elasticsearch будет применятьсярегулярное выражение для терминов, созданных токенайзером для этого поля, а не для исходного текста поля.
Как я могу сделать запрос regexp
для всей строки?
Это очень просто: не применять анализаторы.Тип keyword
хранит указанную вами строку как есть.
При таком сопоставлении:
PUT my_regexes
{
"mappings": {
"doc": {
"properties": {
"Unit": {
"properties": {
"DailyAvailablity": {
"type": "keyword"
}
}
}
}
}
}
}
Вы сможете выполнить запрос, подобный этомуэто будет соответствовать документу из сообщения:
POST my_regexes/doc/_search
{
"query": {
"bool": {
"filter": [
{
"regexp": { "Unit.DailyAvailablity": "UIAOUUUUUUUIA.*" }
}
]
}
}
}
Обратите внимание, что запрос стал чувствительным к регистру, потому что поле не анализируется.
Этот regexp
больше не будет возвращать никаких результатов: ".{12}a{7}.*"
Это будет: ".{12}A{7}.*"
А как насчет привязки?
Регулярные выражения привязаны :
Узоры Люсена всегда привязаны.Предоставляемый шаблон должен соответствовать всей строке.
Причина, по которой было похоже, что привязка была неправильной, была наиболее вероятной, потому что токены были разбиты в анализируемом поле text
.
Надеждаэто помогает!