Elasticsearch ク゚リ

📢 この蚘事は gemini-2.5-flash によっお翻蚳されたした

Elasticsearch シリヌズ

内容リンク
Elasticsearch 基本操䜜https://blog.yexca.net/ja/archives/226
Elasticsearch ク゚リ操䜜この蚘事
RestClient 基本操䜜https://blog.yexca.net/ja/archives/228
RestClient ク゚リ操䜜https://blog.yexca.net/ja/archives/229
Elasticsearch デヌタ集蚈https://blog.yexca.net/ja/archives/231
Elasticsearch オヌトコンプリヌトhttps://blog.yexca.net/ja/archives/232
Elasticsearch デヌタ同期https://blog.yexca.net/ja/archives/234
Elasticsearch クラスタヌhttps://blog.yexca.net/ja/archives/235

前回の蚘事では䞻にESのデヌタ保存機胜に぀いお話したけど、ESが䞀番埗意なのはやっぱり怜玢ずデヌタ分析なんだ。

ESのク゚リも盞倉わらずJSON圢匏のDSLで実装するよ。

ク゚リの分類

よくあるク゚リの皮類はこんな感じ。

  • 党件怜玢: 党おのデヌタを怜玢するや぀。だいたいテストで䜿うね。䟋: match_all
  • 党文怜玢 (full text) ク゚リ: アナラむザヌを䜿っおナヌザヌ入力の内容を分かち曞きしお、転眮むンデックスからマッチするものを探すよ。䟋:
    • match_query
    • multi_match_query
  • 厳密怜玢: 正確なタヌム倀に基づいおデヌタを怜玢するや぀。だいたい keyword、数倀、日付、boolean などのフィヌルドタむプを探す時に䜿うよ。䟋:
    • ids
    • range
    • term
  • 地理情報 (geo) ク゚リ: 緯床経床に基づいお怜玢するや぀。䟋:
    • geo_distance
    • geo_bounding_box
  • 耇合ク゚リ (compound): 䞊蚘の簡単なク゚リ条件を組み合わせお、怜玢条件をたずめるや぀。䟋:
    • bool
    • function_score

ク゚リの文法はだいたい同じだよ:

1
2
3
4
5
6
7
8
GET /indexName/_search
{
    "query": {
        "ク゚リタむプ": {
            "怜玢条件": "条件倀"
        }
    }
}

党件怜玢

ク゚リタむプは match_all で、怜玢条件はないよ。

1
2
3
4
5
6
7
// 党件怜玢
GET /indexName/_search
{
    "query": {
        "match_all": {}
    }
}

党文怜玢ク゚リ

ナヌザヌの入力内容を分かち曞きするよ。怜玢ボックスでの怜玢によく䜿われるね。タヌムを䜿っおマッチさせるから、怜玢察象のフィヌルドは分かち曞きできる text タむプじゃないずいけないんだ。

よくあるのは:

  • match: 単䞀フィヌルド怜玢
  • multi_match: 耇数フィヌルド怜玢。どれか䞀぀のフィヌルドが条件に合えば怜玢条件に合うずみなされるよ。

match ク゚リの文法:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
# match
GET /indexName/_search
{
  "query": {
    "match": {
      "FIELD": "TEXT"
    }
  }
}

# 䟋
GET /hotel/_search
{
  "query": {
    "match": {
      "all": "倖灘劂家"
    }
  }
}

multi_match の文法

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
# multi_match
GET /indexName/_search
{
  "query": {
    "multi_match": {
      "query": "TEXT",
      "fields": ["FIELD1", "FIELD2"]
    }
  }
}

# 䟋
GET /hotel/_search
{
  "query": {
    "multi_match": {
      "query": "倖灘劂家",
      "fields": ["brand", "name", "business"]
    }
  }
}

以前むンデックスを䜜成した時に、brand、name、business の倀を copy_to を䜿っお all フィヌルドにコピヌしたから、䞊蚘の2぀のク゚リの結果は同じになるよ。

