はじめに
これまで Elasticsearch で「メインのインデックスに、別インデックスの情報を紐付けて表示したい」場合、Enrich Processor を使用して、取り込み(Ingest)フェーズであらかじめデータを結合しておくのが一般的でした。
しかし、この方法ではデータの更新のたびに Enrich Policy の再実行が必要になるなど、運用の手間がかかる側面がありました。
最新の Elasticsearch では、ES|QL の LOOKUP JOIN 機能が登場し、クエリ実行時にリアルタイムで別インデックスの情報を参照できるようになりました。本記事では、この便利な新機能の使い方を紹介します。
開発環境
- Elasticsearch / Kibana: v9.2.4
- Chrome
※注意事項: LOOKUP JOIN … ON … == … の記法は、Elasticsearch 9.2 時点で Preview です。
事前準備
メインデータの用意(Sample web logs)
今回は Kibana に標準で用意されている「Sample web logs」を使用します。 まだ取り込んでいない場合は、Kibana ホームの「Add data」から Sample web logs を追加してください。
国マスタのインポート
この記事の末尾に記載している country_list.csv を使用して、マスタデータを作成します。
※筆者は、Webブラウザに Chrome を使用しました。
- Kibana の Home > Upload a file を開きます。
- country_list.csv をアップロードし、設定を以下のように変更します。
- Index name: country_list
- Advanced options > Data view: off(マスタなので Data view は不要です)
- [Import] をクリックします。


Lookup Index への変換
ES|QL の Lookup Join を利用するには、通常のインデックスを「Lookup 用」に変換する必要があります。
- Stack Management > Index Management から country_list を選択します。

2. Manage ボタンから Convert to lookup index をクリックします。

3. Lookup index name に lookup-country_list と入力し、Convert を実行します。

Note: この操作により、インメモリで高速に結合可能な特殊なインデックスが生成されます。元の country_list もそのまま残ります。
【実践】ES|QL での集計比較
Lookup Join なし(国コードのみ)
まずは、通常の集計を行ってみます。
Kibana の Discover を開き、上部の [Try ES|QL] をクリックします。
以下のクエリを入力して実行します。
FROM kibana_sample_data_logs
| STATS bytes_sum = sum(bytes) BY geo.dest
| KEEP geo.dest, bytes_sum
| SORT bytes_sum DESC
| LIMIT 8集計対象の期間は、適当に調整してください。下記の例では、Last 24 hours を指定しています。

