Сортировка документов по количеству вложенных детей в ElasticSearch - PullRequest
2 голосов
/ 01 апреля 2020

My Elasticserch index Имя индекса = фильмы

{
   "title": "Chris ENDGAME",
   "cast": [
      {
         "firstName": "Chris",
         "lastName": "Evans"
      },
      {
         "firstName": "Chris",
         "lastName": "Hemsworth"
      },
      {
         "firstName": "Chris",
         "lastName": "Prat"
      }
   ]
} 

Аналогично, У меня есть еще 3 мов ie документов

Фильмы2: Зимний солдат

Состав: Крис Эванс, Скарлетт Джохансон

Фильмы3: Человек-муравей

Состав: Пол Радд, Майкл Пена

Фильмы4: Мстители

Состав: Крис Эванс, Крис Хемсворт

С этим, сейчас у меня 4 фильма: 1. эндшпиль; 2. Зимний Солдат; 3.Ant-Man; 4. Мстители

Теперь Я хочу создать поисковый запросasticsearch7, где, если я буду искать Крис (в целом: и название, и имя) в порядке количество найденных совпадений по индексу.

т. е. OUTPUT (упорядочено) = Movies1, Movies4, Movies2 , потому что movie1 имеет 4, Movies4 имеет 2, а Movies2 имеет 1 совпадение по имени в имени

До сих пор Мне удалось написать базовый c запрос, но я не знаю, как заказать документы

Мой поисковый запрос

{
  "query": {
    "bool": {
      "must": [
        { "multi_match": { "query": "Chris" }}
      ]
    }
  }
}

Как заказать?

1 Ответ

1 голос
/ 01 апреля 2020

Прежде всего, вы должны предоставить вложенное отображение вашего поля «cast»:

PUT test_movies
{
  "mappings": {
    "properties": {
      "cast": {
        "type": "nested", 
        "properties": {
          "firstName": {
            "type": "text",
            "fields": {
              "keyword": {
                "type": "keyword",
                "ignore_above": 256
              }
            }
          },
          "lastName": {
            "type": "text",
            "fields": {
              "keyword": {
                "type": "keyword",
                "ignore_above": 256
              }
            }
          }
        }
      },
      "title": {
        "type": "text",
        "fields": {
          "keyword": {
            "type": "keyword",
            "ignore_above": 256
          }
        }
      }
    }
  }
}

Обратите внимание, что это Elasti c Mapping по умолчанию с ключевым словом и текстом для каждого поля. но лучше всего указывать каждое поле, если это ключевое слово, текст или оба. Кроме того, чтобы изменить отображение индекса, вы должны удалить и воссоздать его

Теперь, когда ваше поле «cast» объявлено как вложенное, вы можете выполнить для него вложенный запрос:

POST test_movies/_search
{
  "query": {
    "nested": {
      "path": "cast",
      "query": {
        "match": {
          "cast.firstName": "Chris"
        }
      },
      "score_mode": "sum"
    }
  }
}

"score_mode": "sum" добавит счет для каждого под-матча в вашем вложенном поле

РЕДАКТИРОВАТЬ

Если вы хотите выполнить поиск по названию и вложенный дочерний элемент, который вы должны составить с помощью bool Query , поэтому ваш запрос будет выглядеть следующим образом:

POST test_movies/_search
{
  "query": {
    "bool": {
      "should": [
        {
          "match": {
            "title": "Chris"
          }
        },
        {
          "nested": {
            "path": "cast",
            "query": {
              "match": {
                "cast.firstName": "Chris"
              }
            },
            "score_mode": "sum"
          }
        }
      ]
    }
  }
}
...