Задать вопрос
@juniorspecialist
Джуниор

Как построить запрос к Elasticsearch, чтобы фильтровать по списку regex?

Всем привет.
Есть задача - формировать запрос на выборку данных из Elasticsearch, при условии, что может быть указан список значений слов в виде регулярных выражений + список слов исключений(без использования регулярных выражений).
Я не разобрался как передавать эластику список значений для условия по регулярке, поэтому каждое условие регулярки разделил символом "|", интересует как можно сделать иначе.
В примере ищим совпадения по "мульт.*" и по "фильм.*", а в блоке "must_not" - слова исключения. Подскажите как написать запрос, чтобы не мудрить с символом "|". И ещё вопрос не по теме, можно ли вообще как-то проверить правильно регулярного выражения, сделать его валидацию, например на PHP ?
"query": { "regexp":{
            "word" : "мульт.*|фильм.*"
        }},    
    "filter": {
      "bool": {
            "must_not": [
             {"terms": {
                "word": ["видео", "скачать"]
             }}
          ]                  
      }
    }
  • Вопрос задан
  • 2239 просмотров
Подписаться 1 Оценить Комментировать
Решения вопроса 1
MintTea
@MintTea
Для фильтрации типа "или" можно использовать секцию "should" используемого вами фильтра "bool". Примерно так:
curl -XGET 'http://localhost:9200/_search' -d '{
    "filter": {
        "bool": {
            "should": [
                {
                    "regexp": {
                        "word": "мульт.*"
                    }
                },
                {
                    "regexp": {
                        "word": "фильм.*"
                    }
                }
            ],
            "must_not": {
                "terms": {
                    "word": ["видео", "скачать"]
                }
            }
        }
    }
}'


Валидация регулярок возможна через эластик (Validating api):
curl -XGET 'http://localhost:9200/_validate/query?explain' -d '{
    "query": {
        "regexp": {
            "word": "мульт.*"
        }
    }
}'
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы