Запрос ElasticSearch RANGE не работает должным образом - PullRequest
0 голосов
/ 28 мая 2020

Я пытаюсь выполнить запрос RANGE для вложенного документа, используя ES 7.7 Java API. Я заметил, что он не фильтрует данные, как ожидалось. Когда я помещаю операторы отладки в фактический запрос, выполняемый ES, я не могу получить соответствующие результаты, в основном для раздела «to» запроса диапазона. Я заметил, что GT или GTE отлично работают через LT, а LTE также не работает должным образом.

Ниже приведен простой код Java для этого запроса диапазона. Обратите внимание, что вес во вложенном документе определяется как float, например ""weight": {"type": "float"},".

query.must(QueryBuilders.nestedQuery(fields[0], QueryBuilders.rangeQuery(c.getField()).from(c.getValues().get(0)).to(c.getValues().get(1)),ScoreMode.None).innerHit(innerHitBuilder));

Ниже приведен пример кода API Java для LT.

query.must(QueryBuilders.nestedQuery(fields[0], QueryBuilders.rangeQuery(c.getField()).lt(c.getValue()), ScoreMode.None).innerHit(innerHitBuilder));

Ниже запрос, который ES фактически выполняет для указанного выше оператора RANGE query statement.

{
   "from":0,
   "size":50,
   "query":{
      "bool":{
         "must":[
            {
               "match_phrase":{
                  "fundsponsor":{
                     "query":"vanguard group inc",
                     "slop":0,
                     "zero_terms_query":"NONE",
                     "boost":1.0
                  }
               }
            },
            {
               "nested":{
                  "query":{
                     "match_phrase":{
                        "holdings.componentticker":{
                           "query":"baba",
                           "slop":0,
                           "zero_terms_query":"NONE",
                           "boost":1.0
                        }
                     }
                  },
                  "path":"holdings",
                  "ignore_unmapped":false,
                  "score_mode":"none",
                  "boost":1.0,
                  "inner_hits":{
                     "name":"holdings.componenttickerbaba",
                     "ignore_unmapped":false,
                     "from":0,
                     "size":100,
                     "version":false,
                     "seq_no_primary_term":false,
                     "explain":false,
                     "track_scores":false
                  }
               }
            },
            {
               "nested":{
                  "query":{
                     "range":{
                        "holdings.weight":{
                           "from":1.0,
                           "to":2.0,
                           "include_lower":true,
                           "include_upper":true,
                           "boost":1.0
                        }
                     }
                  },
                  "path":"holdings",
                  "ignore_unmapped":false,
                  "score_mode":"none",
                  "boost":1.0,
                  "inner_hits":{
                     "name":"holdings.weightnull",
                     "ignore_unmapped":false,
                     "from":0,
                     "size":100,
                     "version":false,
                     "seq_no_primary_term":false,
                     "explain":false,
                     "track_scores":false
                  }
               }
            }
         ],
         "adjust_pure_negative":true,
         "boost":1.0
      }
   },
   "_source":{
      "includes":[
         "fundsymbol",
         "fundsponsor",
         "fundname",
         "componentcount",
         "holdings.componentticker",
         "holdings.weight"
      ],
      "excludes":[



      ]
   }
}

Обратите внимание на приведенный ниже раздел, который является виновником. Все остальное работает как положено. Как я уже упоминал выше, "from" работает должным образом и конвертируется в GTE, как и ожидалось, но "to" не работает, как и "LT" или "LTE" по какой-то странной причине.

               "nested":{
                  "query":{
                     "range":{
                        "holdings.weight":{
                           "from":1.0,
                           "to":2.0,
                           "include_lower":true,
                           "include_upper":true,
                           "boost":1.0
                        }
                     }
                  },

1 Ответ

0 голосов
/ 28 мая 2020

Во-первых, from и to не являются свойствами запроса диапазона. Запрос диапазона ожидает lte, le, gte и ge. Запрос должен выглядеть так:

{
    "query": {
        "nested": {
            "path": "holdings",
            "query": {
                "range": {
                    "holdings.weight": {
                        "gte": 1,
                        "lte": 2
                    }
                }
            }
        }
    }
}

Во-вторых, проверьте сопоставление индекса и убедитесь, что холдинги сопоставлены как nested и что вес сопоставлен как float.

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