ElasticSearch只检索与单个文档中的术语匹配的列表元素



给定此文档结构。

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

所以,如果我有数百页,我只会得到与我的任期相匹配的页面?

我想为页面创建一个索引,但我如何从文档中获取所有元数据?是否应该将这些元数据复制到同一本"书"中的所有页面文档中?就性能而言,最好的方法是什么?

是的,文档共享一些公共元数据在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"
}
}
}

这要简单得多&规模相当不错。

最新更新