- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我需要索引 3 个级别(或更多)的子级-父级。例如,级别可能是一位作者、一本书和那本书中的角色。
但是,当索引超过两层时,has_child 和 has_parent 查询和过滤器会出现问题。如果我有 5 个分片,在最低级别(字符)上运行“has_parent”查询或在第二级(书籍)上运行 has_child 查询时,我会得到大约五分之一的结果。
我的猜测是,一本书通过它的父 ID 被索引到一个分片,因此将与他的父(作者)一起驻留,但是一个角色被索引到一个基于书 ID 的散列的分片,这不会必须符合为该书编制索引的实际分片。
因此,这意味着同一作者的书籍的所有字符不一定都位于同一个分片中(这确实削弱了整个父子优势)。
我做错了什么吗?我该如何解决这个问题,因为我确实需要复杂的查询,例如“哪些作者用女性角色写过书”。
我发疯了一个显示问题的要点,在: https://gist.github.com/eranid/5299628
底线是,如果我有一个映射:
"author" : {
"properties" : {
"name" : {
"type" : "string"
}
}
},
"book" : {
"_parent" : {
"type" : "author"
},
"properties" : {
"title" : {
"type" : "string"
}
}
},
"character" : {
"_parent" : {
"type" : "book"
},
"properties" : {
"name" : {
"type" : "string"
}
}
}
和一个 5 分片索引,我不能用“has_child”和“has_parent”进行查询
查询:
curl -XPOST 'http://localhost:9200/index1/character/_search?pretty=true' -d '{
"query": {
"bool": {
"must": [
{
"has_parent": {
"parent_type": "book",
"query": {
"match_all": {}
}
}
}
]
}
}
}'
只返回五分之一(大约)的字符。
最佳答案
你是对的,父/子关系只有在给定父项的所有子项都与父项位于同一分片中时才有效。 Elasticsearch 通过使用 parent id 作为路由值来实现这一点。它在一个层面上运作良好。但是,它在第二个和连续的级别上中断。当你有父/子/孙关系时, parent 根据他们的 id 进行路由, child 根据父 id 进行路由(有效),但是孙子根据 child id 进行路由,他们最终会进入错误的分片。为了在示例中进行演示,假设我们正在索引 3 个文档:
curl -XPUT localhost:9200/test-idx/author/Douglas-Adams -d '{...}'
curl -XPUT localhost:9200/test-idx/book/Mostly-Harmless?parent=Douglas-Adams -d '{...}'
curl -XPUT localhost:9200/test-idx/character/Arthur-Dent?parent=Mostly-Harmless -d '{...}'
Elasticsearch 使用值 Douglas-Adams
来计算文档 Douglas-Adams
的路由 - 这并不奇怪。对于文档 MoSTLy-Harmless
,Elasticsearch 发现它有父级 Douglas-Adams
,因此它再次使用 Douglas-Adams
来计算路由和所有内容很好——相同的路由值意味着相同的分片。但是对于文档 Arthur-Dent
Elasticsearch 发现它有父级 MoSTLy-Harmless
,所以它使用值 MoSTLy-Harmless
作为路由和结果文档 Arthur-Dent
最终出现在错误的分片中。
解决方案是明确指定孙子的路由值等于祖 parent 的 id:
curl -XPUT localhost:9200/test-idx/author/Douglas-Adams -d '{...}'
curl -XPUT localhost:9200/test-idx/book/Mostly-Harmless?parent=Douglas-Adams -d '{...}'
curl -XPUT localhost:9200/test-idx/character/Arthur-Dent?parent=Mostly-Harmless&routing=Douglas-Adams -d '{...}'
关于Elasticsearch更深层次的亲子关系(孙子),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15783420/
我是一名优秀的程序员,十分优秀!