2016-11-14 3 views
0

пытался сделать регулярное выражение поиска в elasticsearch, с помощью следующего запроса:Нераспознанный символ в elasticsearch

{ 
"query": { 
    "constant_score": { 
    "filter": { 
     "bool": { 
     "must": [ 
      { 
      "regexp": { 
       "displayName" : "(^a\w+| a(\w+))" 
      } 
      } 
     ] 
     } 
    } 
    } 
} 
} 

Это регулярное выражение прекрасно работает в https://regex101.com/ но выше запрос дает:

nested: QueryParsingException[[bm_md_acct_9993342_v1] Failed to parse]; nested: JsonParseException[Unrecognized character escape 'w' (code 119)\n at [Source: UNKNOWN; line: 10, column: 37]]; } 

Я попытался избегая его по-разному, но без успеха. Как правильно поместить escape-последовательность?

Пробовал:

{ 
"query": { 
    "constant_score": { 
    "filter": { 
     "bool": { 
     "must": [ 
      { 
      "regexp": { 
       "displayName" : "(^J\\w+| J(\\w+))" 
      } 
      } 
     ] 
     } 
    } 
    } 
} 
} 

дает пустой результат, даже если запись DISPLAYNAME "Джейсон Кремер" существует.

+0

Что вы пытаетесь найти? –

+0

Если вы хотите совпадать только с записями, начинающимися с 'J', а затем иметь 1 + буквы с пробелами, используйте' 'J [a-zA-Z] +" ' –

+0

Или, если вы хотите совместить имя или имя или последнее имя начинается с 'J', используйте' 'J [a-zA-Z] + [a-zA-Z] + | [a-zA-Z] + J [a-zA-Z] +" ' , –

ответ

0

Запрос регулярного выражения в elasticsearch не является полностью гибким.
Например, \w соответствует любому символу слова в стандартном регулярном выражении, но в elasticsearch вы не можете представлять \w, так как \ является зарезервированным символом в поиске elastics.

Чтобы \w действует в elasticsearch, мы должны бежать с помощью \, который будет конвертировать ваши регулярные выражения для \\\w. Теперь этот \\\w изменяет значение вашего регулярного выражения.

Он будет соответствовать "\" followed by "w" rather than matching word character.

Ваше предложение заменяет \ w в вашем регулярном выражении [a-zA-Z0-9_]. Это сработает. А также вы не можете использовать ^ для одного символа. Удалите это в своем регулярном выражении, и ваш запрос будет

{ "query": { "constant_score": { 
    "filter": { 
     "bool": { 
     "must": [ 
      { 
      "regexp": { 
       "displayName" : "(J[a-zA-Z0-9_]+| J([a-zA-Z0-9_]+))" 
      } 
      } 
     ] 
     } 
    } } } } 
0

Acc. к Elasticsearch regex documentation, его синтаксис не поддерживает классы сокращенных символов, столь общие в других вариантах регулярных выражений, поэтому вы не можете использовать \w, вы можете использовать только классы символов (или выражения скобок), такие как [a-zA-Z], чтобы соответствовать буквам, или [a-zA-Z0-9_], чтобы соответствовать тому, что \w совпадений в JavaScript.

Далее ^ и $, также распространенные в других вариантах, не поддерживаются регулярным выражением ES. Весь шаблон закреплен по умолчанию, поэтому они даже не нужны.

Теперь вы хотите, чтобы любое слово имело J внутри. Есть несколько вариантов:

  1. ".*J.*" будет соответствовать любой строке, которая содержит J
  2. ".*J[a-zA-Z].*" будет соответствовать любой строке, которая содержит J, а затем письмо
  3. "J[a-zA-Z].*|.* J[a-zA-Z].*" будет соответствовать любой строке, которая начинается с J, а затем письмо , а затем любые символы или любую строку, содержащую пробел, J и любую букву после нее.