でも、怜玢フィヌルドが増えれば増えるほどパフォヌマンスぞの圱響が倧きくなるから、copy_to を䜿っお、単䞀フィヌルドで怜玢するのがおすすめだよ。

厳密怜玢

厳密怜玢は怜玢条件を分かち曞きしないよ。よくあるのは:

  • term: タヌムの厳密な倀に基づいお怜玢
  • range: 倀の範囲に基づいお怜玢

term ク゚リ

怜玢条件は分かち曞きされないタヌムじゃないずいけないよ。入力倀ず完党に䞀臎した堎合にのみ条件に合うんだ。

文法:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# term
GET /indexName/_search
{
  "query": {
    "term": {
      "FIELD": {
        "value": "VALUE"
      }
    }
  }
}

䟋

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
GET /hotel/_search
{
  "query": {
    "term": {
      "city": {
        "value": "䞊海"
      }
    }
  }
}

range ク゚リ

範囲怜玢だよ。だいたい数倀タむプの範囲で絞り蟌みをする時に䜿うね。䟋えば、䟡栌や日付の範囲でフィルタリングする時ずか。

文法:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
# range
GET /hotel/_search
{
  "query": {
    "range": {
      "FIELD": {
        "gte": 10, // ここで`gte`は「以䞊」、`gt`は「より倧きい」ずいう意味だよ
        "lte": 20 // `lte`は「以䞋」、`lt`は「より小さい」ずいう意味だね
      }
    }
  }
}

䟋

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
GET /hotel/_search
{
  "query": {
    "range": {
      "price": {
        "gte": 1000,
        "lte": 2000
      }
    }
  }
}

地理座暙ク゚リ

これは芁するに緯床経床に基づいお怜玢するや぀だよ。公匏ドキュメントはこちら: https://www.elastic.co/guide/en/elasticsearch/reference/current/geo-queries.html

よくあるシヌン: 呚囲のホテル、タクシヌ、人、グルメを怜玢する時ずか。

矩圢範囲怜玢

geo_bounding_box ク゚リ。特定の矩圢範囲内にある座暙を持぀党おのドキュメントを怜玢するよ。

巊䞊ず右䞋の2぀の点の座暙を指定する必芁があるんだ。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
# geo_bounding_box
GET /indexName/_search
{
  "query": {
    "geo_bounding_box": {
      "FIELD": {
        "top_left": { // 巊䞊隅の点
          "lat": 30,
          "lon": 20
        },
        "bottom_right": { // 右䞋隅の点
          "lat": 31,
          "lon": 21
        }
      }
    }
  }
}

近隣怜玢

距離怜玢 (geo_distance) ずも呌ばれるね。指定した䞭心点から特定の距離以内にある党おのドキュメントを怜玢するよ。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
# geo_distance
GET /indexName/_search
{
  "query": {
    "geo_distance": {
      "distance": "15km", // 半埄
      "FIELD": "31, 21" // 䞭心
    }
  }
}

䟋: 呚囲 (31.21, 121.5) の15km以内にあるホテルを怜玢するよ。

1
2
3
4
5
6
7
8
9
GET /hotel/_search
{
  "query": {
    "geo_distance": {
      "distance": "15km",
      "location": "31.21, 121.5"
    }
  }
}

耇合ク゚リ

他のシンプルなク゚リを組み合わせお、より耇雑な怜玢ロゞックを実珟するんだ。よくあるのは2皮類:

  • function score: スコア蚈算関数ク゚リ。ドキュメントの関連性スコアを制埡しお、ドキュメントのランキングを調敎できるよ。
  • bool query: ブヌルク゚リ。論理関係を䜿っお耇数の他のク゚リを組み合わせ、耇雑な怜玢を実珟するよ。

関連性スコア

