Фильтрация документов по количеству вложенных объектов - PullRequest
0 голосов
/ 06 марта 2019

У меня полный индекс документов со следующей структурой:

{
  name: "The sound and the fury",
  tags: [{ name: "confusing", id: "uuid1"}, {name: "sad", id: "uuid-2"}]
}

Я хочу получить все документы, имеющие более двух тегов.

Я пробовал что-тонапример:

{
 "query": {
 "bool": {
   "must": [
     {
      "script": {
        "script": "doc['tags'].value.size() == 1"
      }
     }
   ]
  }
 }
}

Но я получаю ошибку сценария: No field found for [tags] in mapping with types.Я получаю ту же ошибку со скриптом "doc['tags'].size() == 1"

Я использую эластичный поиск 5.6;производительность не является проблемой, так как я использую это для целей отладки и тестирования.

Ответы [ 2 ]

2 голосов
/ 07 марта 2019

как упомянул Пари Раджарам, вам нужно обновить отображение. Однако я бы использовал другой подход, то есть сопоставление tags.id с типом ключевого слова (ИМХО, лучший тип данных для идентификатора).

Таким образом, ваш запрос будет выглядеть так:

{
  "query": {
    "bool": {
      "must": {
        "script": {
          "script": "doc['tags.id'].size() == 1"
        }
      }
    }
  }
}
1 голос
/ 06 марта 2019

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

   put your_index_name/_mapping/doc
    {
       "properties": {
          "name": {
            "type": "text",
            "fields": {
              "keyword": {
                "type": "keyword",
                "ignore_above": 256
              }
            }
          },
          "tags": {
            "properties": {
              "id": {
                "type": "text",
                "fielddata":true,
                "fields": {
                  "keyword": {
                    "type": "keyword",
                    "ignore_above": 256
                  }
                }
              },
              "name": {
                "type": "text","fielddata":true,
                "fields": {
                  "keyword": {
                    "type": "keyword",
                    "ignore_above": 256
                  }
                }
              }
            }
          }
        }
}

и используйте следующий запрос

get your_index_name/_search
{ 
"query": {
 "bool": {
   "must": [
     {
      "script": {
        "script": "doc['tags.value'].length > 2"
      }
     }
   ]
  }
 }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...