├── runtime.txt ├── Procfile ├── app ├── robots.txt ├── static │ ├── favicon.ico │ ├── favicon.png │ ├── screenshot.png │ ├── screenshot2.png │ ├── server.js │ ├── cheatsheet.css │ └── app.js ├── __init__.py ├── views.py └── templates │ └── index.html ├── run.py ├── HISTORY.rst ├── NOTES.md ├── Pipfile ├── requirements.txt ├── .gitignore ├── LICENSE ├── README.rst └── Pipfile.lock /runtime.txt: -------------------------------------------------------------------------------- 1 | python-3.6.6 2 | -------------------------------------------------------------------------------- /Procfile: -------------------------------------------------------------------------------- 1 | web: gunicorn app:app --log-file - 2 | -------------------------------------------------------------------------------- /app/robots.txt: -------------------------------------------------------------------------------- 1 | User-agent: * 2 | Disallow: 3 | -------------------------------------------------------------------------------- /run.py: -------------------------------------------------------------------------------- 1 | from app import app 2 | 3 | app.run(host='localhost', port=5000) 4 | -------------------------------------------------------------------------------- /HISTORY.rst: -------------------------------------------------------------------------------- 1 | ======= 2 | History 3 | ======= 4 | 5 | 0.1.0 6 | ------------------ 7 | 8 | * Initial Release 9 | -------------------------------------------------------------------------------- /app/static/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gtalarico/interactive-elastic-analyzer/HEAD/app/static/favicon.ico -------------------------------------------------------------------------------- /app/static/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gtalarico/interactive-elastic-analyzer/HEAD/app/static/favicon.png -------------------------------------------------------------------------------- /app/static/screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gtalarico/interactive-elastic-analyzer/HEAD/app/static/screenshot.png -------------------------------------------------------------------------------- /app/static/screenshot2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gtalarico/interactive-elastic-analyzer/HEAD/app/static/screenshot2.png -------------------------------------------------------------------------------- /app/static/server.js: -------------------------------------------------------------------------------- 1 | const $axios = axios.create({ 2 | baseURL: "/elastic", 3 | timeout: 80000, 4 | headers: { "Content-Type": "application/json" } 5 | }); 6 | -------------------------------------------------------------------------------- /NOTES.md: -------------------------------------------------------------------------------- 1 | ## Heroku Deployment 2 | 3 | ``` 4 | heroku apps:create interactive-elastic 5 | heroku git:remote --app interactive-elastic 6 | heroku addons:create searchbox:starter 7 | heroku config:set SECRET_KEY=12345678 8 | heroku config:set FLASK_ENV=Production 9 | ``` 10 | -------------------------------------------------------------------------------- /Pipfile: -------------------------------------------------------------------------------- 1 | [[source]] 2 | url = "https://pypi.org/simple" 3 | verify_ssl = true 4 | name = "pypi" 5 | 6 | [packages] 7 | flask = "*" 8 | gunicorn = "*" 9 | python-dotenv = "*" 10 | elasticsearch = "*" 11 | 12 | [dev-packages] 13 | mypy = "*" 14 | black = "*" 15 | 16 | [requires] 17 | python_version = "3.6" 18 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | -i https://pypi.org/simple 2 | certifi==2018.4.16 3 | chardet==3.0.4 4 | click==6.7 5 | flask==1.0.2 6 | gunicorn==19.9.0 7 | idna==2.7 8 | itsdangerous==0.24 9 | jinja2==2.10 10 | markupsafe==1.0 11 | python-dotenv==0.9.1 12 | urllib3==1.23 13 | elasticsearch==6.3.0 14 | werkzeug==0.14.1 15 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.pyc 2 | .cache 3 | .pytest_cache 4 | 5 | 6 | .DS_Store 7 | node_modules/ 8 | npm-debug.log* 9 | yarn-debug.log* 10 | yarn-error.log* 11 | selenium-debug.log 12 | 13 | # Editor directories and files 14 | .idea 15 | .vscode 16 | *.suo 17 | *.ntvs* 18 | *.njsproj 19 | *.sln 20 | *security-sgps.py 21 | *security_backend.py 22 | -------------------------------------------------------------------------------- /app/__init__.py: -------------------------------------------------------------------------------- 1 | """ 2 | Interactive Elasticsearch Analyzer 3 | https://github.com/gtalarico/interactive-elastic-analyzer 4 | 5 | 6 | """ 7 | 8 | from flask import Flask 9 | import os 10 | from dotenv import load_dotenv 11 | load_dotenv() 12 | 13 | app = Flask(__name__) 14 | 15 | 16 | # Set Env `FLASK_ENV=development` to enable Development mode. 17 | app.config['FLASK_ENV'] = os.getenv('FLASK_ENV', 'production') 18 | 19 | from .views import index, robots, elastic # noqa 20 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2018, Gui Talarico 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | 23 | -------------------------------------------------------------------------------- /app/static/cheatsheet.css: -------------------------------------------------------------------------------- 1 | body, 2 | html { 3 | /* font-family: "Roboto", sans-serif; */ 4 | font-family: "Open Sans", sans-serif; 5 | background: #f2f2f2; 6 | } 7 | 8 | code { 9 | font-size: 0.8rem !important; 10 | } 11 | 12 | .tag, { 13 | font-family: 'Roboto Mono', monospace !important; 14 | } 15 | 16 | pre, 17 | .message { 18 | max-width: 960px; 19 | font-size: .8rem 20 | } 21 | 22 | li { 23 | margin: 10px; 24 | } 25 | 26 | .hero.is-primary { 27 | background: linear-gradient(to top right, #477288 10%, #80578d); 28 | } 29 | 30 | .box { 31 | box-shadow: 0 2px 6px 0 rgba(0, 0, 0, 0.2); 32 | } 33 | 34 | .box span.icon { 35 | float: right; 36 | font-size: 1.7em; 37 | padding: 2rem 2rem 0 0; 38 | } 39 | 40 | .is-large.fab { 41 | font-size: 7em; 42 | } 43 | 44 | .is-large.fas { 45 | font-size: 5em; 46 | margin-left: 0.2em; 47 | } 48 | 49 | .menu-list li a:hover { 50 | background: #d9d9d9; 51 | } 52 | 53 | .token.number { 54 | display: inline; 55 | padding: inherit; 56 | font-size: inherit; 57 | line-height: inherit; 58 | text-align: inherit; 59 | vertical-align: inherit; 60 | border-radius: inherit; 61 | font-weight: inherit; 62 | white-space: inherit; 63 | background: inherit; 64 | margin: inherit; 65 | } 66 | .license { 67 | padding-bottom: 2rem; 68 | } 69 | 70 | .label { 71 | color: #666666; 72 | font-weight: 500; 73 | } 74 | 75 | .card { 76 | background-color: #f9f9f9; 77 | } 78 | 79 | .card-content { 80 | padding-top: 0.75rem; 81 | } 82 | -------------------------------------------------------------------------------- /app/views.py: -------------------------------------------------------------------------------- 1 | import os 2 | 3 | from flask import jsonify, send_file, request 4 | from elasticsearch import Elasticsearch 5 | 6 | from . import app 7 | 8 | 9 | @app.route("/") 10 | def index(): 11 | return send_file("templates/index.html") 12 | 13 | 14 | @app.route("/robots.txt") 15 | def robots(): 16 | return send_file("robots.txt") 17 | 18 | 19 | @app.route("/elastic", methods=["POST"]) 20 | def elastic(): 21 | """ Elastic Search Analyze Endpoint """ 22 | data = request.json 23 | text = data.get("text", "") 24 | tokenizer = data.get("tokenizer", "standard") 25 | filters = data.get("filters", []) 26 | tokenizer_config = data.get("tokenConfig", {}) 27 | body = { 28 | "text": text, 29 | "tokenizer": dict(type=tokenizer, **tokenizer_config), 30 | "filter": filters, 31 | # "char_filter": ["html_strip"], TODO 32 | } 33 | resp = es.indices.analyze(index=INDEX_NAME, body=body) 34 | return jsonify(resp) 35 | 36 | 37 | # Configure Session 38 | # You can set `SEARCHBOX_URL` to your own elastic instance or use the free tier 39 | DEFAULT_SEARCHBOX_URL = \ 40 | 'http://paas:fa037e1c0782e410fa17ca277ec47225@thorin-us-east-1.searchly.com:80' 41 | URL = os.getenv('SEARCHBOX_URL', DEFAULT_SEARCHBOX_URL) 42 | INDEX_NAME = "interactive-index" 43 | es = Elasticsearch(URL) 44 | 45 | # Ensure Index Exists 46 | payload = { 47 | "settings": {"index": {"number_of_shards": 1, "number_of_replicas": 1}} 48 | } 49 | # create the index, ignore 400 if index already exists 50 | es.indices.create(index=INDEX_NAME, body=payload, ignore=400) 51 | -------------------------------------------------------------------------------- /README.rst: -------------------------------------------------------------------------------- 1 | =================================== 2 | Interactive Elastic Analyzer 3 | =================================== 4 | 5 | 6 | ElasticSearch Interactive Analyzer ⚡🔍✨ 7 | 8 | https://interactive-elastic.herokuapp.com 9 | 10 | ------------------------------------------------------------------------- 11 | 12 | 13 | Overview 14 | -------- 15 | 16 | Explore Elasticsearch Tokenizer and Token Filters interactively. 17 | Contributions are welcome. 18 | 19 | =========== 20 | Screenshots 21 | =========== 22 | 23 | .. image:: https://raw.githubusercontent.com/gtalarico/interactive-elastic-analyzer/master/app/static/screenshot.png 24 | 25 | .. image:: https://raw.githubusercontent.com/gtalarico/interactive-elastic-analyzer/master/app/static/screenshot2.png 26 | 27 | Running Locally 28 | ---------------- 29 | 30 | .. code:: console 31 | 32 | $ git clone git@github.com:gtalarico/interactive-elastic-analyzer.git 33 | $ cd interactive-elastic-analyzer 34 | $ pipenv install --dev 35 | $ # or virtualenv + pip install -r requirements 36 | $ python run.py 37 | 38 | 39 | Todo 40 | ------- 41 | 42 | * Implement all Token Filters 43 | * Implement Token Filter Options 44 | * Implement Token Filter Order 45 | 46 | 47 | Author 48 | ------ 49 | 50 | Send me a message on `twitter`_ 51 | 52 | .. _`twitter`: https://twitter.com/gtalarico 53 | 54 | Credits 55 | ------ 56 | 57 | * Inspired by `Elyzer `_. 58 | * `Bulma Template `_. 59 | * Uses `Searchbox Heroku Addon `_. 60 | 61 | -------------------------------------------------------------------------------- /app/static/app.js: -------------------------------------------------------------------------------- 1 | const app = new Vue({ 2 | el: "#app", 3 | data: { 4 | response: null, 5 | tokenizer: "standard", 6 | tokenFilter: [], 7 | rawTextInput: "SomeFoxes are quick-foxes, others are_not", 8 | textInput: "SomeFoxes are quick-foxes, others are_not", 9 | tokenizerConfig: {}, 10 | tokenizers: [ 11 | { 12 | name: "standard", 13 | options: [{ name: "max_token_length", default: 255 }] 14 | }, 15 | { name: "letter", options: [] }, 16 | { name: "lowercase", options: [] }, 17 | { 18 | name: "whitespace", 19 | options: [{ name: "max_token_length", default: 255 }] 20 | }, 21 | { 22 | name: "uax_url_email", 23 | options: [{ name: "max_token_length", default: 255 }] 24 | }, 25 | { 26 | name: "classic", 27 | options: [{ name: "max_token_length", default: 255 }] 28 | }, 29 | { 30 | name: "ngram", 31 | options: [ 32 | { name: "min_gram", default: 1 }, 33 | { name: "max_gram", default: 2 }, 34 | { name: "token_chars", default: [] } 35 | ] 36 | }, 37 | { 38 | name: "edge_ngram", 39 | options: [ 40 | { name: "min_gram", default: 1 }, 41 | { name: "max_gram", default: 2 }, 42 | { name: "token_chars", default: [] } 43 | ] 44 | } 45 | // { name: "keyword", options: [{ name: "buffer_size", default: "256" }] }, 46 | // { 47 | // name: "pattern", 48 | // options: [ 49 | // { name: "pattern", default: "W+" }, 50 | // { name: "flags", default: "" }, 51 | // { name: "group", default: -1 } 52 | // ] 53 | // } 54 | ], 55 | tokenFilters: [ 56 | "standard", 57 | "asciifolding", 58 | "flatten_graph", 59 | "lowercase", 60 | "uppercase", 61 | "nGram", 62 | "edgeNGram", 63 | "porter_stem", 64 | "stop", 65 | "word_delimiter", 66 | "word_delimiter_graph", 67 | "shingle", 68 | "snowball", 69 | "reverse", 70 | "kstem" 71 | // "length", 72 | // "my_stemmer" 73 | ] 74 | }, 75 | mounted() { 76 | this.doFetch(); 77 | }, 78 | computed: { 79 | reponseTokens() { 80 | if (this.response && !this.response.error) { 81 | return this.response.tokens.map(i => i.token); 82 | } else { 83 | return []; 84 | } 85 | }, 86 | tokenOptions() { 87 | return this.tokenizers.find(t => t.name == this.tokenizer).options; 88 | } 89 | }, 90 | watch: { 91 | tokenizer() { 92 | this.tokenizerConfig = {}; 93 | } 94 | }, 95 | methods: { 96 | debouncedTextInput: _.debounce(function() { 97 | this.textInput = this.rawTextInput; 98 | this.doFetch(); 99 | }, 300), 100 | doFetch() { 101 | // Next tick so watch can reset config before requesting new 102 | // Otherwise previous config is sent 103 | this.$nextTick(() => { 104 | let data = { 105 | text: this.textInput, 106 | tokenizer: this.tokenizer, 107 | tokenConfig: this.tokenizerConfig, 108 | filters: this.tokenFilter 109 | }; 110 | $axios.post("", data).then(responseData => { 111 | this.response = responseData.data; 112 | this.$nextTick(() => { 113 | Prism.highlightAll(); 114 | }); 115 | }); 116 | }); 117 | } 118 | } 119 | }); 120 | -------------------------------------------------------------------------------- /Pipfile.lock: -------------------------------------------------------------------------------- 1 | { 2 | "_meta": { 3 | "hash": { 4 | "sha256": "a244cb7d24651eec7e63f5326394458d9870c3b1e6dc4b5d0d1718ba4051ec8f" 5 | }, 6 | "pipfile-spec": 6, 7 | "requires": { 8 | "python_version": "3.6" 9 | }, 10 | "sources": [ 11 | { 12 | "name": "pypi", 13 | "url": "https://pypi.org/simple", 14 | "verify_ssl": true 15 | } 16 | ] 17 | }, 18 | "default": { 19 | "click": { 20 | "hashes": [ 21 | "sha256:29f99fc6125fbc931b758dc053b3114e55c77a6e4c6c3a2674a2dc986016381d", 22 | "sha256:f15516df478d5a56180fbf80e68f206010e6d160fc39fa508b65e035fd75130b" 23 | ], 24 | "version": "==6.7" 25 | }, 26 | "elasticsearch": { 27 | "hashes": [ 28 | "sha256:24c93ba3bb078328c70137c31d9bfcfa152f61c3df64823b99b25307123611df", 29 | "sha256:80ff7a1a56920535a9987da333c7e385b2ded27595b6de33860707dab758efbe" 30 | ], 31 | "index": "pypi", 32 | "version": "==6.3.0" 33 | }, 34 | "flask": { 35 | "hashes": [ 36 | "sha256:2271c0070dbcb5275fad4a82e29f23ab92682dc45f9dfbc22c02ba9b9322ce48", 37 | "sha256:a080b744b7e345ccfcbc77954861cb05b3c63786e93f2b3875e0913d44b43f05" 38 | ], 39 | "index": "pypi", 40 | "version": "==1.0.2" 41 | }, 42 | "gunicorn": { 43 | "hashes": [ 44 | "sha256:aa8e0b40b4157b36a5df5e599f45c9c76d6af43845ba3b3b0efe2c70473c2471", 45 | "sha256:fa2662097c66f920f53f70621c6c58ca4a3c4d3434205e608e121b5b3b71f4f3" 46 | ], 47 | "index": "pypi", 48 | "version": "==19.9.0" 49 | }, 50 | "itsdangerous": { 51 | "hashes": [ 52 | "sha256:cbb3fcf8d3e33df861709ecaf89d9e6629cff0a217bc2848f1b41cd30d360519" 53 | ], 54 | "version": "==0.24" 55 | }, 56 | "jinja2": { 57 | "hashes": [ 58 | "sha256:74c935a1b8bb9a3947c50a54766a969d4846290e1e788ea44c1392163723c3bd", 59 | "sha256:f84be1bb0040caca4cea721fcbbbbd61f9be9464ca236387158b0feea01914a4" 60 | ], 61 | "version": "==2.10" 62 | }, 63 | "markupsafe": { 64 | "hashes": [ 65 | "sha256:a6be69091dac236ea9c6bc7d012beab42010fa914c459791d627dad4910eb665" 66 | ], 67 | "version": "==1.0" 68 | }, 69 | "python-dotenv": { 70 | "hashes": [ 71 | "sha256:122290a38ece9fe4f162dc7c95cae3357b983505830a154d3c98ef7f6c6cea77", 72 | "sha256:4a205787bc829233de2a823aa328e44fd9996fedb954989a21f1fc67c13d7a77" 73 | ], 74 | "index": "pypi", 75 | "version": "==0.9.1" 76 | }, 77 | "urllib3": { 78 | "hashes": [ 79 | "sha256:a68ac5e15e76e7e5dd2b8f94007233e01effe3e50e8daddf69acfd81cb686baf", 80 | "sha256:b5725a0bd4ba422ab0e66e89e030c806576753ea3ee08554382c14e685d117b5" 81 | ], 82 | "markers": "python_version != '3.0.*' and python_version != '3.1.*' and python_version < '4' and python_version >= '2.6' and python_version != '3.3.*' and python_version != '3.2.*'", 83 | "version": "==1.23" 84 | }, 85 | "werkzeug": { 86 | "hashes": [ 87 | "sha256:c3fd7a7d41976d9f44db327260e263132466836cef6f91512889ed60ad26557c", 88 | "sha256:d5da73735293558eb1651ee2fddc4d0dedcfa06538b8813a2e20011583c9e49b" 89 | ], 90 | "version": "==0.14.1" 91 | } 92 | }, 93 | "develop": { 94 | "appdirs": { 95 | "hashes": [ 96 | "sha256:9e5896d1372858f8dd3344faf4e5014d21849c756c8d5701f78f8a103b372d92", 97 | "sha256:d8b24664561d0d34ddfaec54636d502d7cea6e29c3eaf68f3df6180863e2166e" 98 | ], 99 | "version": "==1.4.3" 100 | }, 101 | "attrs": { 102 | "hashes": [ 103 | "sha256:4b90b09eeeb9b88c35bc642cbac057e45a5fd85367b985bd2809c62b7b939265", 104 | "sha256:e0d0eb91441a3b53dab4d9b743eafc1ac44476296a2053b6ca3af0b139faf87b" 105 | ], 106 | "version": "==18.1.0" 107 | }, 108 | "black": { 109 | "hashes": [ 110 | "sha256:22158b89c1a6b4eb333a1e65e791a3f8b998cf3b11ae094adb2570f31f769a44", 111 | "sha256:4b475bbd528acce094c503a3d2dbc2d05a4075f6d0ef7d9e7514518e14cc5191" 112 | ], 113 | "index": "pypi", 114 | "version": "==18.6b4" 115 | }, 116 | "click": { 117 | "hashes": [ 118 | "sha256:29f99fc6125fbc931b758dc053b3114e55c77a6e4c6c3a2674a2dc986016381d", 119 | "sha256:f15516df478d5a56180fbf80e68f206010e6d160fc39fa508b65e035fd75130b" 120 | ], 121 | "version": "==6.7" 122 | }, 123 | "mypy": { 124 | "hashes": [ 125 | "sha256:673ea75fb750289b7d1da1331c125dc62fc1c3a8db9129bb372ae7b7d5bf300a", 126 | "sha256:c770605a579fdd4a014e9f0a34b6c7a36ce69b08100ff728e96e27445cef3b3c" 127 | ], 128 | "index": "pypi", 129 | "version": "==0.620" 130 | }, 131 | "toml": { 132 | "hashes": [ 133 | "sha256:8e86bd6ce8cc11b9620cb637466453d94f5d57ad86f17e98a98d1f73e3baab2d" 134 | ], 135 | "version": "==0.9.4" 136 | }, 137 | "typed-ast": { 138 | "hashes": [ 139 | "sha256:0948004fa228ae071054f5208840a1e88747a357ec1101c17217bfe99b299d58", 140 | "sha256:10703d3cec8dcd9eef5a630a04056bbc898abc19bac5691612acba7d1325b66d", 141 | "sha256:1f6c4bd0bdc0f14246fd41262df7dfc018d65bb05f6e16390b7ea26ca454a291", 142 | "sha256:25d8feefe27eb0303b73545416b13d108c6067b846b543738a25ff304824ed9a", 143 | "sha256:29464a177d56e4e055b5f7b629935af7f49c196be47528cc94e0a7bf83fbc2b9", 144 | "sha256:2e214b72168ea0275efd6c884b114ab42e316de3ffa125b267e732ed2abda892", 145 | "sha256:3e0d5e48e3a23e9a4d1a9f698e32a542a4a288c871d33ed8df1b092a40f3a0f9", 146 | "sha256:519425deca5c2b2bdac49f77b2c5625781abbaf9a809d727d3a5596b30bb4ded", 147 | "sha256:57fe287f0cdd9ceaf69e7b71a2e94a24b5d268b35df251a88fef5cc241bf73aa", 148 | "sha256:668d0cec391d9aed1c6a388b0d5b97cd22e6073eaa5fbaa6d2946603b4871efe", 149 | "sha256:68ba70684990f59497680ff90d18e756a47bf4863c604098f10de9716b2c0bdd", 150 | "sha256:6de012d2b166fe7a4cdf505eee3aaa12192f7ba365beeefaca4ec10e31241a85", 151 | "sha256:79b91ebe5a28d349b6d0d323023350133e927b4de5b651a8aa2db69c761420c6", 152 | "sha256:8550177fa5d4c1f09b5e5f524411c44633c80ec69b24e0e98906dd761941ca46", 153 | "sha256:898f818399cafcdb93cbbe15fc83a33d05f18e29fb498ddc09b0214cdfc7cd51", 154 | "sha256:94b091dc0f19291adcb279a108f5d38de2430411068b219f41b343c03b28fb1f", 155 | "sha256:a26863198902cda15ab4503991e8cf1ca874219e0118cbf07c126bce7c4db129", 156 | "sha256:a8034021801bc0440f2e027c354b4eafd95891b573e12ff0418dec385c76785c", 157 | "sha256:bc978ac17468fe868ee589c795d06777f75496b1ed576d308002c8a5756fb9ea", 158 | "sha256:c05b41bc1deade9f90ddc5d988fe506208019ebba9f2578c622516fd201f5863", 159 | "sha256:c9b060bd1e5a26ab6e8267fd46fc9e02b54eb15fffb16d112d4c7b1c12987559", 160 | "sha256:edb04bdd45bfd76c8292c4d9654568efaedf76fe78eb246dde69bdb13b2dad87", 161 | "sha256:f19f2a4f547505fe9072e15f6f4ae714af51b5a681a97f187971f50c283193b6" 162 | ], 163 | "version": "==1.1.0" 164 | } 165 | } 166 | } 167 | -------------------------------------------------------------------------------- /app/templates/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 13 | 14 | Interactive Elastic Analyzer 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 25 | 27 | 29 | 30 | 31 | 32 |
33 |
34 |
35 |
36 |
37 |
38 | 39 |

