Как работать с фильтром в шаблоне elasticsearch? - PullRequest
2 голосов
/ 06 мая 2020

У меня есть аналогичный набор данных для работы с Elasticsearch.

  {
    "id" :1,
    "title" : "Toy Story 1",
    "year" : 1995 ,
    "category" : "Adventure"
    },
    {
    "id" :2,
    "title" : "Jumanji",
    "year" : 1995,
    "category" : "Adventure"
    },
    {
    "id" :3,
    "title" : "Grumpier Old Men",
    "year" : 1996,
    "category" : "Comedy"
    },
    {
    "id" :4,
    "title" : "Toy Story 2",
    "year" : 1996,
    "category" : "Action"
    },
    {
    "id" :5,
    "title" : "Toy Story 3"
    "year" : 1997
    "category" : "Comedy"
    },
    {
    "id" :6,
    "title" : "Toy Story 4"
    "year" : 2019
    "category" : "Comedy"
    }

Вот отображение для моего индекса.

{
    "movies": {
        "mappings": {
            "properties": {
                "category": {
                    "type": "text",
                    "fields": {
                        "keyword": {
                            "type": "keyword",
                            "ignore_above": 256
                        }
                    }
                },
                "id": {
                    "type": "text",
                    "fields": {
                        "keyword": {
                            "type": "keyword",
                            "ignore_above": 256
                        }
                    }
                },
                "title": {
                    "type": "text",
                    "fields": {
                        "keyword": {
                            "type": "keyword",
                            "ignore_above": 256
                        }
                    }
                },
                "year": {
                    "type": "text",
                    "fields": {
                        "keyword": {
                            "type": "keyword",
                            "ignore_above": 256
                        }
                    }
                }
            }
        }
    }
}

Я использую шаблон поиска для получения данных. Я создал шаблон и запрашиваю данные, передав идентификатор шаблона.

Вы можете найти то же самое по приведенной ниже ссылке. Search-template

Я использую почтальона для создания шаблона и запроса данных с помощью шаблона.

Я создал шаблон, как показано ниже:

POST _scripts / test

{
    "script": {
        "lang": "mustache",
        "source": {
            "query": {
                "match": {
                    "title": "{{query_string}}"
                }
            }
        }
    }
}

POST _search / template

{
    "id": "test", 
    "params": {
        "query_string": "toy"
    }
}

Это работает нормально. Я получаю ожидаемый результат.

Теперь я застрял с опцией фильтрации в шаблоне.

Я хочу выполнить фильтрацию по категории. Я хочу добавить категорию в шаблон и передать значения как ["Comedy", "Adventure"]

Как мы можем добавить фильтры в шаблон и передать ему значения массива?

1 Ответ

2 голосов
/ 06 мая 2020

Вы можете сделать это так. Сначала измените шаблон сценария следующим образом:

POST _scripts/test
{
  "script": {
    "lang": "mustache",
    "source": """
      {
        "query": {
          "bool": {
            "must": [
              {
                "match": {
                  "title": "{{query_string}}"
                }
              }
            ],
            "filter": [
              {
                "terms": {
                  "category.keyword": {{#toJson}}categories{{/toJson}}
                }
              }
            ]
          }
        }
      }
    """
  }
}

Обратите внимание, что приведенное выше может быть выполнено только внутри Kibana Dev Tools (из-за тройных кавычек (""").

Если вы ' Если вы выполняете это где-то еще, вам нужно сначала JSON -кодировать запрос:

POST _scripts/test
{
  "script": {
    "lang": "mustache",
    "source": "{\n      \"query\": {\n        \"bool\": {\n          \"must\": [\n            {\n              \"match\": {\n                \"title\": \"{{query_string}}\"\n              }\n            }\n          ],\n          \"filter\": [\n            {\n              \"terms\": {\n                \"category.keyword\": {{#toJson}}categories{{\/toJson}}\n              }\n            }\n          ]\n        }\n      }\n    }"
  }
}

Затем вы можете назвать его так:

POST _search/template
{
  "id": "test",
  "params": {
    "query_string": "toy",
    "categories": [
      "Comedy",
      "Adventure"
    ]
  }
}

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

{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "title": "toy"
          }
        }
      ],
      "filter": [
        {
          "terms": {
            "category": [
              "Comedy",
              "Adventure"
            ]
          }
        }
      ]
    }
  }
}
...