Elasticsearch - исключение детей из документов с полем соединения - PullRequest
1 голос
/ 12 июня 2019

Итак, я настроил индекс со следующим отображением:

PUT test_index
{
  "mappings": {
    "doc": {
      "properties": {
        "title": {
          "type": "text"
        },
        "author": {
          "type": "text"
        },
        "reader_stats": {
          "type": "join",
          "relations": {
            "book": "reader"
          }
        }
      }
    }
  }
}

каждый родительский документ представляет книгу, а его дочерние элементы представляют читателя этой книги.Однако, если бы мне нужно было выполнить:

GET test_index/_search
{
  "query":{"match_all":{}}
}

Результаты будут заполнены как книгами, так и читателями, например так:

"hits" : [
  {
    "_index" : "test_index",
    "_type" : "doc",
    "_id" : "2",
    "_score" : 1.0,
    "_source" : {
      "title" : "my second book",
      "author" : "mr author",
      "reader_stats" : {
        "name" : "book"
      }
    }
  },
  {
    "_index" : "test_index",
    "_type" : "doc",
    "_id" : "7",
    "_score" : 1.0,
    "_routing" : "2",
    "_source" : {
      "name" : "michael bookworm",
      "clicks" : 1,
      "reader_stats" : {
        "name" : "reader",
        "parent" : 2
      }
    }
  }
]

Есть ли способ исключить документы читателя и толькопоказать книги?Я уже использовал match_all в своем приложении для захвата книг, так что было бы хорошо, если бы я мог избежать необходимости изменять этот запрос, но я полагаю, что это невозможно.

Также я немного запутался относительно того, как сопоставления работают собъединить поля, так как нет определения того, какие поля требуются от дочерних документов.Например, в моем отображении нигде не указано, что документы «для чтения» должны иметь поля «имя» и «клики».Это правильно?

1 Ответ

1 голос
/ 14 июня 2019

Вам необходимо использовать ключевые слова has_child (для поиска только родительских документов) и has_parent (для поиска только дочерних документов).

Можно ли каким-то образом исключить документы читателя и показывать толькокниги?

  • ДА

Ваш запрос будет:

GET test_index/_search
{
  "query": {
  "has_child": {
  "type": "reader",
  "query": {
    "match_all": {}
   }
  }
 }
}

Более подробную информацию вы можете посмотреть здесь:https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-has-child-query.html

...