flattened:比如你有一个字段的值是一个json,这个json里面又有很多字段,你又不想一个一个的定义这些字段到mapping,就可以用flattened
直接动手:创建索引:
PUT person
{
"mappings": {
"properties": {
"patient_name": {
"type": "text"
},
"detail": {
"type": "flattened"
}
}
}
}
注意这里details字段类型为flattened, 然后插入文档:
PUT person/_doc/1
{
"patient_name": "John Doe",
"detail": {
"age": 143,
"skills": [
"java",
"python",
"ai"
],
"history": "none",
"friends": [
"Neo",
"James",
"Tony Stark"
]
}
}
然后搜索:
GET person/_search
{
"query": {
"match": {
"detail": "java"
}
}
}
注意这里直接搜索detail,可以搜索到我们刚刚插入的那个文档,但是我们也可以搜索detail.skills,比如
"detail.skills": "java"
也能搜索到那个文档,但是如果我们这样搜索就搜索不到:
"detail.friends": "java"
还有一点,这里的每个字段会被定义成keyword类型,所以你如果这样搜索就搜索不到:
"detail.friends": "Tony"
你必须完全匹配才能搜索的到:
"detail.friends": "Tony Stark"
再来看看join类型,说的是一个索引里面一个文档和其他几个文档有关联,比如几个文档的父文档都是那一个文档,动手:
先创建索引:
PUT person2
{
"mappings": {
"properties": {
"relationship": {
"type": "join",
"relations": {
"star": "fans"
}
}
}
}
}
这里relationship是一个字段名,类型是join,指的明星和粉丝的关系,所以里面有一个类型的参数relations,它的取值star:fans分别表示父和子的关联类型,后面会用到。
插入文档,首先入场的当然是我们的坤坤:
PUT person2/_doc/1
{
"name": "August Kun",
"relationship": {
"name": "star"
}
}
这里的relationship.name是star,这个值是在前面mapping里面定义的,前面提到过,如果你写个super_star,就会报错:
unknown join name [doctor2] for field [relationship]
然后来个小黑子:
PUT person2/_doc/2?routing=tony
{
"name":"小黑子",
"relationship":{
"name":"fans",
"parent":1
}
}
注意这里有个routing参数,如果插入子文档的时候没有指定routing是会报错的,这是为了将相关的文档分配到相同的分片,比如后面插入第二个子文档真爱粉的时候也指定相同的路由参数值。
[routing] is missing for join field [relationship]
还有这里的relationship.name是fans,也是在前面mapping里面定义的。
指定parent是1,就确定了父子文档的关系。
最后就是真爱粉了,插入第二个子文档:
PUT person2/_doc/3?routing=tony
{
"name":"爱坤",
"relationship":{
"name":"fans",
"parent":1
}
}
路由参数一样,下面查询:
GET person2/_search
{
"query": {
"parent_id": {
"type": "fans",
"id": 1
}
}
}
可以查到两个子文档,两个粉丝,但是不包括父文档坤坤:
"hits" : \[
{
..."\_routing" : "tony",
"\_source" : {
"name" : "小黑子",
"relationship" : {
"name" : "fans",
"parent" : 1
}
}
},
{
..."\_routing" : "tony",
"\_source" : {
"name" : "爱坤",
"relationship" : {
"name" : "fans",
"parent" : 1
}
}
}
如果插入第二个子文档的时候指定路由参数是neo,也可以搜索到两个子文档,不影响搜索,但不建议这样做。
PUT person2/_doc/3?routing=neo
还有要注意的是如果查询的时候,指定parent_id.type为star会报错:
GET person2/_search
{
"query": {
"parent_id": {
"type": "star",
"id": 1
}
}
}
报错如下:
[parent_id] no relation found for child [star]
也就是说这里要指定的是子文档的关联类型
手机扫一扫
移动阅读更方便
你可能感兴趣的文章