Как создать соединение ElasticSearch для столбца UUID? - PullRequest
0 голосов
/ 11 декабря 2018

Я пытаюсь создать соединение ElasticSearch между двумя таблицами, используя поле UUID.

Моя основная таблица выглядит примерно так:

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
}

Есть ли способ обойти эту ошибку?Я не хочу использовать list<text> для своих UUID.

Обратите внимание, что я протестировал и изменил тип столбца на 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 ИНФОРМАЦИЯ [главная] StorageService.java:618 initServer Cassandraверсия: 3.11.3
2018-12-03 18: 17: 18 556 ИНФОРМАЦИЯ [главная] StorageService.java:619 версия API-интерфейса initServer Thrift: 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 INFO [main] StorageService.java:622 initServer Поддерживаемые версии собственного протокола:3 / v3, 4 / v4, 5 / v5-бета (по умолчанию: 4 / v4)
elassandra-6.2.3.7.tar.gz

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...