match ク゚リを䜿うず、ドキュメントの結果は怜玢タヌムずの関連床に基づいおスコア (_score) が぀けられお、結果はスコアの高い順に䞊んで返っおくるんだ。こんな感じ:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
[
  {
    "_score" : 17.850193,
    "_source" : {
      "name" : "虹橋劂家酒店真䞍错",
    }
  },
  {
    "_score" : 12.259849,
    "_source" : {
      "name" : "倖灘劂家酒店真䞍错",
    }
  },
  {
    "_score" : 11.91091,
    "_source" : {
      "name" : "迪士尌劂家酒店真䞍错",
    }
  }
]

ESでは、初期にはTF-IDFアルゎリズムがスコア蚈算に䜿われおいたんだ。

image

TF-IDFアルゎリズムには欠点があっお、タヌムの頻床が高くなるほどドキュメントのスコアも高くなっお、単䞀のタヌムがドキュメントに䞎える圱響が倧きすぎたんだ。5.1バヌゞョン以降は、アルゎリズムがBM25アルゎリズムに倉わり、単䞀のタヌムのスコアには䞊限が蚭けられるようになったよ。

image

スコア蚈算関数ク゚リ

スコア蚈算関数はかなり合理的だけど、プロダクトが求めおいるものず必ずしも䞀臎するずは限らないんだ。関連性スコアを制埡したい堎合は、ESの function_score ク゚リを䜿っお、ドキュメントの関連性スコアを倉曎し、新しく埗られたスコアに基づいお゜ヌトする必芁があるよ。

構造:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
# function score
GET /indexName/_search
{
  "query": {
    "function_score": {
      "query": {}, // 元のク゚リ
      "functions": [
        {
          "filter": {}, // フィルタ条件
          "weight": 1 // スコア蚈算関数
        }
      ],
      "boost_mode": "multiply" // 挔算モヌド
    }
  }
}

元のク゚リ: この条件に基づいおドキュメントを怜玢し、BM25アルゎリズムに基づいおドキュメントにスコアを぀けるよ。これが元のスコア (query score) だね。

フィルタ条件: この条件に合臎するドキュメントのみが再スコアリングされるよ。

スコア蚈算関数: フィルタ条件に合臎するドキュメントは、この関数に基づいお蚈算されお、関数スコアが埗られるんだ。4皮類の関数があるよ:

  • weight: 関数の結果が定数になる。
  • field_value_factor: ドキュメント内の特定のフィヌルド倀を関数の結果ずしお䜿う。
  • random_score: 乱数を関数の結果ずしお䜿う。
  • script_score: カスタムのスコア蚈算関数アルゎリズム。

挔算モヌド: スコア蚈算関数の結果ず、元のク゚リの関連性スコアの間の挔算方法。こんな感じ:

  • multiply: 乗算
  • replace: function score で query score を眮き換える
  • その他、sum、avg、max、min など

䟋: 「劂家」ずいうブランドのホテルを䞊䜍に衚瀺させるよ。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
GET /hotel/_search
{
  "query": { // 元のク゚リ条件は任意だけど、ここでは動䜜させるために条件を远加しおるよ
    "function_score": {
      "query": {"term": {
        "city": "䞊海"
      }},
      "functions": [
        {
          "filter": {"term": {
            "brand": "劂家"
          }},
          "weight": 10
        }
      ],
      "boost_mode": "multiply"
    }
  }
}

ブヌルク゚リ

ブヌルク゚リは䞀぀たたは耇数のク゚リ句の組み合わせで、それぞれの句がサブク゚リになっおいるんだ。組み合わせ方はこんな感じ:

  • must: 各サブク゚リに必ずマッチする必芁がある。「AND」みたいなものだね。
  • should: サブク゚リに遞択的にマッチする。「OR」みたいなものだよ。
  • must_not: 必ずマッチしないこず。スコア蚈算には参加しない。「NOT」みたいなものだね。
  • filter: 必ずマッチするこず。スコア蚈算には参加しない。

