search-engine-setup
アプリケーション向けの検索エンジンをセットアップして最適化します。「アプリに検索機能を追加したい」「Elasticsearchを導入したい」「Algoliaを設定したい」「検索精度を改善したい」「オートコンプリート機能を追加したい」「あいまい検索を実装したい」「ファセット検索を実装したい」といったご依頼の際にご利用ください。インデックス設計、データ同期、Search API、オートコンプリート、検索精度の調整、クエリ分析に対応しています。
description の原文を見る
Set up and optimize search engines for applications. Use when someone asks to "add search to my app", "set up Elasticsearch", "configure Algolia", "fix search relevance", "add autocomplete", "fuzzy search", or "faceted filtering". Covers index design, data sync, search API, autocomplete, relevance tuning, and query analysis.
SKILL.md 本文
検索エンジン設定
概要
このスキルは、AIエージェントがアプリケーションに本番環境対応の検索機能を実装するのを支援します。カスタムアナライザーを備えたインデックス設計、データベース-インデックス同期パイプライン、ファセティングとハイライト機能を備えた検索API、オートコンプリート、および実際のクエリデータに基づく関連性チューニングに対応しています。
手順
インデックス設計(Elasticsearch)
-
ソースデータベースの列をElasticsearchのフィールドタイプにマッピングします:
- ユーザーが検索するテキスト列 → カスタムアナライザー付きの
text - フィルタリング用の列挙型・カテゴリ列 →
keyword - 範囲フィルター用の数値列 →
integer、float - ブール値フラグ →
boolean - 日付 →
date - オートコンプリート用フィールド →
completion
- ユーザーが検索するテキスト列 → カスタムアナライザー付きの
-
商品・コンテンツ検索用のカスタムアナライザーテンプレート:
{ "analyzer": { "content_analyzer": { "tokenizer": "standard", "filter": ["lowercase", "synonym_filter", "edge_ngram_filter"] } }, "filter": { "synonym_filter": { "type": "synonym", "synonyms_path": "synonyms.txt" }, "edge_ngram_filter": { "type": "edge_ngram", "min_gram": 3, "max_gram": 15 } } } -
検索の重要度に応じてフィールドにブーストを設定します:タイトル・名前(3~5倍)、タグ(2倍)、説明(1倍)。
-
常に型
completionのsuggestフィールドをタイプアヘッド用に追加してください。
インデックス設計(Algolia)
- 優先順序で
searchableAttributesを設定します:["name", "category", "description"]。 attributesForFacetingを設定します:表示しないファセット用の属性にはfilterOnly()をプレフィックスします。customRankingを設定します:["desc(popularity)", "desc(rating)"]。- タイプミス許容機能を有効にし(デフォルトで有効)、
minWordSizefor1Typo: 3を設定します。
同期パイプライン
- フル再インデックス:初回実行またはマニュアルトリガー時に、すべてのソースレコードをページネーション処理し(バッチあたり1000件)、インデックスドキュメントに変換して、一括挿入します。
- 増分同期:
updated_at > last_sync_timeを10秒ごとにポーリングするか、データベーストリガー・CDCを使用します。 - 削除処理:ソフトデリートされたレコードを追跡します。検出時にインデックスから削除します。
- べき等性:ソースレコードIDをドキュメントIDとして使用します。盲目的な挿入ではなく、常にアップサートを実行します。
- エラーハンドリング:失敗したドキュメントをログに記録し、バッチを継続します。次のサイクルで失敗を再試行します。
検索API
以下を受け入れるエンドポイントを構築します:
q— フルテキストクエリ文字列- フィルターパラメーター —
category、brand、min_price、max_price、rating、in_stock sort—relevance(デフォルト)、price_asc、price_desc、newest、ratingpage/per_pageまたはカーソルベースのページネーション
クエリ構築(Elasticsearch):
{
"query": {
"bool": {
"must": [{ "multi_match": { "query": "q", "fields": ["name^5", "description"], "fuzziness": "AUTO" }}],
"filter": [
{ "term": { "category": "electronics" }},
{ "range": { "price_cents": { "gte": 2000, "lte": 10000 }}},
{ "term": { "in_stock": true }}
],
"should": [{ "term": { "in_stock": { "value": true, "boost": 2 }}}]
}
},
"highlight": { "fields": { "name": {}, "description": {} }},
"aggs": {
"categories": { "terms": { "field": "category", "size": 20 }},
"brands": { "terms": { "field": "brand", "size": 20 }},
"price_ranges": { "range": { "field": "price_cents", "ranges": [
{ "to": 2500 }, { "from": 2500, "to": 10000 }, { "from": 10000 }
]}}
}
}
オートコンプリート
- プレフィックスベースのタイプアヘッド(最速)にはコンプリーション推奨機能を使用します。
- カテゴリーコンテキスト付きの上位5つの候補を返します。
- 低結果クエリーの場合は、フレーズ推奨機能を使用して「もしかして」機能を追加します。
関連性チューニング
検索ログを分析して品質を向上させます:
- ゼロ結果クエリー:スペルミスを確認 → 同義語を追加します。データ欠落を確認 → コンテンツギャップにフラグを付けます。
- 低クリック率クエリー:トップ結果が意図と一致しない → ブースト重みを調整するか、同義語を追加します。
- 位置バイアス:ユーザーが一貫して結果#3以降をクリックしている場合 → ランキング公式を調整する必要があります。
- 段階的に変更を適用します:最初に同義語、次にブースト調整、その後にカスタムスコアリング。
例
例1 — ブログ検索インデックス
入力: "10Kの記事を持つブログ用の検索を設定してください。"
出力:
{
"mappings": {
"properties": {
"title": { "type": "text", "analyzer": "content_analyzer", "boost": 5.0 },
"body": { "type": "text", "analyzer": "content_analyzer" },
"author": { "type": "keyword" },
"tags": { "type": "keyword" },
"published_at": { "type": "date" },
"suggest": { "type": "completion", "contexts": [{ "name": "tag", "type": "category" }] }
}
}
}
例2 — e-commerceストア用のAlgolia設定
入力: "商品を扱うストア向けにAlgoliaを設定してください。"
出力:
index.setSettings({
searchableAttributes: ['name', 'brand', 'category', 'description'],
attributesForFaceting: ['category', 'brand', 'filterOnly(price_cents)', 'rating'],
customRanking: ['desc(sales_count)', 'desc(rating)'],
typoTolerance: true,
minWordSizefor1Typo: 3,
minWordSizefor2Typos: 6,
hitsPerPage: 20,
snippetEllipsisText: '…',
attributesToSnippet: ['description:30'],
});
ガイドライン
- 制御にはElasticsearchを、市場投入の速さにはAlgoliaを選択します。 Elasticsearchは完全なチューニング機能を提供し、Algoliaはセットアップが高速ですがスケール時のコストが高くなります。
- プライマリデータベースで検索しないでください。 常に専用の検索インデックスに同期してください。SQLの
LIKEはスケールしません。 - Fuzziness AUTOはほぼ常に正しい選択です。 3~5文字の単語に対して1つのタイプミス、6文字以上の単語に対して2つのタイプミスを許可します。
- 同義語が最も高いROIを持つチューニングです。 ほとんどのゼロ結果クエリーは、10~20個の同義語ペアを追加することで解決されます。
- クエリーのパフォーマンスを監視してください。 p95検索レイテンシーが200msを超える場合は、アラートを設定します。
ライセンス: Apache-2.0(寛容ライセンスのため全文を引用しています) · 原本リポジトリ
詳細情報
- 作者
- TerminalSkills
- ライセンス
- Apache-2.0
- 最終更新
- 2026/5/4
Source: https://github.com/TerminalSkills/skills / ライセンス: Apache-2.0