Отрицательный просмотр вперед Regexp не работает в запросе ES DSL

Схема моего эластичного поиска выглядит следующим образом:

{
  "settings": {
    "index": {
      "number_of_shards": "5",
      "number_of_replicas": "1"
    }
  },
  "mappings": {
    "node": {
      "properties": {
        "field1": {
          "type": "keyword"
        },
        "field2": {
          "type": "keyword"
        },
        "query": {
          "properties": {
            "regexp": {
              "properties": {
                "field1": {
                  "type": "keyword"
                },
                "field2": {
                  "type": "keyword"
                }
              }
            }
          }
        }
      }
    }
  }
}

Проблема в следующем:

Я формирую запросы ES с помощью elasticsearch_dsl Q (). Он отлично работает в большинстве случаев, когда мой запрос содержит любое сложное регулярное выражение. Но он полностью не работает, если он содержит символ регулярного выражения '!' в этом. Это не дает никакого результата, если поисковый запрос содержит "!" в этом.

Например:

1.) Q('regexp', field1 = "^[a-z]{3}.b.*") (отлично работает)

2.) Q('regexp', field1 = "^f04.*") (отлично работает)

3.) Q('regexp', field1 = "f00.*") (отлично работает)

4.) Q('regexp', field1 = "f04baz?") (отлично работает)

Не работает в следующем случае:

5.) Q('regexp', field1 = "f04((?!z).)*") (не работает без каких-либо результатов)

Я попытался добавить "анализатор": "ключевое слово" вместе с "тип": "ключевое слово", как указано выше, в поля, но в этом случае ничего не работает.

В браузере я попытался проверить, как будет работать анализатор: ключевое слово с вводом в случае сбоя:

http: // localhost: 9210 / search / _analyze? analyzer = keyword & text = f04 ((?! z).) *

Кажется, здесь все выглядит нормально с результатом:

{
  "tokens": [
    {
      "token": "f04((?!z).)*",
      "start_offset": 0,
      "end_offset": 12,
      "type": "word",
      "position": 0
    }
  ]
}

Я выполняю свои запросы, как показано ниже:

search_obj = Search(using = _conn, index = _index, doc_type = _type).query(Q('regexp', field1 = "f04baz?"))
count = search_obj.count()
response = search_obj[0:count].execute()
logger.debug("total nodes(hits):" + " " + str(response.hits.total))

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

Кроме того, как я могу проверить, какой анализатор в настоящее время применяется с вышеуказанной настройкой в ​​моих сопоставлениях?

Поддерживает ли ElasticSearch поисковые обходы в синтаксисе регулярных выражений?

Tim Biegeleisen 12.08.2018 08:38

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

Tim Biegeleisen 12.08.2018 08:51

Он был опубликован несколько дней назад, я не получаю никакой помощи по этому поводу. Спасибо

zubug55 12.08.2018 10:10

@TimBiegeleisen; я просто пытался сделать что-то вроде этого ^ (f04ba) [^ z] +? $ вместо этого f04 ((?! z).) *, чтобы избежать ответов с z; и это сработало. Дает ли эта штука какой-нибудь намек на то, почему! в запросе регулярного выражения не дает результатов?

zubug55 12.08.2018 10:31

@ wiktor-stribiżew, пожалуйста, помогите с этим вопросом?

zubug55 12.08.2018 11:08

@ WiktorStribiżew. вы можете помочь с этим вопросом плз?

zubug55 12.08.2018 11:22

@ WiktorStribiżew; похоже, вы решили это -> stackoverflow.com/questions/38645755/…; как мне решить то же самое в моем случае?

zubug55 12.08.2018 11:22

Эм, попробуйте изменить "f04((?!z).)*" на "f04[^z]*", поскольку кажется, что регулярное выражение просто соответствует строке, начинающейся с f04, а затем 0 или более символов, кроме z.

Wiktor Stribiżew 12.08.2018 13:41

Да, но я хочу знать, что поисковые запросы не поддерживаются в эластичном поиске, верно? ; поэтому я попытался записать это "f04 ((?! z).) *" в ". * f04. * & ~ (. * z. *)" следующим вопросом -> stackoverflow.com/questions/38645755/…; это правильно?

zubug55 12.08.2018 14:35

@ WiktorStribiżew также, как вы сказали, похоже, что он соответствует только строке с f04, но на самом деле это не так; я не получаю никаких результатов. Может быть причина в том, что поисковые запросы не поддерживаются в ES?

zubug55 12.08.2018 14:40

В регулярном выражении ElasticSearch (движок Lucene) поисковые запросы не поддерживаются. Кстати, .*f04.*&~(.*z.*) соответствует сильному, имеющему f04, но не имеющему z внутри строки. Что вам на самом деле нужно?

Wiktor Stribiżew 12.08.2018 14:50

Правильно, я хочу именно это ->. * F04. * & ~ (. * Z. *)

zubug55 12.08.2018 14:53

Ваш ответ stackoverflow.com/questions/38645755/… помог мне придумать это решение. Спасибо, сэр

zubug55 12.08.2018 14:54
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
13
667
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Механизм регулярных выражений ElasticSearch Lucene не поддерживает поисковые запросы любого типа. Документация по регулярным выражениям ES довольно двусмысленно, говоря сопоставление всего, например .*, очень медленное, а также использование регулярных выражений поиска (что не только неоднозначно, но и неверно, поскольку поисковые запросы при разумном использовании могут значительно ускорить сопоставление регулярных выражений).

Поскольку вы хотите сопоставить любую строку, содержащую f04 и не содержащую z, вы можете использовать

[^z]*fo4[^z]*

Подробности

  • [^z]* - любые символы 0+, кроме z
  • fo4 - подстрока fo4
  • [^z]* - любые символы 0+, кроме z.

Если у вас есть строка с несколькими символами, которую нужно «исключить» (скажем, z4, а не z), вы можете использовать свой подход, используя оператор дополнения:

.*f04.*&~(.*z4.*)

Это означает почти то же самое, но не поддерживает разрывы строк:

  • .* - любые символы, кроме новой строки, как можно больше
  • f04 - f04
  • .* - любые символы, кроме новой строки, как можно больше
  • & - И
  • ~(.*z4.*) - любая строка, кроме той, которая имеет z4

Можете ли вы также указать, что ES не поддерживает поисковые запросы в регулярном выражении. Это явно нигде не упоминается в документации ED dsl.

zubug55 13.08.2018 20:37

Другие вопросы по теме