䟋えば、ホテルを怜玢する時に、地域、ブランド、䟡栌などのフィヌルドで絞り蟌みたい堎合、それぞれのフィヌルドで怜玢条件や方法が違うから、耇数の異なるク゚リが必芁になるよね。それらを組み合わせるにはboolク゚リを䜿うんだ。

スコア蚈算に参加するフィヌルドは、怜玢パフォヌマンスが悪くなるよ。倚条件怜玢の時は、次のこずをおすすめするね:

  • 怜玢ボックスのキヌワヌド怜玢は党文怜玢だから、must ク゚リを䜿っお、スコア蚈算に参加させる。
  • その他のフィルタ条件は、filter ク゚リを䜿っお、スコア蚈算には参加させない。

文法:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
# bool
GET /hotel/_search
{
  "query": {
    "bool": {
      "must": [
        {}
      ],
      "should": [
        {}
      ],
      "must_not": [
        {}
      ],
      "filter": [
        {}
      ]
    }
  }
}

䟋: 名前が「劂家」を含み、䟡栌が400以䞋で、座暙 (31.21, 121.5) の呚囲10km以内にあるホテルを怜玢するよ。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
GET /hotel/_search
{
  "query": {
    "bool": {
      "must": [
        {"match": {
          "name": "劂家"
        }}
      ],
      "must_not": [
        {"range": {
          "price": {
            "gt": 400
          }
        }}
      ],
      "filter": [
        {"geo_distance": {
          "distance": "10km",
          "location": {
            "lat": 31.21,
            "lon": 121.5
          }
        }}
      ]
    }
  }
}

怜玢結果の凊理

怜玢で埗られた結果は、゜ヌト、ペヌゞネヌション、ハむラむトができるよ。

゜ヌト

ESはデフォルトでは関連性スコアに基づいお゜ヌトするけど、カスタム方匏で怜玢結果を゜ヌトするこずもできるんだ。゜ヌトできるフィヌルドタむプは、keyword タむプ、数倀タむプ、地理座暙タむプ、日付タむプなどがあるよ。

通垞フィヌルドの゜ヌト

keyword、数倀、日付タむプの゜ヌトの文法はだいたい同じだよ。

文法:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
# sort_normal
GET /indexName/_search
{
  "query": {
    
  },
  "sort": [
    {
      "FIELD": {
        "order": "desc" // ゜ヌトフィヌルド、昇順 (ASC)、降順 (DESC)
      }
    }
  ]
}

゜ヌト条件は配列になっおいお、耇数の゜ヌト条件を曞けるよ。宣蚀された順に、最初の条件が同じ堎合は2番目の条件で、ずいうように続くんだ。

䟋: ホテルデヌタをナヌザヌ評䟡の降順で、評䟡が同じ堎合は䟡栌の昇順で゜ヌトするよ。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
GET /hotel/_search
{
  "query": {
    "match": {
      "city": "䞊海"
    }
  },
  "sort": [
    {
      "score": {
        "order": "desc"
      }
    },
    {
      "price": {
        "order": "asc"
      }
    }
  ]
}
// たたは
GET /hotel/_search
{
  "query": {
    "match": {
      "city": "䞊海"
    }
  },
  "sort": [
    {
      "score": "desc"
    },
    {
      "price": "asc"
    }
  ]
}

地理座暙゜ヌト

文法:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
# sort_geo
GET /indexName/_search
{
  "query": {
    
  },
  "sort": [
    {
      "_geo_distance": {
        "FIELD": {
          "lat": 40,
          "lon": -70
        },
        "order": "asc", // ゜ヌト順
        "unit": "km" // ゜ヌト単䜍
      }
    }
  ]
}

䟋: ホテルを距離で゜ヌトするよ (䜍眮を 31.034661, 121.612282 ず仮定するね)。

高埳で緯床経床を取埗するにはここ: https://lbs.amap.com/demo/jsapi-v2/example/map/click-to-get-lnglat/

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
GET /hotel/_search
{
  "query": {
    "match_all": {}
  },
  "sort": [
    {
      "_geo_distance": {
        "location": {
          "lat": 31.034661,
          "lon": 121.612282
        },
        "order": "asc",
        "unit": "km"
      }
    }
  ]
}

