ElasticSearch извлекает только те элементы списка, которые соответствуют термину в одном документе - PullRequest
0 голосов
/ 25 марта 2020

Учитывая эту структуру документа.

{
   "title":"Lord of the rings",
   "id":"123abc",
   "pages":[
      {
         "pageNumber":1,
         "content":"Lorem ipsum lorem ipsum lorem ipsum"
      },
      {
         "pageNumber":2,
         "content":"dolor sit dolor sit dolor sit"
      }
   ]
}

и этот запрос

{
   "query":{
      "match":{
         "pages.content":"lorem"
      }
   }
}

Есть ли способ, что elasti c может дать мне что-то подобное в результате:

{
   "title":"Lord of the rings",
   "id":"123abc",
   "pages":[
      {
         "pageNumber":1,
         "content":"Lorem ipsum lorem ipsum lorem ipsum"
      }
   ]
}

Так что, если у меня есть сотни страниц, я получу только те, которые соответствуют моему термину?

Я думаю о создании индекса для страниц, но как мне получить все метаданные из документа? Должны ли эти метаданные быть скопированы во все страницы документа из одной и той же «книги», скажем? Каков наилучший подход с точки зрения производительности?

1 Ответ

0 голосов
/ 25 марта 2020

Да, документы с общими метаданными вполне нормальны (и часто необходимы) в хранилищах данных No SQL. Что касается альтернативного подхода, вы можете использовать выделение или даже некоторые безболезненные сценарии , но я бы порекомендовал что-то вроде:

POST pages/_doc
{
  "book": {
    "title": "Lord of the rings",
    "id": "123abc",
    "metadata": {
      "num_of_pages": 300
    }
  },
  "page": {
    "pageNumber": 1,
    "content": "Lorem ipsum lorem ipsum lorem ipsum"
  }
}

POST pages/_doc
{
  "book": {
    "title": "Lord of the rings",
    "id": "123abc",
    "metadata": {
      "num_of_pages": 300
    }
  },
  "page": {
    "pageNumber": 2,
    "content": "dolor sit dolor sit dolor sit"
  }
}

И затем

GET pages/_search
{
  "query": {
    "match": {
      "page.content": "lorem"
    }
  }
}

, что намного проще и достаточно хорошо масштабируется.

...