0

鉴于此文档结构。

{
   "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"
      }
   }
}

有没有办法弹性可以给我这样的结果:

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

因此,如果我有数百页,我只会得到与我的术语相匹配的那些?

我虽然想为页面创建索引,但是如何从文档中获取所有元数据?可以说,是否应该将此元数据复制到同一“书”的所有页面文档中?就性能而言,最好的方法是什么?

4

1 回答 1

0

是的,共享一些通用元数据的文档在 NoSQL 数据存储中是很正常的(而且通常是必要的)。至于另一种方法,您可以使用突出显示甚至是一些无痛的脚本,但我建议使用以下内容:

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"
    }
  }
}

这更简单并且可以很好地扩展。

于 2020-03-25T01:00:14.220 回答