Фильтрация и сортировка на основе атрибутов в документе поиска терминов в Elastic Search - PullRequest
0 голосов
/ 19 сентября 2019

У меня есть некоторые документы в моем индексе:

POST "/index/thing/_bulk" -s -d'
    { "index":{ "_id": 1 } }
    { "title":"One thing"}
    { "index":{ "_id": 2 } }
    { "title":"Second thing"}
    { "index":{ "_id": 3 } }
    { "title":"Three things"}
    { "index":{ "_id": 4 } }
    { "title":"And so fourth"}
    { "index":{ "_id": 5 } }
    { "title":"Five things"}
'

У меня также есть документы, которые содержат пользователей collection, которые связаны с другими документами (вещами) через атрибут документов id, например, так:

PUT /index/collection/1
{
    "items": [
        {"id": 1, "time_added": "2017-08-07T09:07:15.000Z", "condition": "fair"},
        {"id": 3, "time_added": "2019-08-07T09:07:15.000Z", "condition": "good"},
        {"id": 4, "time_added": "2016-08-07T09:07:15.000Z", "condition": "poor"}
    ]
}

Затем я использую поиск терминов , чтобы получить все вещи в коллекции пользователей, например, так:

GET /documents/_search
{
    "query" : {
        "terms" : {
            "_id" : {
                "index" : "index",
                "type" : "collection",
                "id" : 1,
                "path" : "items.id"
            }
        }
    }
}

Это прекрасно работает.Я получаю три документа в коллекции и могу искать, сортировать и использовать агрегации так, как я хочу.

Но есть ли способ агрегировать, фильтровать и сортировать эти документы на основе атрибутов (time_added или condition в данном случае) в документе collection?Скажем, я хотел отсортировать по time_added или фильтру по condition=="good" из коллекции?

Может быть, скрипт, который можно применить к collection, чтобы отсортировать или отфильтровать там элементы?Такое ощущение, что это очень похоже на sql, как левое соединение, так что, может быть, Elastic Search - не тот инструмент?

1 Ответ

0 голосов
/ 19 сентября 2019

Похоже, вам нужен вложенный тип данных

. Например, ваши данные:

Без вложенного типа :

POST collection/_bulk?filter_path=_
{"index":{}}
{"items":[{"id":11,"time_added":"2017-08-07T09:07:15.000Z","condition":"fair"},{"id":13,"time_added":"2019-08-07T09:07:15.000Z","condition":"good"},{"id":14,"time_added":"2016-08-07T09:07:15.000Z","condition":"poor"}]}
{"index":{}}
{"items":[{"id":21,"time_added":"2017-09-07T09:07:15.000Z","condition":"fair"},{"id":23,"time_added":"2019-09-07T09:07:15.000Z","condition":"good"},{"id":24,"time_added":"2016-09-07T09:07:15.000Z","condition":"poor"}]}
{"index":{}}
{"items":[{"id":31,"time_added":"2017-10-07T09:07:15.000Z","condition":"fair"},{"id":33,"time_added":"2019-10-07T09:07:15.000Z","condition":"good"},{"id":34,"time_added":"2016-10-07T09:07:15.000Z","condition":"poor"}]}
{"index":{}}
{"items":[{"id":41,"time_added":"2017-11-07T09:07:15.000Z","condition":"fair"},{"id":43,"time_added":"2019-11-07T09:07:15.000Z","condition":"good"},{"id":44,"time_added":"2016-11-07T09:07:15.000Z","condition":"poor"}]}
{"index":{}}
{"items":[{"id":51,"time_added":"2017-12-07T09:07:15.000Z","condition":"fair"},{"id":53,"time_added":"2019-12-07T09:07:15.000Z","condition":"good"},{"id":54,"time_added":"2016-12-07T09:07:15.000Z","condition":"poor"}]}

Запрос (вы получили бы неправильные результаты - ожидаемый, получил пять):

GET collection/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "term": {
            "items.condition": {
              "value": "good"
            }
          }
        },
        {
          "range": {
            "items.time_added": {
              "lte": "2019-09-01"
            }
          }
        }
      ]
    }
  }
}

Агрегация (неверные результаты - посмотрите на первое ведро "2016-08-01T00:00:00.000Z" - оно содержит 3 CONDITION вложенные области с каждым типом условия)

GET collection/_search
{
  "size": 0,
  "aggs": {
    "DATE": {
      "date_histogram": {
        "field": "items.time_added",
        "calendar_interval": "month"
      },
      "aggs": {
        "CONDITION": {
          "terms": {
            "field": "items.condition.keyword",
            "size": 10
          }
        }
      }
    }
  }
}

С вложенным типом

DELETE collection

PUT collection
{
  "mappings": {
    "properties": {
      "items": {
        "type": "nested"
      }
    }
  }
}

# and POST the same data from above

Запрос (возвращает только один результат)

GET collection/_search
{
  "query": {
    "nested": {
      "path": "items",
      "query": {
        "bool": {
          "must": [
            {
              "term": {
                "items.condition": {
                  "value": "good"
                }
              }
            },
            {
              "range": {
                "items.time_added": {
                  "lte": "2019-09-01"
                }
              }
            }
          ]
        }
      }
    }
  }
}

Агрегация (первый блок данных содержит только один CONDITION субкадр)

GET collection/_search
{
  "size": 0,
  "aggs": {
    "ITEMS": {
      "nested": {
        "path": "items"
      },
      "aggs": {
        "DATE": {
          "date_histogram": {
            "field": "items.time_added",
            "calendar_interval": "month"
          },
          "aggs": {
            "CONDITION": {
              "terms": {
                "field": "items.condition.keyword",
                "size": 10
              }
            }
          }
        }
      }
    }
  }
}

Надеюсь, это поможет:)

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