Python +ElasticSearch:连接字段的Map器解析异常

xjreopfe  于 2023-01-25  发布在  ElasticSearch
关注(0)|答案(1)|浏览(145)

我正在使用ElasticSearch 8.3.2来存储我的一些数据。这些数据包括代谢物和每个代谢物的几个“研究”,每个研究又包含浓度值。我还使用Python ElasticSearch client来与后端通信,它工作得很好。为了将代谢物与研究相关联,我正在考虑使用here所描述的连接字段。
我定义了这个索引Map:

INDEXMAPPING_MET = {
    "mappings": {
        "properties": {
            "id": {"type": "keyword"},
            "entry_type": {"type": "text"},
            "pc_relation": {
                "type": "join",
                "relations": {
                    "metabolite": "study"
                }
            },
            "concentration": {
                "type": "nested",
            }
        }
    }
}

pc_relation是这里的连接字段,代谢物是每个研究文档的父文档。例如,我可以使用Python客户端创建代谢物条目(父文档

self.client.index(index="metabolitesv2", id=metabolite, body=json.dumps({
                #[... some other fields here]
                "pc_relation": {
                    "name": "metabolite",
                },
            }))

然而,一旦我尝试添加子文档,我会得到一个mapping_parser_exception。值得注意的是,我只在尝试添加pc_relation字段时得到这个异常,任何其他字段都可以正常工作,如果我省略了连接字段,我可以创建文档。下面是我尝试创建的研究文档的一个示例(在同一索引上):

self.client.index(index="metabolitesv2", id=study, body=json.dumps({
                #[... some other fields here]
                "pc_relation": {
                    "name": "study",
                    "parent": metabolite_id
                },
            }))

一开始我认为可能有一些类型问题,但是不幸的是将所有内容都转换为字符串并没有改变结果。我真的很感激任何关于错误可能在哪里的帮助,因为我真的不确定问题是什么-从我可以从官方ES文档和其他Python+ES项目中看出,我真的没有做任何不同。

已尝试:创建具有联接字段的索引、创建父文档、创建与父文档具有联接关系的子文档。预期:创建文档,并可使用has_childhas_parent标签进行查询。结果:尝试创建子文档时出现MappingParserException

qacovj5a

qacovj5a1#

尾巴;

您需要在为子文档建立索引时执行provide a routing value
路由值是必需的,因为父文档和子文档必须在同一个碎片上建立索引
默认情况下,文档的路由值是它的_id,因此实际上,在索引子文档时需要提供父文档的_id

溶液

self.client.index(index="metabolitesv2", id=study, routing=metabolite, body=json.dumps({
    #[... some other fields here]
    "pc_relation": {
        "name": "study",
        "parent": metabolite_id
    },
}))

为了重现

PUT 75224800
{
  "settings": {
    "number_of_shards": 4
  }, 
  "mappings": {
    "properties": {
      "id": {
        "type": "keyword"
      },
      "pc_relation": {
        "type": "join",
        "relations": {
          "metabolite": "study"
        }
      }
    }
  }
}

PUT 75224800/_doc/1
{
  "id": "1",
  "pc_relation": "metabolite"
}

# No routing Id this is going to fail
PUT 75224800/_doc/2
{
  "id": 2,
  "pc_relation":{
    "name": "study",
    "parent": "1"
  }
}

PUT 75224800/_doc/3
{
  "id": "3",
  "pc_relation": "metabolite"
}

PUT 75224800/_doc/4?routing=3
{
  "id": 2,
  "pc_relation":{
    "name": "study",
    "parent": "3"
  }
}

相关问题