如何在UUID列上创建ElasticSearch联接?

时间:2018-12-11 02:37:52

标签: elasticsearch join indexing lucene

我正在尝试使用UUID字段在两个表之间创建ElasticSearch联接。

我的主表如下所示:

CREATE TABLE main_table (
    id UUID PRIMARY KEY,
    ...other fields...
);

子表包括对主表的引用:

CREATE TABLE child_table (
    child_id UUID PRIMARY KEY,
    main_id UUID,
    ...other fields...
);

我使用Elassandra构建表和索引,尽管在这里我展示了curl -XPUT ...命令,因为我也可以用这种方式重现该问题(所以问题不在Elassandra或express-cassandra中):

curl -XPUT \
    -H 'Content-Type: application/json' \
    "http://127.0.0.1:9200/my_workspace_main_table/?pretty" \
    -d '{
        "settings": {
            "keyspace": "'my_workspace'",
            "index": {
                "number_of_shards": 1
            }
       },
        "index": {
            "number_of_shards": 1
        }
    }'

# NOTE: In my script I sleep for a little while here to make sure
#       the index is built or I get a 404 Index Not Found error

现在我们有了索引,我们可以使用另一个PUT构建映射,如下所示:

curl -XPUT \
    --max-time 3600 \
    -H 'Content-Type: application/json' \
    "http://127.0.0.1:9200/my_workspace_main_table/_mapping/main_table/?pretty" \
    -d '{
        "properties": {
            "id": {
                "type": "join",
                "relations": {
                    "question": "parent_id"
                },
                "eager_global_ordinals": true
            }
        }
    }'

在这里,我将类型设置为"join",这意味着我无法为列指定"cql_collection": "singleton"因此,我收到一个错误:

{
  "error" : {
    "root_cause" : [
      {
        "type" : "i_o_exception",
        "reason" : "Existing column [id] type [uuid] mismatch with inferred type [list<text>]"
      }
    ],
    "type" : "i_o_exception",
    "reason" : "Existing column [id] type [uuid] mismatch with inferred type [list<text>]",
    "caused_by" : {
      "type" : "i_o_exception",
      "reason" : "Existing column [id] type [uuid] mismatch with inferred type [list<text>]"
    }
  },
  "status" : 500
}

是否有办法绕过此错误?我不想为我的UUID使用list<text>

请注意,我已测试并将列类型更改为list<text>即可完成工作,当我这样做时,将获得以下映射:

{
  "my_workspace_t16" : {
    "mappings" : {
      "my_table" : {
        "properties" : {
          "id" : {
            "type" : "join",
            "eager_global_ordinals" : true,
            "relations" : {
              "question" : "parent_id"
            }
          }
        }
      }
    }
  }
}

如果您知道这种奇怪的推断类型背后的原因(如果您问我,),我将很高兴听到。解释该选择的页面链接非常棒。


我也使用keyword类型进行了测试,并且可以正常使用以下功能,但是我没有加入,对吗?

curl -XPUT \
    --max-time 3600 \
    -H 'Content-Type: application/json' \
    "http://127.0.0.1:9200/my_workspace_main_table/_mapping/main_table/?pretty" \
    -d '{
        "properties": {
            "id": {
                "type": "keyword",
                "cql_collection": "singleton"
            }
        }
    }'

重要的版本信息。

  

2018-12-03 18:17:18,555信息[main] StorageService.java:618 initServer Cassandra版本:3.11.3
  2018-12-03 18:17:18,556 INFO [main] StorageService.java:619 initServer Thrift API版本:20.1.0
  2018-12-03 18:17:18,561信息[main] StorageService.java:620 initServer CQL支持的版本:3.4.4(默认:3.4.4)
  2018-12-03 18:17:18,562信息[main] StorageService.java:622 initServer本机协议支持的版本:3 / v3、4 / v4、5 / v5-beta(默认:4 / v4)
  elassandra-6.2.3.7.ta​​r.gz

0 个答案:

没有答案