Тип соединения ElasticSearch: всегда возвращать родительский документ - PullRequest
0 голосов
/ 05 ноября 2019

Я пытаюсь создать запрос, включающий соединение has_parent. Я запрашиваю 2 типа документов, и важно отметить, что я хочу, чтобы всегда родитель включал в возвращаемый документ. Я пытаюсь сделать это с помощью inner_hits, но не могу достичь этого в сочетании с выделением:

DELETE /my_index

PUT my_index
{
  "mappings": {
    "properties": {
      "name": {
        "type": "text"
      },
      "cc": { 
        "type": "join",
        "relations": {
          "company": "employee" 
        }
      }
    }
  }
}

PUT my_index/_doc/1?refresh
{
  "name": "Walmart",
  "cc": "company" 
}

PUT my_index/_doc/2?routing=1&refresh
{
  "name": "Smith",
  "cc": {
    "name": "employee", 
    "parent": "1" 
  }
}

POST /my_index/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "bool": {
            "should": [
              {
                "query_string": {
                  "default_operator": "and",
                  "fields": [
                    "name"
                  ],
                  "query": "Walmart"
                }
              },
              {
                "has_parent": {
                  "inner_hits": {
                    "highlight": {
                      "fields": {
                        "name": {
                          "number_of_fragments": 20,
                          "type": "plain"
                        }
                      }
                    }
                  },
                  "parent_type": "company",
                  "query": {
                    "bool": {
                      "should": [
                        {
                          "query_string": {
                            "fields": [
                              "name"
                            ],
                            "query": "Walmart"
                          }
                        }
                      ]
                    }
                  }
                }
              }
            ]
          }
        },
        {
          "has_parent": {
            "parent_type": "company",
            "query": {
              "match_all": {}
            }
          }
        }
      ]
    }
  }
}

Когда я нахожу сотрудника по названию компании ( Walmart ), inner_hitsвыглядит как ожидалось:

...
"inner_hits" : {
  "company" : {
    "hits" : {
      "total" : {
        "value" : 1,
        "relation" : "eq"
      },
      "max_score" : 0.6931472,
      "hits" : [
        {
          "_index" : "my_index",
          "_type" : "_doc",
          "_id" : "1",
          "_score" : 0.6931472,
          "_source" : {
            "name" : "Walmart",
            "cc" : "company"
          },
          "highlight" : {
            "name" : [
              "<em>Walmart</em>"
            ]
          }
        }
      ]
    }
  }
}
...

Когда я нахожу сотрудника по имени сотрудника ( Смит ), inner_hits не заполняется:

...
"inner_hits" : {
  "company" : {
    "hits" : {
      "total" : {
        "value" : 0,
        "relation" : "eq"
      },
      "max_score" : null,
      "hits" : [ ]
    }
  }
}
...

Я знаючто я мог бы добавить inner_hits при внешнем соединении has_parent (чтобы ограничить результаты типом emnployee), но я теряю результаты выделения. И добавление inner_hits к обоим has_parent объединениям, заканчивающимся исключением. Что я могу сделать, чтобы всегда получить полный родительский документ (с выделением по требованию)?

Я использую ElasticSearch 7.2

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