Неправильный запрос регулярного выражения дляasticsearch - PullRequest
0 голосов
/ 28 июня 2018

У меня есть некоторые проблемы с запросом регулярного выражения дляasticsearch. В моем индексе есть текстовое поле с разделенными запятыми числовыми значениями (идентификаторами), например,

2,140,3,2495

И у меня есть следующий запрос:

"regexp" : {
  "myIds" : {
    "value" : "^2495,|,2495,|,2495$|^2495$",
    "boost" : 1
  }
}

Но мой список результатов пуст.

Позвольте мне сказать, что я знаю, что запросы регулярных выражений отчасти медленные, но индекс все еще существует и заполнен миллионами документов, поэтому, к сожалению, его нельзя реструктурировать. Поэтому мне нужно решение регулярных выражений.

Ответы [ 2 ]

0 голосов
/ 28 июня 2018

Хорошо, я заставил его работать, но теперь столкнулся с другой проблемой. Я построил строку следующим образом:

(.*,)?2495(,.*)?|(.*,)?10(,.*)?|(.*,)?898(,.*)?

Это работает хорошо для нескольких идентификаторов, но если я скажу, скажем, 50 идентификаторов, то ES выдает исключение, которое говорит, что регулярное выражение слишком сложно для обработки.
Есть ли способ упростить регулярное выражение или реструктурировать сам запрос?

0 голосов
/ 28 июня 2018

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

То, что вы хотите использовать, это "2495,.*|.*,2495,.*|.*,2495|2495" - 2495, в начале строки, ,2495, в середине, ,2495 в конце или целая строка, равная 2495.

Или, вы можете использовать более простой

"(.*,)?2495(,.*)?"

Это значит

  • (.*,)? - необязательный текст (не включая разрывы строк), заканчивающийся ,
  • 2495 - ваша ценность
  • (,.*)? - необязательный текст (не включая разрывы строк), заканчивающийся ,

Вот онлайн-демонстрация , показывающая, как работает это выражение (хотя и не доказательство).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...