嵌套文档

父子文档

7.5 官方文档
父子文档,只是使用一个 join 类型属性来描述,并在参数 relations 中定义父子关系。

使用父子文档,一定要留意索引的主分片数,当只有一个主分片,后续的路由参数空缺也没问题,但多于两个主分片,就不行了。

定义Mapping

  1. PUT my-index-000001
  2. {
  3. "mappings": {
  4. "properties": {
  5. "my_id": {
  6. "type": "keyword"
  7. },
  8. "my_join_field": {
  9. // 重点
  10. "type": "join",
  11. "relations": {
  12. "question": "answer"
  13. }
  14. }
  15. }
  16. }
  17. }
  1. my_join_field父子关系字段名,自定义,一个文档最多只有一个
  2. 类型为 join,标志父子文档
  3. relations 父子文档结构,可有多个

索引父文档

索引副文档时两种方式等价

  1. PUT my-index-000001/_doc/1?refresh
  2. {
  3. "my_id": "1",
  4. "text": "This is a question",
  5. "my_join_field": {
  6. "name": "question"
  7. }
  8. }
  9. PUT my-index-000001/_doc/1?refresh
  10. {
  11. "my_id": "1",
  12. "text": "This is a question",
  13. "my_join_field": "question"
  14. }

索引子文档

  1. PUT my-index-000001/_doc/3?routing=1&refresh
  2. {
  3. "my_id": "3",
  4. "text": "This is an answer",
  5. "my_join_field": {
  6. "name": "answer",
  7. "parent": "1"
  8. }
  9. }
  1. 强制指定路由值,就是父文档id,确保父文档、子文档都在同一个分片上
  2. 在_source 中描述 join类型字段的子文档名称
  3. 同上,指定关联父文档id

搜索子文档

通过子文档id查询,需要指定路由

a1子文档id
q1路由 ->父文档id

  1. GET '120.78.207.190:9200/my-index-000001/_doc/a1?routing=q1'

通过父文档id查询所有关联的子文档

  1. GET my-index-000001/_search
  2. {
  3. "query": {
  4. "parent_id": {
  5. "type": "answer",
  6. "id":1
  7. }
  8. }
  9. }

父文档条件 has_parent 查询

  1. GET my-index-000001/_search
  2. {
  3. "query": {
  4. "has_parent": {
  5. "parent_type": "question",
  6. "query": {
  7. "match" : {
  8. "my_id": "q1"
  9. }
  10. }
  11. }
  12. }
  13. }

搜索父文档

子条件 has_child 查询

  1. GET my-index-000001/_search
  2. {
  3. "query": {
  4. "has_child": {
  5. "type": "answer",
  6. "query": {
  7. "match" : {
  8. "my_id": "a1"
  9. }
  10. }
  11. }
  12. }
  13. }

反规范化