結果: geo.dest 項目に CN や US といった 2 桁の国コードが表示されます。これだけでは、直感的にどの国か分かりにくいですよね。
Lookup Join あり(国名を結合)
次に、LOOKUP JOIN を使って国マスタから国名を引っ張ってきます。
FROM kibana_sample_data_logs
| STATS bytes_sum = sum(bytes) BY geo.dest
| LOOKUP JOIN lookup-country_list ON geo.dest == country_code
| KEEP country_name, bytes_sum
| SORT bytes_sum DESC
| LIMIT 8
結果: country_name が結合され、「CHINA」「UNITED STATES」といった具体的な国名が表示されるようになります!
まとめ
ES|QL の LOOKUP JOIN を使うメリットは以下の通りです。
- 運用の簡略化: Enrich Policy を管理・更新する手間が省ける。
- 直感的な記述: SQL の JOIN に近い感覚で、クエリ内で動的に結合できる。
- 柔軟性: 必要なときだけマスタ情報を付与できる。
現在は Preview 機能ですが、将来的に Elasticsearch でのログ分析やレポート作成において、欠かせない機能になるはずです。
参考資料
Elastic公式: LOOKUP JOIN command
添付資料:country_list.csv
国マスタのCSVです。
※このデータは、https://www.e-tax.nta.go.jp/toiawase/qa/crs/countrycode.htm を元に生成したものです。
country_code,country_name
AF,AFGHANISTAN
AX,ALAND ISLANDS
AL,ALBANIA
DZ,ALGERIA
AS,AMERICAN SAMOA
AD,ANDORRA
AO,ANGOLA
AI,ANGUILLA
AQ,ANTARCTICA
AG,ANTIGUA AND BARBUDA
AR,ARGENTINA
AM,ARMENIA
AW,ARUBA
AU,AUSTRALIA
AT,AUSTRIA
AZ,AZERBAIJAN
BS,BAHAMAS
BH,BAHRAIN
BD,BANGLADESH
BB,BARBADOS
BY,BELARUS
BE,BELGIUM
BZ,BELIZE
BJ,BENIN
BM,BERMUDA
BT,BHUTAN
BO,"BOLIVIA, PLURINATIONAL STATE OF"
BQ,"BONAIRE, SINT EUSTATIUS AND SABA"
BA,BOSNIA AND HERZEGOVINA
BW,BOTSWANA
BV,BOUVET ISLAND
BR,BRAZIL
IO,BRITISH INDIAN OCEAN TERRITORY
BN,BRUNEI DARUSSALAM
BG,BULGARIA
BF,BURKINA FASO
BI,BURUNDI
KH,CAMBODIA
CM,CAMEROON
CA,CANADA
CV,CABO VERDE
KY,CAYMAN ISLANDS
CF,CENTRAL AFRICAN REPUBLIC
TD,CHAD
CL,CHILE
CN,CHINA
CX,CHRISTMAS ISLAND
CC,COCOS (KEELING) ISLANDS
CO,COLOMBIA
KM,COMOROS
CG,CONGO
CD,"CONGO, THE DEMOCRATIC REPUBLIC OF THE"
CK,COOK ISLANDS
CR,COSTA RICA
CI,COTE D'IVOIRE
HR,CROATIA
CU,CUBA
CW,CURACAO
CY,CYPRUS
CZ,CZECHIA
DK,DENMARK
DJ,DJIBOUTI
DM,DOMINICA
DO,DOMINICAN REPUBLIC
EC,ECUADOR
EG,EGYPT
SV,EL SALVADOR
GQ,EQUATORIAL GUINEA
ER,ERITREA
EE,ESTONIA
ET,ETHIOPIA
FK,FALKLAND ISLANDS (MALVINAS)
FO,FAROE ISLANDS
FJ,FIJI
FI,FINLAND
FR,FRANCE
GF,FRENCH GUIANA
PF,FRENCH POLYNESIA
TF,FRENCH SOUTHERN TERRITORIES
GA,GABON
GM,GAMBIA
GE,GEORGIA
DE,GERMANY
GH,GHANA
GI,GIBRALTAR
GR,GREECE
GL,GREENLAND
GD,GRENADA
GP,GUADELOUPE
GU,GUAM
GT,GUATEMALA
GG,GUERNSEY
GN,GUINEA
GW,GUINEA-BISSAU
GY,GUYANA
HT,HAITI
HM,HEARD ISLAND AND MCDONALD ISLANDS
VA,HOLY SEE (VATICAN CITY STATE)
HN,HONDURAS
HK,HONG KONG
HU,HUNGARY
IS,ICELAND
IN,INDIA
ID,INDONESIA
IR,"IRAN, ISLAMIC REPUBLIC OF"
IQ,IRAQ
IE,IRELAND
IM,ISLE OF MAN
IL,ISRAEL
IT,ITALY
JM,JAMAICA
JP,JAPAN
JE,JERSEY
JO,JORDAN
KZ,KAZAKHSTAN
KE,KENYA
KI,KIRIBATI
KP,"KOREA, DEMOCRATIC PEOPLE'S REPUBLIC OF"
KR,"KOREA, REPUBLIC OF"
KW,KUWAIT
KG,KYRGYZSTAN
LA,LAO PEOPLE'S DEMOCRATIC REPUBLIC
LV,LATVIA
LB,LEBANON
LS,LESOTHO
LR,LIBERIA
LY,LIBYA
LI,LIECHTENSTEIN
LT,LITHUANIA
LU,LUXEMBOURG
MO,MACAO
MK,NORTH MACEDONIA
MG,MADAGASCAR
MW,MALAWI
MY,MALAYSIA
MV,MALDIVES
ML,MALI
MT,MALTA
MH,MARSHALL ISLANDS
MQ,MARTINIQUE
MR,MAURITANIA
MU,MAURITIUS
YT,MAYOTTE
MX,MEXICO
FM,"MICRONESIA, FEDERATED STATES OF"
MD,"MOLDOVA, REPUBLIC OF"
MC,MONACO
MN,MONGOLIA
ME,MONTENEGRO
MS,MONTSERRAT
MA,MOROCCO
MZ,MOZAMBIQUE
MM,MYANMAR
NA,NAMIBIA
NR,NAURU
NP,NEPAL
NL,NETHERLANDS
NC,NEW CALEDONIA
NZ,NEW ZEALAND
NI,NICARAGUA
NE,NIGER
NG,NIGERIA
NU,NIUE
NF,NORFOLK ISLAND
MP,NORTHERN MARIANA ISLANDS
NO,NORWAY
OM,OMAN
PK,PAKISTAN
PW,PALAU
PS,"PALESTINE, STATE OF"
PA,PANAMA
PG,PAPUA NEW GUINEA
PY,PARAGUAY
PE,PERU
PH,PHILIPPINES
PN,PITCAIRN
PL,POLAND
PT,PORTUGAL
PR,PUERTO RICO
QA,QATAR
RE,REUNION
RO,ROMANIA
RU,RUSSIAN FEDERATION
RW,RWANDA
BL,SAINT BARTHELEMY
SH,"SAINT HELENA, ASCENSION AND TRISTAN DA CUNHA"
KN,SAINT KITTS AND NEVIS
LC,SAINT LUCIA
MF,SAINT MARTIN (FRENCH PART)
PM,SAINT PIERRE AND MIQUELON
VC,SAINT VINCENT AND THE GRENADINES
WS,SAMOA
SM,SAN MARINO
ST,SAO TOME AND PRINCIPE
SA,SAUDI ARABIA
SN,SENEGAL
RS,SERBIA
SC,SEYCHELLES
SL,SIERRA LEONE
SG,SINGAPORE
SX,SINT MAARTEN (DUTCH PART)
SK,SLOVAKIA
SI,SLOVENIA
SB,SOLOMON ISLANDS
SO,SOMALIA
ZA,SOUTH AFRICA
GS,SOUTH GEORGIA AND THE SOUTH SANDWICH ISLANDS
SS,SOUTH SUDAN
ES,SPAIN
LK,SRI LANKA
SD,SUDAN
SR,SURINAME
SJ,SVALBARD AND JAN MAYEN
SZ,ESWATINI
SE,SWEDEN
CH,SWITZERLAND
SY,SYRIAN ARAB REPUBLIC
TW,"TAIWAN, PROVINCE OF CHINA"
TJ,TAJIKISTAN
TZ,"TANZANIA, UNITED REPUBLIC OF"
TH,THAILAND
TL,TIMOR-LESTE
TG,TOGO
TK,TOKELAU
TO,TONGA
TT,TRINIDAD AND TOBAGO
TN,TUNISIA
TR,TURKEY
TM,TURKMENISTAN
TC,TURKS AND CAICOS ISLANDS
TV,TUVALU
UG,UGANDA
UA,UKRAINE
AE,UNITED ARAB EMIRATES
GB,UNITED KINGDOM OF GREAT BRITAIN AND NORTHERN IRELAND
US,UNITED STATES
UM,UNITED STATES MINOR OUTLYING ISLANDS
UY,URUGUAY
UZ,UZBEKISTAN
VU,VANUATU
VE,"VENEZUELA, BOLIVARIAN REPUBLIC OF"
VN,VIET NAM
VG,"VIRGIN ISLANDS, BRITISH"
VI,"VIRGIN ISLANDS, U.S."
WF,WALLIS AND FUTUNA
EH,WESTERN SAHARA
YE,YEMEN
ZM,ZAMBIA
ZW,ZIMBABWE
XK,KOSOVO