Interactive Elasticsearch Analyzer

40 |

41 | 42 | 43 | 44 | 45 | Github 46 | 47 | Analyzer, Tokenizer, and Token Filter Testing 48 |

49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 | 58 |
59 |
60 | 61 |
62 | 63 |
64 |
65 |
66 | 67 |
68 |
69 | 72 |
73 |
74 |
75 | 76 |
77 | 78 |
79 |
80 | 81 |

{{response.error.reason}}

82 |
83 | 84 |
85 | 86 |
87 |
88 |
89 |
90 |
91 |
92 | 93 |
94 |
95 | 96 |
97 |
98 | 101 |
102 |
103 |

Use ctrl or command to select multiple filters

104 |
105 |
106 |
107 | 108 |
109 | 110 |
111 | 112 |
113 | 114 |
115 |
116 | 117 |
118 | 119 | 120 |
121 | 122 | {{ t }} 123 |
124 |
125 | 126 | 127 |
128 | 129 |
130 |
131 |
132 |
133 |
134 |
135 | Not all Token Filters are available. 136 | Token Filter Options and Customer Orders are not supported yet. 137 | Contributions to extend functionality are welcome. 138 |
139 |
140 |
141 |
142 | This project is not associated with Elasticsearch. 143 |
For more information on see the official 144 | Documentation 145 |
146 |
147 |
148 |
149 |
150 |
151 | 152 |
153 |
154 |
155 |
156 | Interactiv Elastic Analyzer 157 | MIT license 158 |
159 |
160 |
161 |
162 | 163 | 164 |
165 | 166 | 167 | 168 | 169 | 170 | 171 | 172 | 173 | --------------------------------------------------------------------------------