безболезненно: проверьте, содержит ли отдельный документ ключ - PullRequest
0 голосов
/ 24 ноября 2018

Я использую безболезненно для фильтрации документов с Elastic 5.5

Проблема

Используя "безболезненно", найдите документы с полем strings.

Ожидаемые результаты

Возвращаются только документы с полем strings

Фактические результаты

Все документы возвращаются.

Наблюдение

Все документы возвращаются, если есть документ с полем strings.Это может быть проблема с кэшированием.

TestCase

Fixtures

PUT /test_idx

POST /test_idx/t/1
{
      "strings": ["hello", "world"]
}

POST /test_idx/t/2
{
      "numbers": [1, 2, 3]
}

Запрос

GET /test_idx/_search
{
   "query": {
      "bool": {
         "filter": [
            {
               "script": {
                  "script": {
                     "lang": "painless",
                     "inline": "return doc.containsKey(params.keypath)",
                     "params": {"keypath": "strings"}
                  }
               }
            }
         ]
      }
   }
}

Фактический ответ

{
   "took": 5,
   "timed_out": false,
   "_shards": {
      "total": 5,
      "successful": 5,
      "failed": 0
   },
   "hits": {
      "total": 2,
      "max_score": 0,
      "hits": [
         {
            "_index": "test_idx",
            "_type": "t",
            "_id": "2",
            "_score": 0,
            "_source": {
               "numbers": [
                  1,
                  2,
                  3
               ]
            }
         },
         {
            "_index": "test_idx",
            "_type": "t",
            "_id": "1",
            "_score": 0,
            "_source": {
               "strings": [
                  "hello",
                  "world"
               ]
            }
         }
      ]
   }
}

Ожидаемый ответ

{
   "took": 5,
   "timed_out": false,
   "_shards": {
      "total": 5,
      "successful": 5,
      "failed": 0
   },
   "hits": {
      "total": 2,
      "max_score": 0,
      "hits": [
         {
            "_index": "test_idx",
            "_type": "t",
            "_id": "1",
            "_score": 0,
            "_source": {
               "strings": [
                  "hello",
                  "world"
               ]
            }
         }
      ]
   }
}

Ответы [ 2 ]

0 голосов
/ 24 ноября 2018

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

GET /test_idx/_search
{
  "query": {
    "bool": {
      "filter": [
        {
          "script": {
            "script": {
              "lang": "painless",
              "inline": "return doc[params.keypath].value != null",
              "params": {
                "keypath": "strings.keyword"
              }
            }
          }
        }
      ]
    }
  }
}
0 голосов
/ 24 ноября 2018

Почему вы требуете безболезненно сделать это?Это можно легко сделать с помощью существует запроса

{
  "query": {
    "exists": {
      "field": "strings"
    }
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...