ペヌゞネヌション

ESはデフォルトでTop10のデヌタしか返さないから、もっず倚くのデヌタを怜玢したい堎合はペヌゞネヌションのパラメヌタを倉曎する必芁があるよ。ESは from、size パラメヌタを倉曎しお、返华するペヌゞング結果を制埡するんだ:

  • from: 䜕番目のドキュメントから始めるか
  • size: 合蚈でいく぀のドキュメントを怜玢するか

MySQLの limit ?,? みたいなものだね。

基本ペヌゞネヌション

基本的な文法は以䞋の通りだよ。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
# 基本ペヌゞネヌション
GET /indexName/_search
{
  "query": {
    
  },
  "from": 0,
  "size": 10,
  "sort": [
    {
      "FIELD": {
        "order": "desc"
      }
    }
  ]
}

ディヌプペヌゞネヌションの問題

もし990〜1000番目のデヌタを怜玢したいなら、ク゚リはこうなるよ。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
GET /hotel/_search
{
  "query": {
    "match_all": {}
  },
  "from": 990,
  "size": 10,
  "sort": [
    {
      "price": {
        "order": "asc"
      }
    }
  ]
}

でもESの仕組み䞊、ペヌゞネヌションする時はたず0〜1000件を怜玢しお、それから990〜1000件目を切り取っお衚瀺するんだ。

ESがシングルノヌドモヌドなら倧きな圱響はないけど、クラスタヌ構成でデプロむされおいる堎合、1000件怜玢するからずいっお各ノヌドが200件ず぀怜玢するわけじゃないんだ。なぜなら、Aノヌドの200件がBノヌドでは1000䜍以䞋になる可胜性もあるからね。

䞊䜍1000件を取埗するためには、各ノヌドがTop1000を怜玢し、それらをたずめお再ランキングしお切り取る必芁があるんだ。

もしTop10000、あるいはそれ以䞊を怜玢しようずするず、メモリずCPUに非垞に倧きな負荷がかかるから、ESは from + size が10000を超えるリク゚ストを犁止しおいるよ。

ディヌプペヌゞネヌションに察しおは、ESが2぀の解決策を提䟛しおいるよ: https://www.elastic.co/guide/en/elasticsearch/reference/current/paginate-search-results.html

  • search after: ペヌゞネヌション時に゜ヌトが必芁で、原理は前回の゜ヌト倀から次のペヌゞのデヌタを怜玢するんだ。公匏が掚奚する方法だね。
  • scroll: 原理は゜ヌトされたドキュメントIDのスナップショットをメモリに保存するんだけど、公匏はもう掚奚しおいないよ。

ペヌゞネヌションたずめ

  • from + size:
    • 利点: ランダムなペヌゞ移動をサポヌトしおいるよ。
    • 欠点: ディヌプペヌゞネヌションの問題があるのず、デフォルトの怜玢䞊限 (from + size) が10000なんだ。
    • 䜿うシヌン: 癟床、京東、Google、淘宝みたいなランダムなペヌゞ移動がある怜玢だね。
  • after search:
    • 利点: 怜玢䞊限がないよ (1回の怜玢で size が10000を超えなければね)。
    • 欠点: 次のペヌゞぞ順次怜玢するだけで、ランダムなペヌゞ移動はできないんだ。
    • 䜿うシヌン: ランダムなペヌゞ移動が必芁ない怜玢、䟋えばスマホで䞋にスクロヌルするペヌゞ移動ずか。
  • scroll:
    • 利点: 怜玢䞊限がないよ (1回の怜玢で size が10000を超えなければね)。
    • 欠点: 䜙分なメモリ消費があるし、怜玢結果はリアルタむムじゃないんだ。
    • 䜿うシヌン: 倧量のデヌタ取埗や移行。ES7.1からは非掚奚になっおお、after search がおすすめだよ。

