Repository: jolicode/elasticsearch-cheatsheet
Branch: gh-pages
Commit: a93b18938c53
Files: 8
Total size: 61.3 KB
Directory structure:
gitextract_vhv_1t45/
├── CNAME
├── LICENSE
├── README.md
├── index.html
├── javascripts/
│ └── prism.js
├── semantic-UI/
│ ├── LICENSE
│ └── themes/
│ └── default/
│ └── assets/
│ └── fonts/
│ └── icons.otf
└── stylesheets/
└── prism.css
================================================
FILE CONTENTS
================================================
================================================
FILE: CNAME
================================================
elasticsearch-cheatsheet.jolicode.com
================================================
FILE: LICENSE
================================================
The MIT License (MIT)
Copyright (c) 2016 JoliCode
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
================================================
FILE: README.md
================================================
# Elasticsearch Cheatsheet for developpers
https://elasticsearch-cheatsheet.jolicode.com/
# License
MIT, see LICENSE file.
================================================
FILE: index.html
================================================
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0">
<title>Elasticsearch Cheat Sheet for developers</title>
<meta name="description" content="Elasticsearch API cheatsheet for developers with copy and paste example for the most useful APIs">
<link rel="shortcut icon" href="./favicon.ico"/>
<link rel="canonical" href="https://elasticsearch-cheatsheet.jolicode.com/" />
<link rel="stylesheet" type="text/css" href="./semantic-UI/semantic.min.css">
<script src="./javascripts/jquery-2.2.4.min.js"></script>
<script src="./javascripts/clipboard.min.js"></script>
<script src="./semantic-UI/semantic.min.js"></script>
<link href="./stylesheets/prism.css" rel="stylesheet" />
<style type="text/css">
.toolbar-item button {
color: #EEE !important;
background-color: #333 !important;
padding: 5px !important;;
}
pre[class*="language-"] {
padding-bottom: 0.5em;
padding-top: 0.5em;
}
</style>
<script>
$(document)
.ready(function() {
// fix main menu to page on passing
$('.main.menu').visibility({
type: 'fixed'
});
// show dropdown on hover
$('.main.menu .ui.dropdown').dropdown({
on: 'hover'
});
function updateElasticsearchVersion() {
if (location.hash.match(/#es[0-9]+/) !== null) {
var className = location.hash.replace('#', '');
document.body.className = className;
//window.scrollTo(0, 0);
}
}
window.onhashchange = updateElasticsearchVersion;
updateElasticsearchVersion();
})
;
</script>
<style type="text/css">
body {
background-color: #FFFFFF;
}
.main.container {
margin-top: 2em;
}
/*See https://github.com/Semantic-Org/Semantic-UI/issues/4342*/
.divider-column {
position: relative;
padding: 0 !important;
}
pre code { display: block; }
pre + pre { padding-top: 0 !important; }
pre[class*="language-"] { padding-bottom: 0.5em; }
code.language-json:not(.json-only):first-line { font-weight: bold; color: black; }
body.es1 .es2:not(.es1), body.es1 .es5:not(.es1), body.es1 .es6:not(.es1), body.es1 .es7:not(.es1), body.es1 .es8:not(.es1) {
display: none!important;
}
body.es2 .es1:not(.es2), body.es2 .es5:not(.es2), body.es2 .es6:not(.es2), body.es2 .es7:not(.es2), body.es2 .es8:not(.es2) {
display: none!important;
}
body.es5 .es1:not(.es5), body.es5 .es2:not(.es5), body.es5 .es6:not(.es5), body.es5 .es7:not(.es5), body.es5 .es8:not(.es5) {
display: none!important;
}
body.es6 .es1:not(.es6), body.es6 .es2:not(.es6), body.es6 .es5:not(.es6), body.es6 .es7:not(.es6), body.es6 .es8:not(.es6) {
display: none!important;
}
body.es7 .es1:not(.es7), body.es7 .es2:not(.es7), body.es7 .es5:not(.es7), body.es7 .es6:not(.es7), body.es7 .es8:not(.es7) {
display: none!important;
}
body.es8 .es1:not(.es8), body.es8 .es2:not(.es8), body.es8 .es5:not(.es8), body.es8 .es6:not(.es8), body.es8 .es7:not(.es8) {
display: none!important;
}
</style>
</head>
<body class="es8">
<div class="ui main text container">
<img class="es2 es5 es6 es7 es8 ui tiny right floated image" src="./images/Elasticsearch-Logo-Color-V-sm.png">
<img class="es1 ui tiny right floated image" src="./images/Elasticsearch1-Logo-Color-V-sm.png">
<h1 class="ui header">🔎 Elasticsearch
<span class="es1">1.x</span>
<span class="es2">2.x</span>
<span class="es5">5.x</span>
<span class="es6">6.x</span>
<span class="es7">7.x</span>
<span class="es8">8.x</span>
Cheatsheet 🔍</h1>
<p>
All the API endpoints and pro-tips you always forgot about in one place!<br />
Built by developers for developers. Hosted on <a href="https://github.com/jolicode/elasticsearch-sheatsheet">GitHub</a>, contributions welcome.
</p>
</div>
<div class="ui borderless main menu">
<div class="ui text container">
<a href="#links" class="item">Links</a>
<a href="#queries" class="item">Queries</a>
<a href="#indexes" class="item">Indexes</a>
<a href="#debug" class="item">Debug</a>
<a href="#cluster" class="item">Cluster & Plugins</a>
<div class="ui right floated dropdown item js-version-selector">
<span class="es1">Elasticsearch 1.X</span>
<span class="es2">Elasticsearch 2.X</span>
<span class="es5">Elasticsearch 5.X</span>
<span class="es6">Elasticsearch 6.X</span>
<span class="es7">Elasticsearch 7.X</span>
<span class="es8">Elasticsearch 8.X</span>
<i class="dropdown icon"></i>
<div class="menu">
<div class="item es2 es5 es6 es7 es8"><a href="#es1">Elasticsearch 1.X</a></div>
<div class="item es1 es5 es6 es7 es8"><a href="#es2">Elasticsearch 2.X</a></div>
<div class="item es1 es2 es6 es7 es8"><a href="#es5">Elasticsearch 5.X</a></div>
<div class="item es1 es2 es5 es7 es8"><a href="#es6">Elasticsearch 6.X</a></div>
<div class="item es1 es2 es5 es6 es8"><a href="#es7">Elasticsearch 7.X</a></div>
<div class="item es1 es2 es5 es6 es7"><a href="#es8">Elasticsearch 8.X</a></div>
</div>
</div>
</div>
</div>
<div class="ui text container language-json">
<div class="es1 ui secondary orange segment">
<p>Elasticsearch 1.7 is End Of Life. Consider upgrading.
<a href="https://www.elastic.co/support/eol">More information about supported versions</a>.</p>
</div>
<div class="es2 ui secondary orange segment">
<p>Elasticsearch 2.4 is End Of Life. Consider upgrading.
<a href="https://www.elastic.co/support/eol">More information about supported versions</a>.</p>
</div>
<div class="es5 ui secondary orange segment">
<p>Elasticsearch 5.6 is End Of Life. Consider upgrading.
<a href="https://www.elastic.co/support/eol">More information about supported versions</a>.</p>
</div>
<div class="es6 ui secondary orange segment">
<p>Elasticsearch 6.8 is End Of Life. Consider upgrading.
<a href="https://www.elastic.co/support/eol">More information about supported versions</a>.</p>
</div>
<a name="links"></a>
<h2 class="ui dividing header">Links</h2>
<p class="es2">
First thing, forget about your <code>curl</code> calls and <strong>install <a href="https://www.elastic.co/guide/en/sense/current/installing.html">Sense</a> please!</strong>
</p>
<p class="es5 es6 es7 es8">
First thing, forget about your <code>curl</code> calls and <strong>install <a href="https://www.elastic.co/products/kibana">Kibana</a> please!</strong>
</p>
<ul>
<li class="es1"><a href="https://www.elastic.co/guide/en/elasticsearch/guide/1.x/index.html">Elasticsearch: The Definitive Guide</a>, official book;</li>
<li class="es2"><a href="https://www.elastic.co/guide/en/elasticsearch/guide/2.x/index.html">Elasticsearch: The Definitive Guide</a>, official book;</li>
<li class="es5 es6"><a href="https://www.elastic.co/guide/en/elasticsearch/guide/master/index.html">Elasticsearch: The Definitive Guide</a>, official book (not up to date);</li>
<li class="es1 es2 es5 es6"><a href="https://www.elastic.co/downloads/past-releases/#elasticsearch">Download Elasticsearch</a>, official download page;</li>
<li class="es7 es8"><a href="https://www.elastic.co/downloads/elasticsearch">Download Elasticsearch</a>, official download page;</li>
<li class="es6 es7"><a href="https://www.elastic.co/downloads/past-releases#elasticsearch-oss">Download pure OSS Elasticsearch</a> (<= 7.10.2 only), Apache licensed download page;</li>
<li class="es1"><a href="https://www.elastic.co/guide/en/elasticsearch/reference/1.7/index.html">Elasticsearch Reference</a>, official documentation;</li>
<li class="es2"><a href="https://www.elastic.co/guide/en/elasticsearch/reference/2.3/index.html">Elasticsearch Reference</a>, official documentation;</li>
<li class="es5"><a href="https://www.elastic.co/guide/en/elasticsearch/reference/5.6/index.html">Elasticsearch Reference</a>, official documentation;</li>
<li class="es6"><a href="https://www.elastic.co/guide/en/elasticsearch/reference/6.x/index.html">Elasticsearch Reference</a>, official documentation;</li>
<li class="es7"><a href="https://www.elastic.co/guide/en/elasticsearch/reference/7.x/index.html">Elasticsearch Reference</a>, official documentation;</li>
<li class="es8"><a href="https://www.elastic.co/guide/en/elasticsearch/reference/8.1/index.html">Elasticsearch Reference</a>, official documentation;</li>
<li class="es5 es6 es7 es8"><a href="https://www.docker.elastic.co/">Docker repository</a>, quick start any Elastic software;</li>
<li><a href="https://dev.to/t/elasticsearch">Dev.to Elasticsearch</a>, great source of content about Elastic;</li>
<li><a href="https://discuss.elastic.co/">Official forum</a> and <a href="http://stackoverflow.com/questions/tagged/elasticsearch">StackOverflow</a> for support;</li>
<li class="es5"><a href="https://www.elastic.co/products/upgrade_guide">Official online migration tool</a> to help upgrading the stack to 6.x;</li>
<li class="es5 es6 es7"><a href="https://github.com/moshe/elasticsearch-comrade">Comrade</a>: a Python based Elasticsearch web admin and monitoring panel;</li>
<li class="es2 es5 es6 es7"><a href="https://github.com/lmenezes/cerebro">Cerebro</a>: a Java based Elasticsearch web admin;</li>
</ul>
<a name="queries"></a>
<h2 class="ui dividing header">Queries</h2>
<p>
There are two syntaxes for the basic queries: a simple one on the left, where you can't use any option,
and an extended one on the right. Most of the beginner headache with the DSL come from this:
</p>
<div class="ui two column very relaxed grid" style="position:relative;">
<div class="column">
<pre><code>GET _search
{
"query": {
"match": {
"FIELD": "TEXT"
}
}
}</code></pre>
</div>
<div class="divider-column">
<div class="ui vertical divider">
to
</div>
</div>
<div class="column">
<pre><code>GET _search
{
"query": {
"match": {
"FIELD": {
"query": "TEXT",
"OPTION": "VALUE"
}
}
}
}</code></pre>
</div>
</div>
<h3 class="ui header">Full search example with aggregation, highlight, filter...</h3>
<pre class="es1"><code>GET /_search
{
"query": {
"filtered": {
"query": {
"bool": {
"must": [
{
"match": {
"title": "smith"
}
}
],
"must_not": [
{
"match_phrase": {
"title": "granny smith"
}
}
]
}
},
"filter": {
"bool": {
"must_not": [
{
"missing": {
"field": "title"
}
}
]
}
}
}
},
"aggs": {
"my_agg": {
"terms": {
"field": "user",
"size": 10
}
}
},
"highlight": {
"pre_tags" : ["<em>"],
"post_tags" : ["</em>"],
"fields": {
"body" : {
"number_of_fragments": 1,
"fragment_size": 20
},
"title": {}
}
},
"size": 20,
"from": 100,
"_source": ["title", "id"],
"sort": [
{ "_id" : {"order" : "desc"}}
]
}</code></pre>
<pre class="es2 es5 es6 es7 es8"><code>GET /_search
{
"query": {
"bool": {
"must": [
{
"match": {
"title": "smith"
}
}
],
"must_not": [
{
"match_phrase": {
"title": "granny smith"
}
}
],
"filter": [
{
"exists": {
"field": "title"
}
}
]
}
},
"aggs": {
"my_agg": {
"terms": {
"field": "user",
"size": 10
}
}
},
"highlight": {
"pre_tags": [
"<em>"
],
"post_tags": [
"</em>"
],
"fields": {
"body": {
"number_of_fragments": 1,
"fragment_size": 20
},
"title": {}
}
},
"size": 20,
"from": 100,
"_source": [
"title",
"id"
],
"sort": [
{
"_id": {
"order": "desc"
}
}
]
}</code></pre>
<h3 class="ui header es7 es8">Control total hit count</h3>
<p class="es7 es8">Accept true, false or a fixed number, default to 10000.</p>
<pre class="es7 es8"><code>GET /_search
{
"track_total_hits": true,
"query": {}
}</code></pre>
<h3 class="ui header">Common queries</h3>
<div class="ui grid">
<div class="eight wide column"><pre><code class="json-only">"multi_match": {
"query": "Elastic",
"fields": ["user.*", "title^3"],
"type": "best_fields"
}</code></pre></div>
<div class="eight wide column es2 es5 es6 es7 es8"><pre><code class="json-only">"bool": {
"must": [],
"must_not": [],
"filter": [],
"should": [],
"minimum_should_match" : 1
}</code></pre></div>
<div class="eight wide column es1"><pre><code class="json-only">"bool": {
"must": [],
"must_not": [],
"should": [],
"minimum_should_match" : 1
}</code></pre></div>
<div class="eight wide column es1"><pre><code class="json-only">"filtered": {
"query": {
"match_all": {}
},
"filter": {
"range": {...}
}
}
</code></pre></div>
<div class="eight wide column"><pre><code class="json-only">"range": {
"age": {
"gte": 10,
"lte": 20,
"boost": 2
}
}</code></pre></div>
</div>
<h3 class="ui header">QueryString syntax</h3>
<p>
Search in the default <code>_all</code> field:
</p>
<pre><code>GET /_search?q=pony</code></pre>
<p>
Complex search with operator and exact phrase search with boost:
</p>
<pre><code>GET /_search?q=title:(joli OR code) AND author:"Damien Alexandre"^2</code></pre>
<p>
Search with wildcard and special queries:
</p>
<pre><code>GET /_search?q=_exists_:title OR title:singl? noneOrAnyChar*cter</code></pre>
<p>
Search with fuzzyness and range:
</p>
<pre><code>GET /_search?q=title:elastichurch~3 AND date:[2016-01-01 TO 2018-12-31]</code></pre>
<p>
Use in Query DSL (not recommended for user search):
</p>
<pre><code>GET /_search
{
"query": {
"query_string": {
"default_field": "content",
"query": "elastic AND (title:lucene OR title:solr)"
}
}
}</code></pre>
<h3 class="ui header">Search After - Pagination cursor</h3>
<p>
Search with a custom sort:
</p>
<pre><code>GET products/_search
{
"size": 10,
"sort": [
{"date": "asc"},
{"_id": "desc"}
]
}</code></pre>
<p>
On the next "page", pass the sort values from the last result:
</p>
<pre><code>GET product/_search
{
"size": 10,
"search_after": [1463538857, "654323"],
"sort": [
{"date": "asc"},
{"_id": "desc"}
]
}</code></pre>
<a name="indexes"></a>
<h2 class="ui dividing header">Indexes and mapping</h2>
<h3 class="ui header">Create an index with settings and mapping</h3>
<pre class="es1 es2"><code>PUT /my_index_name
{
"settings": {
"number_of_replicas": 1,
"number_of_shards": 3,
"analysis": {},
"refresh_interval": "1s"
},
"mappings": {
"my_type_name": {
"dynamic": false,
"properties": {
"title": {
"type": "string",
"analyzer": "english"
}
}
}
}
}</code></pre>
<pre class="es5 es6"><code>PUT /my_index_name
{
"settings": {
"number_of_replicas": 1,
"number_of_shards": 3,
"analysis": {},
"refresh_interval": "1s"
},
"mappings": {
"my_type_name": {
"dynamic": false,
"properties": {
"title": {
"type": "text",
"analyzer": "english"
}
}
}
}
}</code></pre>
<pre class="es7 es8"><code>PUT /my_index_name
{
"settings": {
"number_of_replicas": 1,
"number_of_shards": 3,
"analysis": {},
"refresh_interval": "1s"
},
"mappings": {
"dynamic": false,
"properties": {
"title": {
"type": "text",
"analyzer": "english"
}
}
}
}</code></pre>
<div class="es6 es7 ui secondary orange segment">
<p><a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/removal-of-types.html">Types are deprecated</a>, you can only use one in Elasticsearch 6.</p>
</div>
<h3 class="ui header">Update index settings dynamically</h3>
<pre><code>PUT /my_index_name/_settings
{
"index": {
"refresh_interval": "-1",
"number_of_replicas": 0
}
}</code></pre>
<h3 class="ui header">Update an index by adding a field to a type</h3>
<pre class="es1 es2"><code>PUT /my_index_name/_mapping/my_type_name
{
"my_type_name": {
"properties": {
"tag": {
"type": "string",
"index": "not_analyzed"
}
}
}
}</code></pre>
<pre class="es5 es6"><code>PUT /my_index_name/_mapping/my_type_name
{
"my_type_name": {
"properties": {
"tag": {
"type": "keyword"
}
}
}
}</code></pre>
<pre class="es7 es8"><code>PUT /my_index_name/_mapping
{
"properties": {
"tag": {
"type": "keyword"
}
}
}</code></pre>
<h3 class="ui header">Get the mapping and the settings</h3>
<pre><code>GET /my_index_name</code></pre>
<pre><code>GET /my_index_name/_mapping</code></pre>
<pre><code>GET /my_index_name/_settings</code></pre>
<h3 class="ui header">Create a document (auto-generated ID)</h3>
<pre class="es1 es2 es5 es6"><code>POST /my_index_name/my_type_name
{
"title": "Elastic is funny",
"tag": [
"lucene"
]
}</code></pre>
<pre class="es7 es8"><code>POST /my_index_name/_doc
{
"title": "Elastic is funny",
"tag": [
"lucene"
]
}</code></pre>
<h3 class="ui header">Get a document</h3>
<pre class="es1 es2 es5 es6"><code>GET /my_index_name/my_type_name/12abc</code></pre>
<pre class="es7 es8"><code>GET /my_index_name/_doc/12abc</code></pre>
<h3 class="ui header">Create or update a document</h3>
<pre class="es1 es2 es5 es6"><code>PUT /my_index_name/my_type_name/12abc
{
"title": "Elastic is funny",
"tag": [
"lucene"
]
}</code></pre>
<pre class="es7 es8"><code>PUT /my_index_name/_doc/12abc
{
"title": "Elastic is funny",
"tag": [
"lucene"
]
}</code></pre>
<h3 class="ui header">Delete a document</h3>
<pre class="es1 es2 es5 es6"><code>DELETE /my_index_name/my_type_name/12abc</code></pre>
<pre class="es7 es8"><code>DELETE /my_index_name/_doc/12abc</code></pre>
<h3 class="ui header">Open and close indexes to save memory and CPU</h3>
<pre><code>POST /my_index_name/_close</code></pre>
<pre><code>POST /my_index_name/_open</code></pre>
<h3 class="ui header">Remove and create aliases</h3>
<pre><code>POST /_aliases
{
"actions": [
{
"remove": {
"index": "my_index_name",
"alias": "foo"
}
},
{
"add": {
"index": "my_index_name",
"alias": "bar",
"filter" : { "term" : { "user" : "damien" } }
}
}
]
}</code></pre>
<h3 class="ui header">List aliases</h3>
<pre><code>GET /_aliases</code></pre>
<pre><code>GET /my_index_name/_alias/*</code></pre>
<pre><code>GET /*/_alias/*</code></pre>
<pre><code>GET /*/_alias/foo</code></pre>
<h3 class="ui header">Full custom analyzer declaration</h3>
<pre><code>PUT /english_example
{
"settings": {
"analysis": {
"filter": {
"english_stop": {
"type": "stop",
"stopwords": "_english_"
},
"english_stemmer": {
"type": "stemmer",
"language": "english"
}
},
"analyzer": {
"my_english": {
"char_filter": ["html_strip"],
"tokenizer": "standard",
"filter": [
"lowercase",
"english_stop",
"english_stemmer"
]
}
}
}
}
}</code></pre>
<h3 class="ui header es1 es2">Create and list index warmer</h3>
<p class="es1 es2">
Create a query that will be played on every new document:
</p>
<pre class="es1 es2"><code>PUT /my_index_name/_warmer/my_warmer
{
"query": {
"match_all": {}
},
"aggs": {
"costly_aggs": {
"terms": {
"field": "title"
}
}
}
}</code></pre>
<pre class="es1 es2"><code>GET /my_index_name/_warmer</code></pre>
<pre class="es1 es2"><code>GET /my_index_name/_warmer/*</code></pre>
<h3 class="ui header">Indices monitoring and information</h3>
<pre><code>GET /my_index_name/_stats</code></pre>
<pre><code>GET /my_index_name/_segments</code></pre>
<pre><code>GET /my_index_name/_recovery?pretty&human</code></pre>
<pre class="es1 es2"><code>GET /my_index_name/_warmer/*</code></pre>
<h3 class="ui header">Indices status and management</h3>
<pre><code>POST /my_index_name/_cache/clear</code></pre>
<pre><code>POST /my_index_name/_refresh</code></pre>
<pre><code>POST /my_index_name/_flush</code></pre>
<pre class="es1"><code>POST /my_index_name/_optimize</code></pre>
<pre class="es2 es5 es6 es7 es8"><code>POST /my_index_name/_forcemerge</code></pre>
<div class="es2 es5 es6 es7 es8">
<h2 class="ui dividing header">Reindex API</h2>
<h3 class="ui header">Simple Reindex Operation</h3>
<pre class=""><code>POST /_reindex
{
"source": {
"index": "test-index"
},
"dest": {
"index": "test-index-new"
}
}</code></pre>
<h3 class="ui header">Selective Reindex Operation</h3>
<pre><code>POST /_reindex
{
"source": {
"index": "test-index",
"query": {
"match": {
"gender": "female"
}
}
},
"dest": {
"index": "test-index-new",
"type": "female"
}
}</code></pre>
</div>
<a name="debug"></a>
<h2 class="ui dividing header">Debug and development</h2>
<h3 class="ui header">Queries</h3>
<p>Get a detailed view of what a query do:</p>
<pre><code>GET /blog/_validate/query?explain=true
{
"query": {
"match": {
"title": "Smith"
}
}
}</code></pre>
<p>Get an explanation about a document matching or not:</p>
<pre class="es1 es2 es5 es6"><code>GET /blog/post/1/_explain
{
"query": {
"match": {
"title": "Smith"
}
}
}</code></pre>
<pre class="es7 es8"><code>GET /blog/_explain/1
{
"query": {
"match": {
"title": "Smith"
}
}
}</code></pre>
<h3 class="ui header">Analysis</h3>
<p>Test how a content is tokenized in a field:</p>
<pre><code>GET /blog/_analyze
{
"field": "title",
"text": "powerful"
}</code></pre>
<p>Test analyzer token output by analyzer:</p>
<pre><code>GET /blog/_analyze
{
"analyzer": "english",
"text": "powerful"
}</code></pre>
<h3 class="ui header">Slowlog</h3>
<p>Lower the slowlog threshold to see all the search queries in the logs:</p>
<pre><code>PUT /blog/_settings
{
"index.search.slowlog.threshold.query.trace": "0s",
"index.search.slowlog.level": "trace"
}</code></pre>
<p>Go back to the default configuration:</p>
<pre><code>PUT /blog/_settings
{
"index.search.slowlog.threshold.query.trace": "500ms",
"index.search.slowlog.level": "info"
}</code></pre>
<a name="cluster"></a>
<h2 class="ui dividing header">Cluster management and plugins</h2>
<div class="es5 es6 es7 es8">
<h3 class="ui header">Running with Docker</h3>
<p>Elasticsearch:</p>
<pre class="es8"><code>docker network create elastic
docker run --rm -it --name "elastically_es" -e "discovery.type=single-node" --net elastic docker.elastic.co/elasticsearch/elasticsearch:8.1.2</code></pre>
<p class="es8">Have a look at the output for password and enrollment token!</p>
<pre class="es7"><code>docker run --rm -it --name "elastically_es" -p 9200:9200 -e "discovery.type=single-node" docker.elastic.co/elasticsearch/elasticsearch:7.17.2</code></pre>
<pre class="es6"><code>docker run -d --name "elastically_es" -p 9200:9200 -e "discovery.type=single-node" docker.elastic.co/elasticsearch/elasticsearch:6.8.6</code></pre>
<pre class="es5"><code>docker run -d --name "elastically_es" -p 9200:9200 -e "discovery.type=single-node" docker.elastic.co/elasticsearch/elasticsearch:5.6.16</code></pre>
<p>Kibana:</p>
<pre class="es8"><code>docker run --rm -it --name "elastically_kibana" --net elastic -p 5601:5601 docker.elastic.co/kibana/kibana:8.1.2</code></pre>
<pre class="es7"><code>docker run -e "ELASTICSEARCH_HOSTS=http://127.0.0.1:9200/" --network host docker.elastic.co/kibana/kibana:7.17.2</code></pre>
<pre class="es6"><code>docker run -e "ELASTICSEARCH_HOSTS=http://127.0.0.1:9200/" --network host docker.elastic.co/kibana/kibana:6.8.6</code></pre>
<pre class="es5"><code>docker run -e "ELASTICSEARCH_HOSTS=http://127.0.0.1:9200/" --network host docker.elastic.co/kibana/kibana:5.6.16</code></pre>
</div>
<h3 class="ui header">Cluster and node information</h3>
<pre><code>GET /_cluster/health?pretty</code></pre>
<pre><code>GET /_cluster/health?wait_for_status=yellow&timeout=50s</code></pre>
<pre><code>GET /_cluster/state</code></pre>
<pre><code>GET /_cluster/stats?human&pretty</code></pre>
<pre><code>GET /_cluster/pending_tasks</code></pre>
<pre><code>GET /_nodes</code></pre>
<pre><code>GET /_nodes/stats</code></pre>
<pre><code>GET /_nodes/nodeId1,nodeId2/stats</code></pre>
<pre class="es1"><code>GET /_shutdown 😱</code></pre>
<p>Get the full reference of <strong>all</strong> the settings:</p>
<pre><code>GET /_cluster/settings?include_defaults=true&flat_settings=true</code></pre>
<h3 class="ui header">Moving shards manually</h3>
<p>
Ask the index my_index_name shard 0 of node1 to go to node2:
</p>
<pre><code>POST /_cluster/reroute
{
"commands": [
{
"move": {
"index": "my_index_name",
"shard": 0,
"from_node": "node1",
"to_node": "node2"
}
},
{
"allocate": {
"index": "my_index_name",
"shard": 1,
"node": "node3"
}
}
]
}</code></pre>
<h3 class="ui header">Updating settings</h3>
<div class="es1 es2 es5 es6">
<p>
Change dynamically the minimum number of nodes to allow a master election, both persistent or not:
</p>
<pre><code>PUT /_cluster/settings
{
"persistent": {
"discovery.zen.minimum_master_nodes": 3
}
}</code></pre>
<pre><code>PUT /_cluster/settings
{
"transient": {
"discovery.zen.minimum_master_nodes": 2
}
}</code></pre>
</div>
<p>
Disable shard allocation, useful before a rolling restart:
</p>
<pre><code>PUT /_cluster/settings
{
"transient" : {
"cluster.routing.allocation.enable" : "none"
}
}</code></pre>
<pre><code>PUT /_cluster/settings
{
"transient" : {
"cluster.routing.allocation.enable" : "all"
}
}</code></pre>
<h3 class="ui header">Snapshots and Restore</h3>
<pre><code>PUT /_snapshot/my_backup
{
"type": "fs",
"settings": {
"location": "my_backup_location"
}
}</code></pre>
<pre><code>PUT /_snapshot/my_backup/snapshot_a
{
"indices": "index_1,index_2",
"ignore_unavailable": "true",
"include_global_state": false
}</code></pre>
<pre><code>POST /_snapshot/my_backup/snapshot_a/_restore
{
"indices": "index_1,index_2",
"ignore_unavailable": "true",
"include_global_state": false,
"rename_pattern": "index_(.+)",
"rename_replacement": "restored_index_$1"
}</code></pre>
<h3 class="ui header">Most useful plugins</h3>
<div class="es5 es6 es7 es8 ui secondary orange segment">
<p>Site plugins are no longer supported, look at Kibana applications or other standalone app like <a href="https://github.com/lmenezes/cerebro">Cerebro</a> for basic management.</p>
</div>
<div class="ui celled list">
<div class="item es1 es2">
<div class="content">
<div class="header">Kopf</div>
<div class="description"><p>Nice and easy user interface to manage Elasticsearch, with forms for a lots of API.</p></div>
<div class="extra">
<code class="es1">bin/plugin --install lmenezes/elasticsearch-kopf/1.0</code>
<code class="es2">bin/plugin install lmenezes/elasticsearch-kopf/2.0</code>
</div>
</div>
</div>
<div class="item es1">
<div class="content">
<div class="header">Marvel</div>
<div class="description"><p>Official monitoring solution.</p></div>
<div class="extra">
<code>bin/plugin --install elasticsearch/marvel/1.3</code>
</div>
</div>
</div>
<div class="item es1 es2">
<div class="content">
<div class="header">Elasticsearch-HQ</div>
<div class="description"><p>Monitoring, Management, and statistics analysis.</p></div>
<div class="extra">
<code class="es1">bin/plugin --install royrusso/elasticsearch-HQ/v1.0.0</code>
<code class="es2">bin/plugin install royrusso/elasticsearch-HQ</code>
</div>
</div>
</div>
<div class="item es1 es2">
<div class="content">
<div class="header">Mapper-Attachments</div>
<div class="description"><p>Index file attachments in over a thousand formats (such as PPT, XLS, PDF) using the Apache text extraction library Tika.</p></div>
<div class="extra">
<code class="es1">bin/plugin --install elasticsearch/elasticsearch-mapper-attachments/2.7.1</code>
<code class="es2">bin/plugin install elasticsearch/elasticsearch-mapper-attachments</code>
</div>
</div>
</div>
<div class="item">
<div class="content">
<div class="header">Analysis ICU</div>
<div class="description"><p>Adding useful tokenizer and token filters from the Unicode ICU library.</p></div>
<div class="extra">
<code class="es1">bin/plugin --install elasticsearch/elasticsearch-analysis-icu/2.7.0</code>
<code class="es2">bin/plugin install analysis-icu</code>
<code class="es5 es6 es7 es8">bin/elasticsearch-plugin install analysis-icu</code>
</div>
</div>
</div>
<div class="item">
<div class="content">
<div class="header">AWS Cloud</div>
<div class="description"><p>Allow discovery and storage in Amazon cloud (EC2 and S3).</p></div>
<div class="extra">
<code class="es1">bin/plugin --install elasticsearch/elasticsearch-cloud-aws/2.7.1</code>
<code class="es2">bin/plugin install cloud-aws</code>
<code class="es5 es6 es7 es8">bin/elasticsearch-plugin install discovery-ec2</code>
<code class="es5 es6 es7 es8">bin/elasticsearch-plugin install repository-s3</code>
</div>
</div>
</div>
<div class="item">
<div class="content">
<div class="header">Azure Cloud</div>
<div class="description"><p>Allow discovery and storage in Microsoft Azure cloud.</p></div>
<div class="extra">
<code class="es1">bin/plugin --install elasticsearch/elasticsearch-cloud-azure/2.8.3</code>
<code class="es2">bin/plugin install cloud-azure</code>
<code class="es5 es6 es7 es8">bin/elasticsearch-plugin install discovery-azure-classic</code>
<code class="es5 es6 es7 es8">bin/elasticsearch-plugin install repository-azure</code>
</div>
</div>
</div>
</div>
<h3 class="ui header">Plugins management</h3>
<pre class="es1"><code>bin/plugin --url file:///path/to/plugin --install plugin-name</code></pre>
<pre class="es1"><code>bin/plugin --remove [pluginname]</code></pre>
<pre class="es2"><code>bin/plugin install file:///path/to/plugin</code></pre>
<pre class="es2"><code>bin/plugin list</code></pre>
<pre class="es2"><code>bin/plugin remove [pluginname]</code></pre>
<pre class="es5 es6 es7 es8"><code>bin/elasticsearch-plugin install file:///path/to/plugin</code></pre>
<pre class="es5 es6 es7 es8"><code>bin/elasticsearch-plugin list</code></pre>
<pre class="es5 es6 es7 es8"><code>bin/elasticsearch-plugin remove [pluginname]</code></pre>
<h2 class="ui dividing header">Other information</h2>
<h3 class="ui header">Where to find the plugin binary?</h3>
<p>RPM: <code>/usr/share/elasticsearch/bin</code></p>
<p>Debian: <code>/usr/share/elasticsearch/bin</code></p>
<h3 class="ui header">What are the default ports?</h3>
<p>Kibana: <a href="http://localhost:5601/">http://localhost:5601/</a>.</p>
<p>Elasticsearch: <a href="http://localhost:9200/">http://localhost:9200/</a>.</p>
<h3 class="ui header">How to set the correct HEAP SIZE value?</h3>
<p>The best value for a single purpose Elasticsearch server is <strong>about 50% of available RAM but under 32g</strong>.
<br>Assuming Ubuntu / Debian server, you can change those files:</p>
<h4>/etc/security/limits.conf</h4>
<pre class="language-none"><code>elasticsearch - nofile 65535
elasticsearch - memlock unlimited</code></pre>
<h4>/etc/default/elasticsearch (on CentOS/RH: /etc/sysconfig/elasticsearch)</h4>
<pre class="language-none"><code>ES_HEAP_SIZE=20g
MAX_OPEN_FILES=65535
MAX_LOCKED_MEMORY=unlimited</code></pre>
<h3 class="ui header">Useful settings to change in elasticsearch.yml</h3>
<pre class="es1 language-none"><code>cluster.name: jolicluster
node.name: ${HOSTNAME}
plugin.mandatory: marvel-agent,analysis-icu,license
node.data: true
node.master: true
bootstrap.mlockall: true
action.auto_create_index: +aaa*,-bbb*,+ccc*,-*</code></pre>
<pre class="es2 language-none"><code>cluster.name: jolicluster
node.name: ${HOSTNAME}
discovery.zen.ping.unicast.hosts: ["front01", "front02"]
discovery.zen.minimum_master_nodes: 2
network.host: _site_
network.bind_host: [_site_, _local_]
plugin.mandatory: analysis-icu, marvel-agent
node.data: true
node.master: true
bootstrap.mlockall: true
action.auto_create_index: +aaa*,-bbb*,+ccc*,-*</code></pre>
<pre class="es5 es6 language-none"><code>cluster.name: jolicluster
node.name: ${HOSTNAME}
discovery.zen.ping.unicast.hosts: ["front01", "front02"]
discovery.zen.minimum_master_nodes: 2
network.host: _site_
network.bind_host: [_site_, _local_]
plugin.mandatory: analysis-icu
node.data: true
node.master: true
bootstrap.memory_lock: true
action.auto_create_index: +aaa*,-bbb*,+ccc*,-*
# Disable X-Pack features
xpack.security.enabled: false
xpack.monitoring.enabled: false
xpack.ml.enabled: false
xpack.watcher.enabled: false
xpack.sql.enabled: false
xpack.graph.enabled: false
# Only for XPack plugin for ES <= 6.2
#xpack.reporting.enabled: false
</code></pre>
<pre class="es7 es8 language-yaml"><code>cluster.name: jolicluster
node.name: ${HOSTNAME} # by default
network.host: [_local_, _site_]
plugin.mandatory: analysis-icu
node.data: true
node.master: true
node.ingest: true
bootstrap.memory_lock: true
action.auto_create_index: +aaa*,-bbb*,+ccc*,-*
discovery.seed_hosts:
- 192.168.1.10:9300
- 192.168.1.11
- seeds.mydomain.com
# Needed for first cluster boot
cluster.initial_master_nodes:
- 10.0.10.101
- 10.0.10.102:9300
- 10.0.10.102:9301
- master-node-name
# Disable X-Pack features, choose wisely
xpack.ccr.enabled: false
xpack.data_frame.enabled: false
xpack.enrich.enabled: false
xpack.flattened.enabled: false
xpack.graph.enabled: false
xpack.ilm.enabled: false
xpack.logstash.enabled: false
xpack.ml.enabled: false
xpack.monitoring.enabled: false
xpack.rollup.enabled: false
xpack.security.enabled: false
xpack.slm.enabled: false
xpack.sql.enabled: false
xpack.transform.enabled: false
xpack.vectors.enabled: false
xpack.watcher.enabled: false</code></pre>
</div>
<div class="ui inverted vertical footer segment">
<div class="ui container">
<p>Hosted on <a href="http://pages.github.com">GitHub Pages</a>. Elasticsearch is a trademark of Elasticsearch BV, registered in the U.S. and in other countries.</p>
<p>This website is not endorsed of affiliated with Elasticsearch. Brought to you by <a href="https://jolicode.com/">JoliCode</a>.</p>
</div>
</div>
<script>
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
})(window,document,'script','//www.google-analytics.com/analytics.js','ga');
ga('create', 'UA-29696798-6', 'auto');
ga('send', 'pageview');
</script>
<script src="./javascripts/prism.js"></script>
<!-- From http://tholman.com/github-corners/ -->
<a href="https://github.com/jolicode/elasticsearch-sheatsheet" class="github-corner" aria-label="View source on GitHub"><svg width="80" height="80" viewBox="0 0 250 250" style="fill:#151513; color:#fff; position: absolute; top: 0; border: 0; right: 0;" aria-hidden="true"><path d="M0,0 L115,115 L130,115 L142,142 L250,250 L250,0 Z"></path><path d="M128.3,109.0 C113.8,99.7 119.0,89.6 119.0,89.6 C122.0,82.7 120.5,78.6 120.5,78.6 C119.2,72.0 123.4,76.3 123.4,76.3 C127.3,80.9 125.5,87.3 125.5,87.3 C122.9,97.6 130.6,101.9 134.4,103.2" fill="currentColor" style="transform-origin: 130px 106px;" class="octo-arm"></path><path d="M115.0,115.0 C114.9,115.1 118.7,116.5 119.8,115.4 L133.7,101.6 C136.9,99.2 139.9,98.4 142.2,98.6 C133.8,88.0 127.5,74.4 143.8,58.0 C148.5,53.4 154.0,51.2 159.7,51.0 C160.3,49.4 163.2,43.6 171.4,40.1 C171.4,40.1 176.1,42.5 178.8,56.2 C183.1,58.6 187.2,61.8 190.9,65.4 C194.5,69.0 197.7,73.2 200.1,77.6 C213.8,80.2 216.3,84.9 216.3,84.9 C212.7,93.1 206.9,96.0 205.4,96.6 C205.1,102.4 203.0,107.8 198.3,112.5 C181.9,128.9 168.3,122.5 157.7,114.1 C157.9,116.9 156.7,120.9 152.7,124.9 L141.0,136.5 C139.8,137.7 141.6,141.9 141.8,141.8 Z" fill="currentColor" class="octo-body"></path></svg></a><style>.github-corner:hover .octo-arm{animation:octocat-wave 560ms ease-in-out}@keyframes octocat-wave{0%,100%{transform:rotate(0)}20%,60%{transform:rotate(-25deg)}40%,80%{transform:rotate(10deg)}}@media (max-width:500px){.github-corner:hover .octo-arm{animation:none}.github-corner .octo-arm{animation:octocat-wave 560ms ease-in-out}}</style>
</body>
</html>
================================================
FILE: javascripts/prism.js
================================================
/* PrismJS 1.19.0
https://prismjs.com/download.html?#themes=prism-solarizedlight&languages=markup+clike+javascript+json+yaml&plugins=toolbar+copy-to-clipboard */
var _self="undefined"!=typeof window?window:"undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope?self:{},Prism=function(u){var c=/\blang(?:uage)?-([\w-]+)\b/i,n=0,C={manual:u.Prism&&u.Prism.manual,disableWorkerMessageHandler:u.Prism&&u.Prism.disableWorkerMessageHandler,util:{encode:function(e){return e instanceof _?new _(e.type,C.util.encode(e.content),e.alias):Array.isArray(e)?e.map(C.util.encode):e.replace(/&/g,"&").replace(/</g,"<").replace(/\u00a0/g," ")},type:function(e){return Object.prototype.toString.call(e).slice(8,-1)},objId:function(e){return e.__id||Object.defineProperty(e,"__id",{value:++n}),e.__id},clone:function r(e,t){var a,n,i=C.util.type(e);switch(t=t||{},i){case"Object":if(n=C.util.objId(e),t[n])return t[n];for(var o in a={},t[n]=a,e)e.hasOwnProperty(o)&&(a[o]=r(e[o],t));return a;case"Array":return n=C.util.objId(e),t[n]?t[n]:(a=[],t[n]=a,e.forEach(function(e,n){a[n]=r(e,t)}),a);default:return e}},getLanguage:function(e){for(;e&&!c.test(e.className);)e=e.parentElement;return e?(e.className.match(c)||[,"none"])[1].toLowerCase():"none"},currentScript:function(){if("undefined"==typeof document)return null;if("currentScript"in document)return document.currentScript;try{throw new Error}catch(e){var n=(/at [^(\r\n]*\((.*):.+:.+\)$/i.exec(e.stack)||[])[1];if(n){var r=document.getElementsByTagName("script");for(var t in r)if(r[t].src==n)return r[t]}return null}}},languages:{extend:function(e,n){var r=C.util.clone(C.languages[e]);for(var t in n)r[t]=n[t];return r},insertBefore:function(r,e,n,t){var a=(t=t||C.languages)[r],i={};for(var o in a)if(a.hasOwnProperty(o)){if(o==e)for(var l in n)n.hasOwnProperty(l)&&(i[l]=n[l]);n.hasOwnProperty(o)||(i[o]=a[o])}var s=t[r];return t[r]=i,C.languages.DFS(C.languages,function(e,n){n===s&&e!=r&&(this[e]=i)}),i},DFS:function e(n,r,t,a){a=a||{};var i=C.util.objId;for(var o in n)if(n.hasOwnProperty(o)){r.call(n,o,n[o],t||o);var l=n[o],s=C.util.type(l);"Object"!==s||a[i(l)]?"Array"!==s||a[i(l)]||(a[i(l)]=!0,e(l,r,o,a)):(a[i(l)]=!0,e(l,r,null,a))}}},plugins:{},highlightAll:function(e,n){C.highlightAllUnder(document,e,n)},highlightAllUnder:function(e,n,r){var t={callback:r,container:e,selector:'code[class*="language-"], [class*="language-"] code, code[class*="lang-"], [class*="lang-"] code'};C.hooks.run("before-highlightall",t),t.elements=Array.prototype.slice.apply(t.container.querySelectorAll(t.selector)),C.hooks.run("before-all-elements-highlight",t);for(var a,i=0;a=t.elements[i++];)C.highlightElement(a,!0===n,t.callback)},highlightElement:function(e,n,r){var t=C.util.getLanguage(e),a=C.languages[t];e.className=e.className.replace(c,"").replace(/\s+/g," ")+" language-"+t;var i=e.parentNode;i&&"pre"===i.nodeName.toLowerCase()&&(i.className=i.className.replace(c,"").replace(/\s+/g," ")+" language-"+t);var o={element:e,language:t,grammar:a,code:e.textContent};function l(e){o.highlightedCode=e,C.hooks.run("before-insert",o),o.element.innerHTML=o.highlightedCode,C.hooks.run("after-highlight",o),C.hooks.run("complete",o),r&&r.call(o.element)}if(C.hooks.run("before-sanity-check",o),!o.code)return C.hooks.run("complete",o),void(r&&r.call(o.element));if(C.hooks.run("before-highlight",o),o.grammar)if(n&&u.Worker){var s=new Worker(C.filename);s.onmessage=function(e){l(e.data)},s.postMessage(JSON.stringify({language:o.language,code:o.code,immediateClose:!0}))}else l(C.highlight(o.code,o.grammar,o.language));else l(C.util.encode(o.code))},highlight:function(e,n,r){var t={code:e,grammar:n,language:r};return C.hooks.run("before-tokenize",t),t.tokens=C.tokenize(t.code,t.grammar),C.hooks.run("after-tokenize",t),_.stringify(C.util.encode(t.tokens),t.language)},matchGrammar:function(e,n,r,t,a,i,o){for(var l in r)if(r.hasOwnProperty(l)&&r[l]){var s=r[l];s=Array.isArray(s)?s:[s];for(var u=0;u<s.length;++u){if(o&&o==l+","+u)return;var c=s[u],g=c.inside,f=!!c.lookbehind,h=!!c.greedy,d=0,m=c.alias;if(h&&!c.pattern.global){var p=c.pattern.toString().match(/[imsuy]*$/)[0];c.pattern=RegExp(c.pattern.source,p+"g")}c=c.pattern||c;for(var y=t,v=a;y<n.length;v+=n[y].length,++y){var k=n[y];if(n.length>e.length)return;if(!(k instanceof _)){if(h&&y!=n.length-1){if(c.lastIndex=v,!(O=c.exec(e)))break;for(var b=O.index+(f&&O[1]?O[1].length:0),w=O.index+O[0].length,A=y,P=v,x=n.length;A<x&&(P<w||!n[A].type&&!n[A-1].greedy);++A)(P+=n[A].length)<=b&&(++y,v=P);if(n[y]instanceof _)continue;S=A-y,k=e.slice(v,P),O.index-=v}else{c.lastIndex=0;var O=c.exec(k),S=1}if(O){f&&(d=O[1]?O[1].length:0);w=(b=O.index+d)+(O=O[0].slice(d)).length;var j=k.slice(0,b),N=k.slice(w),E=[y,S];j&&(++y,v+=j.length,E.push(j));var L=new _(l,g?C.tokenize(O,g):O,m,O,h);if(E.push(L),N&&E.push(N),Array.prototype.splice.apply(n,E),1!=S&&C.matchGrammar(e,n,r,y,v,!0,l+","+u),i)break}else if(i)break}}}}},tokenize:function(e,n){var r=[e],t=n.rest;if(t){for(var a in t)n[a]=t[a];delete n.rest}return C.matchGrammar(e,r,n,0,0,!1),r},hooks:{all:{},add:function(e,n){var r=C.hooks.all;r[e]=r[e]||[],r[e].push(n)},run:function(e,n){var r=C.hooks.all[e];if(r&&r.length)for(var t,a=0;t=r[a++];)t(n)}},Token:_};function _(e,n,r,t,a){this.type=e,this.content=n,this.alias=r,this.length=0|(t||"").length,this.greedy=!!a}if(u.Prism=C,_.stringify=function(e,n){if("string"==typeof e)return e;if(Array.isArray(e))return e.map(function(e){return _.stringify(e,n)}).join("");var r={type:e.type,content:_.stringify(e.content,n),tag:"span",classes:["token",e.type],attributes:{},language:n};if(e.alias){var t=Array.isArray(e.alias)?e.alias:[e.alias];Array.prototype.push.apply(r.classes,t)}C.hooks.run("wrap",r);var a=Object.keys(r.attributes).map(function(e){return e+'="'+(r.attributes[e]||"").replace(/"/g,""")+'"'}).join(" ");return"<"+r.tag+' class="'+r.classes.join(" ")+'"'+(a?" "+a:"")+">"+r.content+"</"+r.tag+">"},!u.document)return u.addEventListener&&(C.disableWorkerMessageHandler||u.addEventListener("message",function(e){var n=JSON.parse(e.data),r=n.language,t=n.code,a=n.immediateClose;u.postMessage(C.highlight(t,C.languages[r],r)),a&&u.close()},!1)),C;var e=C.util.currentScript();if(e&&(C.filename=e.src,e.hasAttribute("data-manual")&&(C.manual=!0)),!C.manual){function r(){C.manual||C.highlightAll()}var t=document.readyState;"loading"===t||"interactive"===t&&e&&e.defer?document.addEventListener("DOMContentLoaded",r):window.requestAnimationFrame?window.requestAnimationFrame(r):window.setTimeout(r,16)}return C}(_self);"undefined"!=typeof module&&module.exports&&(module.exports=Prism),"undefined"!=typeof global&&(global.Prism=Prism);
Prism.languages.markup={comment:/<!--[\s\S]*?-->/,prolog:/<\?[\s\S]+?\?>/,doctype:{pattern:/<!DOCTYPE(?:[^>"'[\]]|"[^"]*"|'[^']*')+(?:\[(?:(?!<!--)[^"'\]]|"[^"]*"|'[^']*'|<!--[\s\S]*?-->)*\]\s*)?>/i,greedy:!0},cdata:/<!\[CDATA\[[\s\S]*?]]>/i,tag:{pattern:/<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/i,greedy:!0,inside:{tag:{pattern:/^<\/?[^\s>\/]+/i,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"attr-value":{pattern:/=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/i,inside:{punctuation:[/^=/,{pattern:/^(\s*)["']|["']$/,lookbehind:!0}]}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:/&#?[\da-z]{1,8};/i},Prism.languages.markup.tag.inside["attr-value"].inside.entity=Prism.languages.markup.entity,Prism.hooks.add("wrap",function(a){"entity"===a.type&&(a.attributes.title=a.content.replace(/&/,"&"))}),Object.defineProperty(Prism.languages.markup.tag,"addInlined",{value:function(a,e){var s={};s["language-"+e]={pattern:/(^<!\[CDATA\[)[\s\S]+?(?=\]\]>$)/i,lookbehind:!0,inside:Prism.languages[e]},s.cdata=/^<!\[CDATA\[|\]\]>$/i;var n={"included-cdata":{pattern:/<!\[CDATA\[[\s\S]*?\]\]>/i,inside:s}};n["language-"+e]={pattern:/[\s\S]+/,inside:Prism.languages[e]};var t={};t[a]={pattern:RegExp("(<__[\\s\\S]*?>)(?:<!\\[CDATA\\[[\\s\\S]*?\\]\\]>\\s*|[\\s\\S])*?(?=<\\/__>)".replace(/__/g,a),"i"),lookbehind:!0,greedy:!0,inside:n},Prism.languages.insertBefore("markup","cdata",t)}}),Prism.languages.xml=Prism.languages.extend("markup",{}),Prism.languages.html=Prism.languages.markup,Prism.languages.mathml=Prism.languages.markup,Prism.languages.svg=Prism.languages.markup;
Prism.languages.clike={comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},"class-name":{pattern:/(\b(?:class|interface|extends|implements|trait|instanceof|new)\s+|\bcatch\s+\()[\w.\\]+/i,lookbehind:!0,inside:{punctuation:/[.\\]/}},keyword:/\b(?:if|else|while|do|for|return|in|instanceof|function|new|try|throw|catch|finally|null|break|continue)\b/,boolean:/\b(?:true|false)\b/,function:/\w+(?=\()/,number:/\b0x[\da-f]+\b|(?:\b\d+\.?\d*|\B\.\d+)(?:e[+-]?\d+)?/i,operator:/[<>]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/,punctuation:/[{}[\];(),.:]/};
Prism.languages.javascript=Prism.languages.extend("clike",{"class-name":[Prism.languages.clike["class-name"],{pattern:/(^|[^$\w\xA0-\uFFFF])[_$A-Z\xA0-\uFFFF][$\w\xA0-\uFFFF]*(?=\.(?:prototype|constructor))/,lookbehind:!0}],keyword:[{pattern:/((?:^|})\s*)(?:catch|finally)\b/,lookbehind:!0},{pattern:/(^|[^.]|\.\.\.\s*)\b(?:as|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/,lookbehind:!0}],number:/\b(?:(?:0[xX](?:[\dA-Fa-f](?:_[\dA-Fa-f])?)+|0[bB](?:[01](?:_[01])?)+|0[oO](?:[0-7](?:_[0-7])?)+)n?|(?:\d(?:_\d)?)+n|NaN|Infinity)\b|(?:\b(?:\d(?:_\d)?)+\.?(?:\d(?:_\d)?)*|\B\.(?:\d(?:_\d)?)+)(?:[Ee][+-]?(?:\d(?:_\d)?)+)?/,function:/#?[_$a-zA-Z\xA0-\uFFFF][$\w\xA0-\uFFFF]*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/,operator:/--|\+\+|\*\*=?|=>|&&|\|\||[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?[.?]?|[~:]/}),Prism.languages.javascript["class-name"][0].pattern=/(\b(?:class|interface|extends|implements|instanceof|new)\s+)[\w.\\]+/,Prism.languages.insertBefore("javascript","keyword",{regex:{pattern:/((?:^|[^$\w\xA0-\uFFFF."'\])\s])\s*)\/(?:\[(?:[^\]\\\r\n]|\\.)*]|\\.|[^/\\\[\r\n])+\/[gimyus]{0,6}(?=(?:\s|\/\*[\s\S]*?\*\/)*(?:$|[\r\n,.;:})\]]|\/\/))/,lookbehind:!0,greedy:!0},"function-variable":{pattern:/#?[_$a-zA-Z\xA0-\uFFFF][$\w\xA0-\uFFFF]*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|[_$a-zA-Z\xA0-\uFFFF][$\w\xA0-\uFFFF]*)\s*=>))/,alias:"function"},parameter:[{pattern:/(function(?:\s+[_$A-Za-z\xA0-\uFFFF][$\w\xA0-\uFFFF]*)?\s*\(\s*)(?!\s)(?:[^()]|\([^()]*\))+?(?=\s*\))/,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/[_$a-z\xA0-\uFFFF][$\w\xA0-\uFFFF]*(?=\s*=>)/i,inside:Prism.languages.javascript},{pattern:/(\(\s*)(?!\s)(?:[^()]|\([^()]*\))+?(?=\s*\)\s*=>)/,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:[_$A-Za-z\xA0-\uFFFF][$\w\xA0-\uFFFF]*\s*)\(\s*)(?!\s)(?:[^()]|\([^()]*\))+?(?=\s*\)\s*\{)/,lookbehind:!0,inside:Prism.languages.javascript}],constant:/\b[A-Z](?:[A-Z_]|\dx?)*\b/}),Prism.languages.insertBefore("javascript","string",{"template-string":{pattern:/`(?:\\[\s\S]|\${(?:[^{}]|{(?:[^{}]|{[^}]*})*})+}|(?!\${)[^\\`])*`/,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\${(?:[^{}]|{(?:[^{}]|{[^}]*})*})+}/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\${|}$/,alias:"punctuation"},rest:Prism.languages.javascript}},string:/[\s\S]+/}}}),Prism.languages.markup&&Prism.languages.markup.tag.addInlined("script","javascript"),Prism.languages.js=Prism.languages.javascript;
Prism.languages.json={property:{pattern:/"(?:\\.|[^\\"\r\n])*"(?=\s*:)/,greedy:!0},string:{pattern:/"(?:\\.|[^\\"\r\n])*"(?!\s*:)/,greedy:!0},comment:/\/\/.*|\/\*[\s\S]*?(?:\*\/|$)/,number:/-?\d+\.?\d*(?:e[+-]?\d+)?/i,punctuation:/[{}[\],]/,operator:/:/,boolean:/\b(?:true|false)\b/,null:{pattern:/\bnull\b/,alias:"keyword"}};
Prism.languages.yaml={scalar:{pattern:/([\-:]\s*(?:![^\s]+)?[ \t]*[|>])[ \t]*(?:((?:\r?\n|\r)[ \t]+)[^\r\n]+(?:\2[^\r\n]+)*)/,lookbehind:!0,alias:"string"},comment:/#.*/,key:{pattern:/(\s*(?:^|[:\-,[{\r\n?])[ \t]*(?:![^\s]+)?[ \t]*)[^\r\n{[\]},#\s]+?(?=\s*:\s)/,lookbehind:!0,alias:"atrule"},directive:{pattern:/(^[ \t]*)%.+/m,lookbehind:!0,alias:"important"},datetime:{pattern:/([:\-,[{]\s*(?:![^\s]+)?[ \t]*)(?:\d{4}-\d\d?-\d\d?(?:[tT]|[ \t]+)\d\d?:\d{2}:\d{2}(?:\.\d*)?[ \t]*(?:Z|[-+]\d\d?(?::\d{2})?)?|\d{4}-\d{2}-\d{2}|\d\d?:\d{2}(?::\d{2}(?:\.\d*)?)?)(?=[ \t]*(?:$|,|]|}))/m,lookbehind:!0,alias:"number"},boolean:{pattern:/([:\-,[{]\s*(?:![^\s]+)?[ \t]*)(?:true|false)[ \t]*(?=$|,|]|})/im,lookbehind:!0,alias:"important"},null:{pattern:/([:\-,[{]\s*(?:![^\s]+)?[ \t]*)(?:null|~)[ \t]*(?=$|,|]|})/im,lookbehind:!0,alias:"important"},string:{pattern:/([:\-,[{]\s*(?:![^\s]+)?[ \t]*)("|')(?:(?!\2)[^\\\r\n]|\\.)*\2(?=[ \t]*(?:$|,|]|}|\s*#))/m,lookbehind:!0,greedy:!0},number:{pattern:/([:\-,[{]\s*(?:![^\s]+)?[ \t]*)[+-]?(?:0x[\da-f]+|0o[0-7]+|(?:\d+\.?\d*|\.?\d+)(?:e[+-]?\d+)?|\.inf|\.nan)[ \t]*(?=$|,|]|})/im,lookbehind:!0},tag:/![^\s]+/,important:/[&*][\w]+/,punctuation:/---|[:[\]{}\-,|>?]|\.\.\./},Prism.languages.yml=Prism.languages.yaml;
!function(){if("undefined"!=typeof self&&self.Prism&&self.document){var r=[],i={},a=function(){};Prism.plugins.toolbar={};var t=Prism.plugins.toolbar.registerButton=function(t,a){var e;e="function"==typeof a?a:function(t){var e;return"function"==typeof a.onClick?((e=document.createElement("button")).type="button",e.addEventListener("click",function(){a.onClick.call(this,t)})):"string"==typeof a.url?(e=document.createElement("a")).href=a.url:e=document.createElement("span"),a.className&&e.classList.add(a.className),e.textContent=a.text,e},t in i?console.warn('There is a button with the key "'+t+'" registered already.'):r.push(i[t]=e)},e=Prism.plugins.toolbar.hook=function(n){var t=n.element.parentNode;if(t&&/pre/i.test(t.nodeName)&&!t.parentNode.classList.contains("code-toolbar")){var e=document.createElement("div");e.classList.add("code-toolbar"),t.parentNode.insertBefore(e,t),e.appendChild(t);var o=document.createElement("div");o.classList.add("toolbar"),document.body.hasAttribute("data-toolbar-order")&&(r=document.body.getAttribute("data-toolbar-order").split(",").map(function(t){return i[t]||a})),r.forEach(function(t){var e=t(n);if(e){var a=document.createElement("div");a.classList.add("toolbar-item"),a.appendChild(e),o.appendChild(a)}}),e.appendChild(o)}};t("label",function(t){var e=t.element.parentNode;if(e&&/pre/i.test(e.nodeName)&&e.hasAttribute("data-label")){var a,n,o=e.getAttribute("data-label");try{n=document.querySelector("template#"+o)}catch(t){}return n?a=n.content:(e.hasAttribute("data-url")?(a=document.createElement("a")).href=e.getAttribute("data-url"):a=document.createElement("span"),a.textContent=o),a}}),Prism.hooks.add("complete",e)}}();
!function(){if("undefined"!=typeof self&&self.Prism&&self.document)if(Prism.plugins.toolbar){var r=window.ClipboardJS||void 0;r||"function"!=typeof require||(r=require("clipboard"));var i=[];if(!r){var o=document.createElement("script"),e=document.querySelector("head");o.onload=function(){if(r=window.ClipboardJS)for(;i.length;)i.pop()()},o.src="https://cdnjs.cloudflare.com/ajax/libs/clipboard.js/2.0.0/clipboard.min.js",e.appendChild(o)}Prism.plugins.toolbar.registerButton("copy-to-clipboard",function(e){var t=document.createElement("button");return t.textContent="Copy",r?o():i.push(o),t;function o(){var o=new r(t,{text:function(){return e.code}});o.on("success",function(){t.textContent="Copied!",n()}),o.on("error",function(){t.textContent="Press Ctrl+C to copy",n()})}function n(){setTimeout(function(){t.textContent="Copy"},5e3)}})}else console.warn("Copy to Clipboard plugin loaded before Toolbar plugin.")}();
================================================
FILE: semantic-UI/LICENSE
================================================
The MIT License (MIT)
Copyright (c) 2015 Semantic Org
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
================================================
FILE: stylesheets/prism.css
================================================
/* PrismJS 1.19.0
https://prismjs.com/download.html?#themes=prism-solarizedlight&languages=markup+clike+javascript+json+yaml&plugins=toolbar+copy-to-clipboard */
/*
Solarized Color Schemes originally by Ethan Schoonover
http://ethanschoonover.com/solarized
Ported for PrismJS by Hector Matos
Website: https://krakendev.io
Twitter Handle: https://twitter.com/allonsykraken)
*/
/*
SOLARIZED HEX
--------- -------
base03 #002b36
base02 #073642
base01 #586e75
base00 #657b83
base0 #839496
base1 #93a1a1
base2 #eee8d5
base3 #fdf6e3
yellow #b58900
orange #cb4b16
red #dc322f
magenta #d33682
violet #6c71c4
blue #268bd2
cyan #2aa198
green #859900
*/
code[class*="language-"],
pre[class*="language-"] {
color: #657b83; /* base00 */
font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;
font-size: 1em;
text-align: left;
white-space: pre;
word-spacing: normal;
word-break: normal;
word-wrap: normal;
line-height: 1.5;
-moz-tab-size: 4;
-o-tab-size: 4;
tab-size: 4;
-webkit-hyphens: none;
-moz-hyphens: none;
-ms-hyphens: none;
hyphens: none;
}
pre[class*="language-"]::-moz-selection, pre[class*="language-"] ::-moz-selection,
code[class*="language-"]::-moz-selection, code[class*="language-"] ::-moz-selection {
background: #073642; /* base02 */
}
pre[class*="language-"]::selection, pre[class*="language-"] ::selection,
code[class*="language-"]::selection, code[class*="language-"] ::selection {
background: #073642; /* base02 */
}
/* Code blocks */
pre[class*="language-"] {
padding: 1em;
margin: .5em 0;
overflow: auto;
border-radius: 0.3em;
}
:not(pre) > code[class*="language-"],
pre[class*="language-"] {
background-color: #fdf6e3; /* base3 */
}
/* Inline code */
:not(pre) > code[class*="language-"] {
padding: .1em;
border-radius: .3em;
}
.token.comment,
.token.prolog,
.token.doctype,
.token.cdata {
color: #93a1a1; /* base1 */
}
.token.punctuation {
color: #586e75; /* base01 */
}
.token.namespace {
opacity: .7;
}
.token.property,
.token.tag,
.token.boolean,
.token.number,
.token.constant,
.token.symbol,
.token.deleted {
color: #268bd2; /* blue */
}
.token.selector,
.token.attr-name,
.token.string,
.token.char,
.token.builtin,
.token.url,
.token.inserted {
color: #2aa198; /* cyan */
}
.token.entity {
color: #657b83; /* base00 */
background: #eee8d5; /* base2 */
}
.token.atrule,
.token.attr-value,
.token.keyword {
color: #859900; /* green */
}
.token.function,
.token.class-name {
color: #b58900; /* yellow */
}
.token.regex,
.token.important,
.token.variable {
color: #cb4b16; /* orange */
}
.token.important,
.token.bold {
font-weight: bold;
}
.token.italic {
font-style: italic;
}
.token.entity {
cursor: help;
}
div.code-toolbar {
position: relative;
}
div.code-toolbar > .toolbar {
position: absolute;
top: .3em;
right: .2em;
transition: opacity 0.3s ease-in-out;
opacity: 0;
}
div.code-toolbar:hover > .toolbar {
opacity: 1;
}
/* Separate line b/c rules are thrown out if selector is invalid.
IE11 and old Edge versions don't support :focus-within. */
div.code-toolbar:focus-within > .toolbar {
opacity: 1;
}
div.code-toolbar > .toolbar .toolbar-item {
display: inline-block;
}
div.code-toolbar > .toolbar a {
cursor: pointer;
}
div.code-toolbar > .toolbar button {
background: none;
border: 0;
color: inherit;
font: inherit;
line-height: normal;
overflow: visible;
padding: 0;
-webkit-user-select: none; /* for button */
-moz-user-select: none;
-ms-user-select: none;
}
div.code-toolbar > .toolbar a,
div.code-toolbar > .toolbar button,
div.code-toolbar > .toolbar span {
color: #bbb;
font-size: .8em;
padding: 0 .5em;
background: #f5f2f0;
background: rgba(224, 224, 224, 0.2);
box-shadow: 0 2px 0 0 rgba(0,0,0,0.2);
border-radius: .5em;
}
div.code-toolbar > .toolbar a:hover,
div.code-toolbar > .toolbar a:focus,
div.code-toolbar > .toolbar button:hover,
div.code-toolbar > .toolbar button:focus,
div.code-toolbar > .toolbar span:hover,
div.code-toolbar > .toolbar span:focus {
color: inherit;
text-decoration: none;
}
gitextract_vhv_1t45/
├── CNAME
├── LICENSE
├── README.md
├── index.html
├── javascripts/
│ └── prism.js
├── semantic-UI/
│ ├── LICENSE
│ └── themes/
│ └── default/
│ └── assets/
│ └── fonts/
│ └── icons.otf
└── stylesheets/
└── prism.css
SYMBOL INDEX (5 symbols across 1 files)
FILE: javascripts/prism.js
function l (line 3) | function l(e){o.highlightedCode=e,C.hooks.run("before-insert",o),o.eleme...
function _ (line 3) | function _(e,n,r,t,a){this.type=e,this.content=n,this.alias=r,this.lengt...
function r (line 3) | function r(){C.manual||C.highlightAll()}
function o (line 10) | function o(){var o=new r(t,{text:function(){return e.code}});o.on("succe...
function n (line 10) | function n(){setTimeout(function(){t.textContent="Copy"},5e3)}
Condensed preview — 8 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (67K chars).
[
{
"path": "CNAME",
"chars": 37,
"preview": "elasticsearch-cheatsheet.jolicode.com"
},
{
"path": "LICENSE",
"chars": 1075,
"preview": "The MIT License (MIT)\n\nCopyright (c) 2016 JoliCode\n\nPermission is hereby granted, free of charge, to any person obtainin"
},
{
"path": "README.md",
"chars": 125,
"preview": "# Elasticsearch Cheatsheet for developpers\n\nhttps://elasticsearch-cheatsheet.jolicode.com/\n\n# License\n\nMIT, see LICENSE "
},
{
"path": "index.html",
"chars": 39862,
"preview": "<!doctype html>\n<html lang=\"en\">\n<head>\n <meta charset=\"utf-8\" />\n <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge"
},
{
"path": "javascripts/prism.js",
"chars": 16458,
"preview": "/* PrismJS 1.19.0\nhttps://prismjs.com/download.html?#themes=prism-solarizedlight&languages=markup+clike+javascript+json+"
},
{
"path": "semantic-UI/LICENSE",
"chars": 1080,
"preview": "The MIT License (MIT)\n\nCopyright (c) 2015 Semantic Org\n\nPermission is hereby granted, free of charge, to any person obta"
},
{
"path": "stylesheets/prism.css",
"chars": 4121,
"preview": "/* PrismJS 1.19.0\nhttps://prismjs.com/download.html?#themes=prism-solarizedlight&languages=markup+clike+javascript+json+"
}
]
// ... and 1 more files (download for full content)
About this extraction
This page contains the full source code of the jolicode/elasticsearch-cheatsheet GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 8 files (61.3 KB), approximately 19.8k tokens, and a symbol index with 5 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.