Regex: получение всех хэштегов и упоминаний, используемых во всех моих документах - PullRequest
0 голосов
/ 08 февраля 2019

Я использую консоль Kibana для выполнения таких запросов (они разделены: один для хэштегов, один для упоминаний).Коллекция документов - это записи блога с полем textContent, которое может содержать упоминания пользователя, например @theUserName @AnotherOne, или хэштеги, такие как #helloWorld и # hello2.Запросы выглядят следующим образом:

GET /xblog/_search
{
  "source": [
    "id",
    "textContent"
  ],
  "query": {
    "regexp": {
      "textContent": {
        "value": "@([^-A-Za-z0-9])",
        "flags": "ALL"
      }
    }
  }
}

Но проблема в том, что он возвращает также документы, которые не содержат @userMention.Я думаю, что @ в регулярном выражении рассматривается как специальный символ, но, читая документацию, я не смог найти, как избежать этого.

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

"" @ "" Но я ничего не получил.

Я также тестирую выражения, к которым привык, например: / \ s ([@ #] [\w _-] +) / g

Но это приводит к множественным ошибкам в Кибане.Я попытался заменить некоторые детали в соответствии с документацией, но она все еще не работает.

Можете ли вы указать мне правильное направление?Заранее спасибо,

1 Ответ

0 голосов
/ 08 февраля 2019

Вы включили флаг ALL, который позволяет @ соответствовать всей строке, см. Документацию ElasticSearch regex :

Если вы включите дополнительные функции (см. Ниже)тогда эти символы также могут быть зарезервированы:

# @ & < > ~

Затем в секции Любая строка :

Знак at "@" полностью соответствует любой строке.Включается с флагами ANYSTRING или ALL.

Поскольку здесь вам не нужно никакого особого поведения, вы можете просто указать движку использовать «простое» регулярное выражение, передав "flags": "NONE", илиэкранировать @, "\\@([^-A-Za-z0-9])":

Любой зарезервированный символ может быть экранирован с обратной косой чертой "\*", включая буквенный символ обратной косой черты: "\\"

Итак как вам нужно полное совпадение строк, вам может потребоваться добавить .* на обоих концах (чтобы сопоставить строки , содержащие ваше совпадение):

"query": {
  "regexp": {
    "textContent": {
      "value": ".*@[^-A-Za-z0-9].*",
      "flags": "NONE"
    }
  }
}

или

"query": {
  "regexp": {
    "textContent": {
      "value": ".*\\@[^-A-Za-z0-9].*",
      "flags": "ALL"
    }
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...