Help us understand the problem. What is going on with this article?

pgroongaでレコードを更新するとgroongaインデクスには多重で登録されてるくさい(解決しました。

More than 1 year has passed since last update.

下記のようなテーブル

CREATE TABLE "test_data" (
    "id" serial NOT NULL PRIMARY KEY,
    "some_value" integer NOT NULL,
    "some_flg" boolean NOT NULL
);
CREATE INDEX "pgroonga_test_index" ON "test_data" USING pgroonga ("id","some_value","some_flg");

下記のようなレコードを登録する

INSERT INTO test_data VALUES(1,1,'t');
INSERT INTO test_data VALUES(2,2,'f');
INSERT INTO test_data VALUES(5,5,'f');

とりあえずSELECT

SELECT pgroonga_command('select テーブル名 --output_columns _id,id,some_flg ');

結果は下記

[1,1,true],[2,2,false],[3,5,false]

ここでbooleanをUPDATEする

UPDATE test_data SET some_flg='t';

すると結果は

SELECT pgroonga_command('select テーブル名 --output_columns _id,id,some_flg ');
[1,1,true],[2,2,false],[3,5,false],[4,2,true],[5,5,true]

booleanがだめなのかなとおもったけど

UPDATE test_data SET some_value=999;
SELECT pgroonga_command('select テーブル名 --output_columns _id,id,some_value');
[1,1,1],[2,2,2],[3,5,5],[4,2,2],[5,5,5],[6,1,999],[7,2,999],[8,5,999]

intでも同様
おそらくpgroongaでレコードがUPDATEされたときに
{"id":1,"some_value":999,"some_flg":1}
でloadされてて_idが指定されてないのかな?
UPDATEのたびに
drilldownの結果がどんどんずれていくでござる。

以下追記

SELECT pgroonga_command('select  テーブル名 --output_columns _id,id,some_value --query id:1);
[1,1,1],[6,1,999]

こんな感じでid=1のレコードが重複していたのが

--filter "pgroonga_tuple_is_alive(ctid)"'

をくわえることで解決しました。

SELECT pgroonga_command('select  テーブル名 --output_columns _id,id,some_value --query id:1 --filter "pgroonga_tuple_is_alive(ctid)"');
[6,1,999]

やったぜ大勝利🍣

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away