Как написать Elasticsearch несколько запросов сценариев должны? - PullRequest
0 голосов
/ 02 июля 2018

Я хочу использовать запрос для сравнения нескольких полей. У меня есть поля с 1 по 4. Я хочу найти данные, поле которых 1 больше, чем поле 2 и ниже запрос отлично работает;

{
    "size": 0,
    "_source": [
        "field1",
        "field2",
        "field3",
        "field4"
    ],
    "sort": [],
    "query": {
        "bool": {
            "filter": [],
            "must": {
                "script": {
                    "script": {
                        "inline": "doc['field1'].value > doc['field2'].value;",
                        "lang": "painless"
                    }
                }
            }
        }
    }
}

Теперь я хочу найти данные, какое поле 1 больше поля 2, а также какое поле 3 больше поля 4. в соответствии с Упругий поиск: Как писать сценарии с несколькими операторами? и Эта ссылка Мне просто нужно отделить каждое утверждение точкой с запятой. Так и должно быть:

{
    "size": 0,
    "_source": [
        "field1",
        "field2",
        "field3",
        "field4"
    ],
    "sort": [],
    "query": {
        "bool": {
            "filter": [],
            "must": {
                "script": {
                    "script": {
                        "inline": "doc['field1'].value > doc['field2'].value; doc['field3'].value > doc['field4'].value;",
                        "lang": "painless"
                    }
                }
            }
        }
    }
}

Но этот запрос не работает и возвращает ошибку компиляции, например:

{ "ROOT_CAUSE": [{ "типа": "script_exception", "причина": "компилировать ошибка "," script_stack ": [" doc ['field1']. value> doc ['... "," ^ ---- ЗДЕСЬ "]," script ":" doc ['field1']. Value> doc ['field2']. Value; doc ['field1']. value> doc ['field2']. value; " "Языки": "безболезненный"}], "типа": "search_phase_execution_exception", "причина":" все осколки не удалось», "фаза": "запрос", "сгруппированы": правда, "failed_shards": [{ "осколок": 0, "Индекс": "финансовые", "узел": "8SXaM2HcStelpLHvTDSMCQ", "причина": { "Тип": "query_shard_exception", "причина": "не удалось создать запрос: {\ n \ "bool \": {\ n \ "must \": [\ n {\ n \ "script \": {\ n \ "script \": {\ n \ "source \": \ "doc ['field1']. value> . Документ [ 'поле2'] значение; doc ['field1']. value> doc ['field2']. value; \», \ П \ "lang \": \ "безболезненно \" \ n}, \ n \ "boost \": 1.0 \ n} \ n} \ n], \ n \ "Adjust_pure_negative \": true, \ n \ "boost \": 1,0 \ n } \ П} " "index_uuid": "hz12cHg1SkGwq712n6BUIA", "Индекс": "финансовые", "caused_by": { "Тип": "script_exception", "причина":" компиляции ошибка "," script_stack ": [" doc ['field1']. value> doc ['... "," ^ ---- ЗДЕСЬ "]," script ":" doc ['field1']. Value> doc ['field2']. Value; doc ['field1']. value> doc ['field2']. value; " "Языки": "безболезненным", "caused_by": { "типа": "illegal_argument_exception", "причина":" Не заявление. "}}}}]}

Ответы [ 2 ]

0 голосов
/ 02 июля 2018

Чтобы использовать больше, чем условие, «must», «should» и «must_not» можно использовать в качестве массивов, и каждое условие становится его элементом. Согласно документации Elasticsearch

"query": {
  "bool" : {
    "must" : {
      "term" : { "user" : "kimchy" }
    },
    "filter": {
      "term" : { "tag" : "tech" }
    },
    "must_not" : {
      "range" : {
        "age" : { "gte" : 10, "lte" : 20 }
      }
    },
    "should" : [
      { "term" : { "tag" : "wow" } },
      { "term" : { "tag" : "elasticsearch" } },
      { "term" : { "tag" : "and so on" } }
    ],
    "minimum_should_match" : 1,
    "boost" : 1.0
  }
}
0 голосов
/ 02 июля 2018

Вам нужно объединить два условия следующим образом:

doc['field1'].value > doc['field2'].value && doc['field3'].value > doc['field4'].value
                                           ^
                                           |
                               replace the semicolon by &&
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...