{
  "schemaVersion": "1.0",
  "item": {
    "slug": "elasticsearch",
    "name": "Elasticsearch",
    "source": "tencent",
    "type": "skill",
    "category": "开发工具",
    "sourceUrl": "https://clawhub.ai/ivangdavila/elasticsearch",
    "canonicalUrl": "https://clawhub.ai/ivangdavila/elasticsearch",
    "targetPlatform": "OpenClaw"
  },
  "install": {
    "downloadMode": "redirect",
    "downloadUrl": "/downloads/elasticsearch",
    "sourceDownloadUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=elasticsearch",
    "sourcePlatform": "tencent",
    "targetPlatform": "OpenClaw",
    "installMethod": "Manual import",
    "extraction": "Extract archive",
    "prerequisites": [
      "OpenClaw"
    ],
    "packageFormat": "ZIP package",
    "includedAssets": [
      "SKILL.md"
    ],
    "primaryDoc": "SKILL.md",
    "quickSetup": [
      "Download the package from Yavira.",
      "Extract the archive and review SKILL.md first.",
      "Import or place the package into your OpenClaw setup."
    ],
    "agentAssist": {
      "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
      "steps": [
        "Download the package from Yavira.",
        "Extract it into a folder your agent can access.",
        "Paste one of the prompts below and point your agent at the extracted folder."
      ],
      "prompts": [
        {
          "label": "New install",
          "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete."
        },
        {
          "label": "Upgrade existing",
          "body": "I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run."
        }
      ]
    },
    "sourceHealth": {
      "source": "tencent",
      "status": "healthy",
      "reason": "direct_download_ok",
      "recommendedAction": "download",
      "checkedAt": "2026-04-30T16:55:25.780Z",
      "expiresAt": "2026-05-07T16:55:25.780Z",
      "httpStatus": 200,
      "finalUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=network",
      "contentType": "application/zip",
      "probeMethod": "head",
      "details": {
        "probeUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=network",
        "contentDisposition": "attachment; filename=\"network-1.0.0.zip\"",
        "redirectLocation": null,
        "bodySnippet": null
      },
      "scope": "source",
      "summary": "Source download looks usable.",
      "detail": "Yavira can redirect you to the upstream package for this source.",
      "primaryActionLabel": "Download for OpenClaw",
      "primaryActionHref": "/downloads/elasticsearch"
    },
    "validation": {
      "installChecklist": [
        "Use the Yavira download entry.",
        "Review SKILL.md after the package is downloaded.",
        "Confirm the extracted package contains the expected setup assets."
      ],
      "postInstallChecks": [
        "Confirm the extracted package includes the expected docs or setup files.",
        "Validate the skill or prompts are available in your target agent workspace.",
        "Capture any manual follow-up steps the agent could not complete."
      ]
    },
    "downloadPageUrl": "https://openagent3.xyz/downloads/elasticsearch",
    "agentPageUrl": "https://openagent3.xyz/skills/elasticsearch/agent",
    "manifestUrl": "https://openagent3.xyz/skills/elasticsearch/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/elasticsearch/agent.md"
  },
  "agentAssist": {
    "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
    "steps": [
      "Download the package from Yavira.",
      "Extract it into a folder your agent can access.",
      "Paste one of the prompts below and point your agent at the extracted folder."
    ],
    "prompts": [
      {
        "label": "New install",
        "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete."
      },
      {
        "label": "Upgrade existing",
        "body": "I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run."
      }
    ]
  },
  "documentation": {
    "source": "clawhub",
    "primaryDoc": "SKILL.md",
    "sections": [
      {
        "title": "Mapping Mistakes",
        "body": "Always define explicit mappings—dynamic mapping guesses wrong (first \"123\" makes field integer, later \"abc\" fails)\ntext for full-text search, keyword for exact match/aggregations—using text for IDs breaks filters\nCan't change field type after indexing—must reindex to new index with correct mapping\nSet dynamic: \"strict\" to reject unmapped fields—catches typos in field names"
      },
      {
        "title": "Text vs Keyword",
        "body": "text is analyzed (tokenized, lowercased)—\"Quick Brown\" matches search for \"quick\"\nkeyword is exact bytes—\"Quick Brown\" only matches exactly \"Quick Brown\"\nNeed both? Use multi-field: \"title\": { \"type\": \"text\", \"fields\": { \"raw\": { \"type\": \"keyword\" }}}\nSort/aggregate on title.raw, search on title"
      },
      {
        "title": "Query vs Filter Context",
        "body": "Query context calculates relevance score—expensive, use for search ranking\nFilter context is yes/no—cacheable, use for exact conditions (status, date ranges)\nCombine: bool.must for scoring, bool.filter for filtering without scoring\nRange queries on dates/numbers almost always belong in filter, not query"
      },
      {
        "title": "Analyzers",
        "body": "standard analyzer lowercases and removes punctuation—fine for most text\nkeyword analyzer keeps exact string—use for codes, SKUs, emails\nLanguage analyzers (english) stem words—\"running\" matches \"run\"\nTest analyzer with _analyze endpoint before indexing—surprises in production hurt"
      },
      {
        "title": "Nested vs Object",
        "body": "Object type flattens arrays—{\"tags\": [{\"key\":\"a\",\"val\":1}, {\"key\":\"b\",\"val\":2}]} becomes tags.key: [a,b], tags.val: [1,2]\nFlattened loses association—query key=a AND val=2 incorrectly matches above\nUse nested type to preserve object boundaries—requires nested query wrapper\nNested is expensive—avoid for high-cardinality arrays"
      },
      {
        "title": "Pagination Traps",
        "body": "from + size limited to 10,000 hits—deep pagination fails\nsearch_after for deep pagination—requires consistent sort, typically _id\nScroll API for bulk export—keeps point-in-time view, but ties up resources\nDon't use scroll for user pagination—search_after is correct choice"
      },
      {
        "title": "Bulk Operations",
        "body": "Never index documents one-by-one—use _bulk API, 5-15MB batches\nBulk format: newline-delimited JSON, action line then document line\nCheck response for partial failures—bulk can succeed overall with individual doc errors\nSet refresh=false during bulk loads—refresh after batch completes"
      },
      {
        "title": "Performance",
        "body": "_source: false with stored_fields if you don't need full document—reduces I/O\nUse filter for cacheable conditions—Elasticsearch caches filter results\nAvoid leading wildcards (*term)—forces full scan; use reverse field for suffix search\nprofile: true shows query execution breakdown—find slow clauses"
      },
      {
        "title": "Sharding",
        "body": "Shard size 10-50GB optimal—too small = overhead, too large = slow recovery\nNumber of shards fixed at creation—can't reshard without reindexing\nReplicas for read throughput and availability—set based on query load\nStart with 1 shard for small indices—over-sharding kills performance"
      },
      {
        "title": "Index Management",
        "body": "Use index templates—new indices get consistent mappings and settings\nUse aliases for zero-downtime reindexing—point alias to new index after reindex\nILM (Index Lifecycle Management) for time-series—auto-rollover, delete old indices\nClose unused indices to free memory—closed index uses no heap"
      },
      {
        "title": "Aggregations",
        "body": "terms agg needs keyword field—text fields fail or give garbage\nDefault size: 10 on terms agg—increase to get all buckets, or use composite\nCardinality is approximate (HyperLogLog)—exact count requires scanning all docs\nNested aggs require nested wrapper—matches nested query pattern"
      },
      {
        "title": "Common Errors",
        "body": "\"cluster_block_exception\"—disk > 85%, cluster goes read-only; clear disk, reset with _cluster/settings\n\"version conflict\"—concurrent update; retry with retry_on_conflict or use optimistic locking\n\"circuit_breaker_exception\"—query uses too much memory; reduce aggregation scope\nMapping explosion from dynamic fields—set index.mapping.total_fields.limit and use strict mapping"
      }
    ],
    "body": "Mapping Mistakes\nAlways define explicit mappings—dynamic mapping guesses wrong (first \"123\" makes field integer, later \"abc\" fails)\ntext for full-text search, keyword for exact match/aggregations—using text for IDs breaks filters\nCan't change field type after indexing—must reindex to new index with correct mapping\nSet dynamic: \"strict\" to reject unmapped fields—catches typos in field names\nText vs Keyword\ntext is analyzed (tokenized, lowercased)—\"Quick Brown\" matches search for \"quick\"\nkeyword is exact bytes—\"Quick Brown\" only matches exactly \"Quick Brown\"\nNeed both? Use multi-field: \"title\": { \"type\": \"text\", \"fields\": { \"raw\": { \"type\": \"keyword\" }}}\nSort/aggregate on title.raw, search on title\nQuery vs Filter Context\nQuery context calculates relevance score—expensive, use for search ranking\nFilter context is yes/no—cacheable, use for exact conditions (status, date ranges)\nCombine: bool.must for scoring, bool.filter for filtering without scoring\nRange queries on dates/numbers almost always belong in filter, not query\nAnalyzers\nstandard analyzer lowercases and removes punctuation—fine for most text\nkeyword analyzer keeps exact string—use for codes, SKUs, emails\nLanguage analyzers (english) stem words—\"running\" matches \"run\"\nTest analyzer with _analyze endpoint before indexing—surprises in production hurt\nNested vs Object\nObject type flattens arrays—{\"tags\": [{\"key\":\"a\",\"val\":1}, {\"key\":\"b\",\"val\":2}]} becomes tags.key: [a,b], tags.val: [1,2]\nFlattened loses association—query key=a AND val=2 incorrectly matches above\nUse nested type to preserve object boundaries—requires nested query wrapper\nNested is expensive—avoid for high-cardinality arrays\nPagination Traps\nfrom + size limited to 10,000 hits—deep pagination fails\nsearch_after for deep pagination—requires consistent sort, typically _id\nScroll API for bulk export—keeps point-in-time view, but ties up resources\nDon't use scroll for user pagination—search_after is correct choice\nBulk Operations\nNever index documents one-by-one—use _bulk API, 5-15MB batches\nBulk format: newline-delimited JSON, action line then document line\nCheck response for partial failures—bulk can succeed overall with individual doc errors\nSet refresh=false during bulk loads—refresh after batch completes\nPerformance\n_source: false with stored_fields if you don't need full document—reduces I/O\nUse filter for cacheable conditions—Elasticsearch caches filter results\nAvoid leading wildcards (*term)—forces full scan; use reverse field for suffix search\nprofile: true shows query execution breakdown—find slow clauses\nSharding\nShard size 10-50GB optimal—too small = overhead, too large = slow recovery\nNumber of shards fixed at creation—can't reshard without reindexing\nReplicas for read throughput and availability—set based on query load\nStart with 1 shard for small indices—over-sharding kills performance\nIndex Management\nUse index templates—new indices get consistent mappings and settings\nUse aliases for zero-downtime reindexing—point alias to new index after reindex\nILM (Index Lifecycle Management) for time-series—auto-rollover, delete old indices\nClose unused indices to free memory—closed index uses no heap\nAggregations\nterms agg needs keyword field—text fields fail or give garbage\nDefault size: 10 on terms agg—increase to get all buckets, or use composite\nCardinality is approximate (HyperLogLog)—exact count requires scanning all docs\nNested aggs require nested wrapper—matches nested query pattern\nCommon Errors\n\"cluster_block_exception\"—disk > 85%, cluster goes read-only; clear disk, reset with _cluster/settings\n\"version conflict\"—concurrent update; retry with retry_on_conflict or use optimistic locking\n\"circuit_breaker_exception\"—query uses too much memory; reduce aggregation scope\nMapping explosion from dynamic fields—set index.mapping.total_fields.limit and use strict mapping"
  },
  "trust": {
    "sourceLabel": "tencent",
    "provenanceUrl": "https://clawhub.ai/ivangdavila/elasticsearch",
    "publisherUrl": "https://clawhub.ai/ivangdavila/elasticsearch",
    "owner": "ivangdavila",
    "version": "1.0.0",
    "license": null,
    "verificationStatus": "Indexed source record"
  },
  "links": {
    "detailUrl": "https://openagent3.xyz/skills/elasticsearch",
    "downloadUrl": "https://openagent3.xyz/downloads/elasticsearch",
    "agentUrl": "https://openagent3.xyz/skills/elasticsearch/agent",
    "manifestUrl": "https://openagent3.xyz/skills/elasticsearch/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/elasticsearch/agent.md"
  }
}