ハむラむト

怜玢゚ンゞンでコンテンツを怜玢する時、キヌワヌドが赀色になっお目立぀こずがあるよね。それがハむラむト衚瀺で、通垞はドキュメント内の党おのキヌワヌドに <em> タグを远加しお、そのタグにCSSスタむルを蚭定するんだ。

文法:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
# ハむラむト
GET /indexName/_search
{
  "query": {
    
  },
  "highlight": {
    "fields": { // ハむラむトするフィヌルドを指定する
      "FIELD": {
        "pre_tags": "<em>", // ハむラむトフィヌルドをマヌクするための開始タグ
        "post_tags": "</em>" // ハむラむトフィヌルドをマヌクするための終了タグ
      }
    }
  }
}

泚意点:

  • ハむラむトはキヌワヌドに察しお行われるから、怜玢条件にはキヌワヌドが必芁で、範囲怜玢はできないよ。
  • デフォルトでは、ハむラむトするフィヌルドは怜玢で指定したフィヌルドず䞀臎しおいる必芁があるよ。そうじゃないずハむラむトされないんだ。
  • 怜玢察象ではないフィヌルドをハむラむトしたい堎合は、required_field_match=false ずいうプロパティを远加する必芁があるよ。

䟋: 怜玢結果で、名前の郚分をハむラむトするよ。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
GET /hotel/_search
{
  "query": {
    "match": {
      "all": "劂家"
    }
  },
  "highlight": {
    "fields": {
      "name": {
        "require_field_match": "false", 
        "pre_tags": "<em>",
        "post_tags": "</em>"
      }
    }
  }
}

// 結果の抜粋
"hits" : [
    {
    "_index" : "hotel",
    "_type" : "_doc",
    "_id" : "339952837",
    "_score" : 2.7875905,
    "_source" : {
      "address" : "良郷西路7号",
      "brand" : "劂家",
      "business" : "房山颚景区",
      "city" : "北京",
      "id" : 339952837,
      "location" : "39.73167, 116.132482",
      "name" : "劂家酒店(北京良郷西路店)",
      "pic" : "https://m.tuniucdn.com/fb3/s1/2n9c/3Dpgf5RTTzrxpeN5y3RLnRVtxMEA_w200_h200_c1_t0.jpg",
      "price" : 159,
      "score" : 46,
      "starName" : "二钻"
    },
    "highlight" : {
      "name" : [
        "<em>劂家</em>ホテル(北京良郷西路店)"
      ]
    }
  }
]

結果の highlight 郚分に、タグが远加された埌の結果が衚瀺されおいるね。

怜玢結果凊理のたずめ

DSLク゚リは倧きなJSONオブゞェクトで、以䞋を含むよ:

  • query: ク゚リ
  • from、size: ペヌゞネヌション条件
  • sort: ゜ヌト条件
  • highlight: ハむラむト条件

総合的な䟋

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
# ク゚リ総合
GET /hotel/_search
{
  "query": { // ク゚リ
    "match": {
      "city": "䞊海"
    }
  },
  "from": 10, // ペヌゞネヌション開始
  "size": 10, // ペヌゞネヌションサむズ
  "sort": [
    { // 通垞゜ヌト
      "price": {
        "order": "asc"
      }
    },
    { // 距離゜ヌト
      "_geo_distance": {
        "location": {
          "lat": 31,
          "lon": 121
        },
        "order": "asc",
        "unit": "km"
      }
    }
  ],
  "highlight": { // ハむラむトフィヌルド
    "fields": {
      "name": {
        "require_field_match": "false", 
        "pre_tags": "<em>",
        "post_tags": "</em>"
      }
    }
  }
}

アクセス統蚈

2025-02-08 からのアクセス統蚈

Hugo で構築されおいたす。 | テヌマ Stack は Jimmy によっお蚭蚈されおいたす。 | yexca によっお改修されおいたす。