Full Code of blevesearch/bleve for AI

master 6cdc0b4809a5 cached
759 files
4.5 MB
1.2M tokens
5003 symbols
1 requests
Download .txt
Showing preview only (4,871K chars total). Download the full file or copy to clipboard to get everything.
Repository: blevesearch/bleve
Branch: master
Commit: 6cdc0b4809a5
Files: 759
Total size: 4.5 MB

Directory structure:
gitextract_lgtz3phf/

├── .github/
│   └── workflows/
│       ├── cover.yml
│       └── tests.yml
├── .gitignore
├── CONTRIBUTING.md
├── LICENSE
├── README.md
├── SECURITY.md
├── analysis/
│   ├── analyzer/
│   │   ├── custom/
│   │   │   └── custom.go
│   │   ├── keyword/
│   │   │   └── keyword.go
│   │   ├── simple/
│   │   │   └── simple.go
│   │   ├── standard/
│   │   │   └── standard.go
│   │   └── web/
│   │       └── web.go
│   ├── benchmark_test.go
│   ├── char/
│   │   ├── asciifolding/
│   │   │   ├── asciifolding.go
│   │   │   └── asciifolding_test.go
│   │   ├── html/
│   │   │   └── html.go
│   │   ├── regexp/
│   │   │   ├── regexp.go
│   │   │   └── regexp_test.go
│   │   └── zerowidthnonjoiner/
│   │       └── zerowidthnonjoiner.go
│   ├── datetime/
│   │   ├── flexible/
│   │   │   ├── flexible.go
│   │   │   └── flexible_test.go
│   │   ├── iso/
│   │   │   ├── iso.go
│   │   │   └── iso_test.go
│   │   ├── optional/
│   │   │   └── optional.go
│   │   ├── percent/
│   │   │   ├── percent.go
│   │   │   └── percent_test.go
│   │   ├── sanitized/
│   │   │   ├── sanitized.go
│   │   │   └── sanitized_test.go
│   │   └── timestamp/
│   │       ├── microseconds/
│   │       │   └── microseconds.go
│   │       ├── milliseconds/
│   │       │   └── milliseconds.go
│   │       ├── nanoseconds/
│   │       │   └── nanoseconds.go
│   │       └── seconds/
│   │           └── seconds.go
│   ├── freq.go
│   ├── freq_test.go
│   ├── lang/
│   │   ├── ar/
│   │   │   ├── analyzer_ar.go
│   │   │   ├── analyzer_ar_test.go
│   │   │   ├── arabic_normalize.go
│   │   │   ├── arabic_normalize_test.go
│   │   │   ├── stemmer_ar.go
│   │   │   ├── stemmer_ar_test.go
│   │   │   ├── stop_filter_ar.go
│   │   │   └── stop_words_ar.go
│   │   ├── bg/
│   │   │   ├── stop_filter_bg.go
│   │   │   └── stop_words_bg.go
│   │   ├── ca/
│   │   │   ├── articles_ca.go
│   │   │   ├── elision_ca.go
│   │   │   ├── elision_ca_test.go
│   │   │   ├── stop_filter_ca.go
│   │   │   └── stop_words_ca.go
│   │   ├── cjk/
│   │   │   ├── analyzer_cjk.go
│   │   │   ├── analyzer_cjk_test.go
│   │   │   ├── cjk_bigram.go
│   │   │   ├── cjk_bigram_test.go
│   │   │   ├── cjk_width.go
│   │   │   └── cjk_width_test.go
│   │   ├── ckb/
│   │   │   ├── analyzer_ckb.go
│   │   │   ├── analyzer_ckb_test.go
│   │   │   ├── sorani_normalize.go
│   │   │   ├── sorani_normalize_test.go
│   │   │   ├── sorani_stemmer_filter.go
│   │   │   ├── sorani_stemmer_filter_test.go
│   │   │   ├── stop_filter_ckb.go
│   │   │   └── stop_words_ckb.go
│   │   ├── cs/
│   │   │   ├── stop_filter_cs.go
│   │   │   └── stop_words_cs.go
│   │   ├── da/
│   │   │   ├── analyzer_da.go
│   │   │   ├── analyzer_da_test.go
│   │   │   ├── stemmer_da.go
│   │   │   ├── stop_filter_da.go
│   │   │   └── stop_words_da.go
│   │   ├── de/
│   │   │   ├── analyzer_de.go
│   │   │   ├── analyzer_de_test.go
│   │   │   ├── german_normalize.go
│   │   │   ├── german_normalize_test.go
│   │   │   ├── light_stemmer_de.go
│   │   │   ├── stemmer_de_snowball.go
│   │   │   ├── stemmer_de_test.go
│   │   │   ├── stop_filter_de.go
│   │   │   └── stop_words_de.go
│   │   ├── el/
│   │   │   ├── stop_filter_el.go
│   │   │   └── stop_words_el.go
│   │   ├── en/
│   │   │   ├── analyzer_en.go
│   │   │   ├── analyzer_en_test.go
│   │   │   ├── plural_stemmer.go
│   │   │   ├── plural_stemmer_test.go
│   │   │   ├── possessive_filter_en.go
│   │   │   ├── possessive_filter_en_test.go
│   │   │   ├── stemmer_en_snowball.go
│   │   │   ├── stemmer_en_test.go
│   │   │   ├── stop_filter_en.go
│   │   │   └── stop_words_en.go
│   │   ├── es/
│   │   │   ├── analyzer_es.go
│   │   │   ├── analyzer_es_test.go
│   │   │   ├── light_stemmer_es.go
│   │   │   ├── spanish_normalize.go
│   │   │   ├── spanish_normalize_test.go
│   │   │   ├── stemmer_es_snowball.go
│   │   │   ├── stemmer_es_snowball_test.go
│   │   │   ├── stop_filter_es.go
│   │   │   └── stop_words_es.go
│   │   ├── eu/
│   │   │   ├── stop_filter_eu.go
│   │   │   └── stop_words_eu.go
│   │   ├── fa/
│   │   │   ├── analyzer_fa.go
│   │   │   ├── analyzer_fa_test.go
│   │   │   ├── persian_normalize.go
│   │   │   ├── persian_normalize_test.go
│   │   │   ├── stop_filter_fa.go
│   │   │   └── stop_words_fa.go
│   │   ├── fi/
│   │   │   ├── analyzer_fi.go
│   │   │   ├── analyzer_fi_test.go
│   │   │   ├── stemmer_fi.go
│   │   │   ├── stop_filter_fi.go
│   │   │   └── stop_words_fi.go
│   │   ├── fr/
│   │   │   ├── analyzer_fr.go
│   │   │   ├── analyzer_fr_test.go
│   │   │   ├── articles_fr.go
│   │   │   ├── elision_fr.go
│   │   │   ├── elision_fr_test.go
│   │   │   ├── light_stemmer_fr.go
│   │   │   ├── light_stemmer_fr_test.go
│   │   │   ├── minimal_stemmer_fr.go
│   │   │   ├── minimal_stemmer_fr_test.go
│   │   │   ├── stemmer_fr_snowball.go
│   │   │   ├── stemmer_fr_snowball_test.go
│   │   │   ├── stop_filter_fr.go
│   │   │   └── stop_words_fr.go
│   │   ├── ga/
│   │   │   ├── articles_ga.go
│   │   │   ├── elision_ga.go
│   │   │   ├── elision_ga_test.go
│   │   │   ├── stop_filter_ga.go
│   │   │   └── stop_words_ga.go
│   │   ├── gl/
│   │   │   ├── stop_filter_gl.go
│   │   │   └── stop_words_gl.go
│   │   ├── hi/
│   │   │   ├── analyzer_hi.go
│   │   │   ├── analyzer_hi_test.go
│   │   │   ├── hindi_normalize.go
│   │   │   ├── hindi_normalize_test.go
│   │   │   ├── hindi_stemmer_filter.go
│   │   │   ├── hindi_stemmer_filter_test.go
│   │   │   ├── stop_filter_hi.go
│   │   │   └── stop_words_hi.go
│   │   ├── hr/
│   │   │   ├── analyzer_hr.go
│   │   │   ├── analyzer_hr_test.go
│   │   │   ├── stemmer_hr.go
│   │   │   ├── stop_filter_hr.go
│   │   │   ├── stop_words_hr.go
│   │   │   └── suffix_transformation_hr.go
│   │   ├── hu/
│   │   │   ├── analyzer_hu.go
│   │   │   ├── analyzer_hu_test.go
│   │   │   ├── stemmer_hu.go
│   │   │   ├── stop_filter_hu.go
│   │   │   └── stop_words_hu.go
│   │   ├── hy/
│   │   │   ├── stop_filter_hy.go
│   │   │   └── stop_words_hy.go
│   │   ├── id/
│   │   │   ├── stop_filter_id.go
│   │   │   └── stop_words_id.go
│   │   ├── in/
│   │   │   ├── indic_normalize.go
│   │   │   ├── indic_normalize_test.go
│   │   │   └── scripts.go
│   │   ├── it/
│   │   │   ├── analyzer_it.go
│   │   │   ├── analyzer_it_test.go
│   │   │   ├── articles_it.go
│   │   │   ├── elision_it.go
│   │   │   ├── elision_it_test.go
│   │   │   ├── light_stemmer_it.go
│   │   │   ├── light_stemmer_it_test.go
│   │   │   ├── stemmer_it_snowball.go
│   │   │   ├── stemmer_it_snowball_test.go
│   │   │   ├── stop_filter_it.go
│   │   │   └── stop_words_it.go
│   │   ├── nl/
│   │   │   ├── analyzer_nl.go
│   │   │   ├── analyzer_nl_test.go
│   │   │   ├── stemmer_nl.go
│   │   │   ├── stop_filter_nl.go
│   │   │   └── stop_words_nl.go
│   │   ├── no/
│   │   │   ├── analyzer_no.go
│   │   │   ├── analyzer_no_test.go
│   │   │   ├── stemmer_no.go
│   │   │   ├── stop_filter_no.go
│   │   │   └── stop_words_no.go
│   │   ├── pl/
│   │   │   ├── analyzer_pl.go
│   │   │   ├── analyzer_pl_test.go
│   │   │   ├── stemmer_pl.go
│   │   │   ├── stemmer_pl_test.go
│   │   │   ├── stempel/
│   │   │   │   ├── LICENSE
│   │   │   │   ├── cell.go
│   │   │   │   ├── diff.go
│   │   │   │   ├── diff_test.go
│   │   │   │   ├── file.go
│   │   │   │   ├── file_test.go
│   │   │   │   ├── fuzz.go
│   │   │   │   ├── javadata/
│   │   │   │   │   ├── README.md
│   │   │   │   │   ├── fuzz.go
│   │   │   │   │   ├── input.go
│   │   │   │   │   └── input_test.go
│   │   │   │   ├── multi_trie.go
│   │   │   │   ├── pl/
│   │   │   │   │   └── stemmer_20000.tbl
│   │   │   │   ├── row.go
│   │   │   │   ├── strenum.go
│   │   │   │   ├── strenum_test.go
│   │   │   │   └── trie.go
│   │   │   ├── stop_filter_pl.go
│   │   │   └── stop_words_pl.go
│   │   ├── pt/
│   │   │   ├── analyzer_pt.go
│   │   │   ├── analyzer_pt_test.go
│   │   │   ├── light_stemmer_pt.go
│   │   │   ├── light_stemmer_pt_test.go
│   │   │   ├── stop_filter_pt.go
│   │   │   └── stop_words_pt.go
│   │   ├── ro/
│   │   │   ├── analyzer_ro.go
│   │   │   ├── analyzer_ro_test.go
│   │   │   ├── stemmer_ro.go
│   │   │   ├── stop_filter_ro.go
│   │   │   └── stop_words_ro.go
│   │   ├── ru/
│   │   │   ├── analyzer_ru.go
│   │   │   ├── analyzer_ru_test.go
│   │   │   ├── stemmer_ru.go
│   │   │   ├── stemmer_ru_test.go
│   │   │   ├── stop_filter_ru.go
│   │   │   └── stop_words_ru.go
│   │   ├── sv/
│   │   │   ├── analyzer_sv.go
│   │   │   ├── analyzer_sv_test.go
│   │   │   ├── stemmer_sv.go
│   │   │   ├── stop_filter_sv.go
│   │   │   └── stop_words_sv.go
│   │   └── tr/
│   │       ├── analyzer_tr.go
│   │       ├── analyzer_tr_test.go
│   │       ├── stemmer_tr.go
│   │       ├── stemmer_tr_test.go
│   │       ├── stop_filter_tr.go
│   │       └── stop_words_tr.go
│   ├── test_words.txt
│   ├── token/
│   │   ├── apostrophe/
│   │   │   ├── apostrophe.go
│   │   │   └── apostrophe_test.go
│   │   ├── camelcase/
│   │   │   ├── camelcase.go
│   │   │   ├── camelcase_test.go
│   │   │   ├── parser.go
│   │   │   └── states.go
│   │   ├── compound/
│   │   │   ├── dict.go
│   │   │   └── dict_test.go
│   │   ├── edgengram/
│   │   │   ├── edgengram.go
│   │   │   └── edgengram_test.go
│   │   ├── elision/
│   │   │   ├── elision.go
│   │   │   └── elision_test.go
│   │   ├── hierarchy/
│   │   │   ├── hierarchy.go
│   │   │   └── hierarchy_test.go
│   │   ├── keyword/
│   │   │   ├── keyword.go
│   │   │   └── keyword_test.go
│   │   ├── length/
│   │   │   ├── length.go
│   │   │   └── length_test.go
│   │   ├── lowercase/
│   │   │   ├── lowercase.go
│   │   │   └── lowercase_test.go
│   │   ├── ngram/
│   │   │   ├── ngram.go
│   │   │   └── ngram_test.go
│   │   ├── porter/
│   │   │   ├── porter.go
│   │   │   └── porter_test.go
│   │   ├── reverse/
│   │   │   ├── reverse.go
│   │   │   └── reverse_test.go
│   │   ├── shingle/
│   │   │   ├── shingle.go
│   │   │   └── shingle_test.go
│   │   ├── snowball/
│   │   │   ├── snowball.go
│   │   │   └── snowball_test.go
│   │   ├── stop/
│   │   │   ├── stop.go
│   │   │   └── stop_test.go
│   │   ├── truncate/
│   │   │   ├── truncate.go
│   │   │   └── truncate_test.go
│   │   ├── unicodenorm/
│   │   │   ├── unicodenorm.go
│   │   │   └── unicodenorm_test.go
│   │   └── unique/
│   │       ├── unique.go
│   │       └── unique_test.go
│   ├── tokenizer/
│   │   ├── character/
│   │   │   ├── character.go
│   │   │   └── character_test.go
│   │   ├── exception/
│   │   │   ├── exception.go
│   │   │   └── exception_test.go
│   │   ├── letter/
│   │   │   └── letter.go
│   │   ├── regexp/
│   │   │   ├── regexp.go
│   │   │   └── regexp_test.go
│   │   ├── single/
│   │   │   ├── single.go
│   │   │   └── single_test.go
│   │   ├── unicode/
│   │   │   ├── unicode.go
│   │   │   └── unicode_test.go
│   │   ├── web/
│   │   │   ├── web.go
│   │   │   └── web_test.go
│   │   └── whitespace/
│   │       ├── whitespace.go
│   │       └── whitespace_test.go
│   ├── tokenmap/
│   │   └── custom.go
│   ├── tokenmap.go
│   ├── tokenmap_test.go
│   ├── type.go
│   ├── util.go
│   └── util_test.go
├── builder.go
├── builder_test.go
├── cmd/
│   └── bleve/
│       ├── cmd/
│       │   ├── bulk.go
│       │   ├── check.go
│       │   ├── count.go
│       │   ├── create.go
│       │   ├── dictionary.go
│       │   ├── dump.go
│       │   ├── dumpDoc.go
│       │   ├── dumpFields.go
│       │   ├── fields.go
│       │   ├── index.go
│       │   ├── mapping.go
│       │   ├── query.go
│       │   ├── registry.go
│       │   ├── root.go
│       │   ├── scorch/
│       │   │   ├── ascii.go
│       │   │   ├── deleted.go
│       │   │   ├── info.go
│       │   │   ├── internal.go
│       │   │   ├── root.go
│       │   │   └── snapshot.go
│       │   └── scorch.go
│       ├── gendocs.go
│       └── main.go
├── config/
│   ├── README.md
│   └── config.go
├── config.go
├── config_app.go
├── config_disk.go
├── data/
│   └── test/
│       └── sample-data.json
├── doc.go
├── docs/
│   ├── create_and_search_your_first_index.md
│   ├── geo.md
│   ├── hierarchy.md
│   ├── index_update.md
│   ├── pagination.md
│   ├── persister.md
│   ├── query-openapi-spec.yaml
│   ├── score_fusion.md
│   ├── scoring.md
│   ├── search_autocomplete.md
│   ├── sort_facet.md
│   ├── synonyms.md
│   └── vectors.md
├── document/
│   ├── document.go
│   ├── document_test.go
│   ├── field.go
│   ├── field_boolean.go
│   ├── field_composite.go
│   ├── field_datetime.go
│   ├── field_geopoint.go
│   ├── field_geopoint_test.go
│   ├── field_geoshape.go
│   ├── field_ip.go
│   ├── field_ip_test.go
│   ├── field_numeric.go
│   ├── field_numeric_test.go
│   ├── field_synonym.go
│   ├── field_text.go
│   ├── field_vector.go
│   ├── field_vector_base64.go
│   └── field_vector_base64_test.go
├── error.go
├── examples_test.go
├── fusion/
│   ├── fusion.go
│   ├── rrf.go
│   ├── rrf_test.go
│   ├── rsf.go
│   ├── rsf_test.go
│   └── util.go
├── geo/
│   ├── README.md
│   ├── benchmark_geohash_test.go
│   ├── geo.go
│   ├── geo_dist.go
│   ├── geo_dist_test.go
│   ├── geo_s2plugin_impl.go
│   ├── geo_test.go
│   ├── geohash.go
│   ├── geohash_test.go
│   ├── parse.go
│   ├── parse_test.go
│   ├── sloppy.go
│   └── versus_test.go
├── go.mod
├── index/
│   ├── scorch/
│   │   ├── README.md
│   │   ├── builder.go
│   │   ├── builder_test.go
│   │   ├── empty.go
│   │   ├── event.go
│   │   ├── event_test.go
│   │   ├── field_dict_test.go
│   │   ├── int.go
│   │   ├── int_test.go
│   │   ├── introducer.go
│   │   ├── merge.go
│   │   ├── merge_test.go
│   │   ├── mergeplan/
│   │   │   ├── merge_plan.go
│   │   │   ├── merge_plan_test.go
│   │   │   └── sort.go
│   │   ├── optimize.go
│   │   ├── optimize_knn.go
│   │   ├── persister.go
│   │   ├── reader_test.go
│   │   ├── regexp.go
│   │   ├── regexp_test.go
│   │   ├── rollback.go
│   │   ├── rollback_test.go
│   │   ├── scorch.go
│   │   ├── scorch_test.go
│   │   ├── segment_plugin.go
│   │   ├── snapshot_index.go
│   │   ├── snapshot_index_dict.go
│   │   ├── snapshot_index_doc.go
│   │   ├── snapshot_index_str.go
│   │   ├── snapshot_index_test.go
│   │   ├── snapshot_index_tfr.go
│   │   ├── snapshot_index_thes.go
│   │   ├── snapshot_index_vr.go
│   │   ├── snapshot_segment.go
│   │   ├── snapshot_vector_index.go
│   │   ├── stats.go
│   │   └── unadorned.go
│   └── upsidedown/
│       ├── analysis.go
│       ├── analysis_test.go
│       ├── benchmark_all.sh
│       ├── benchmark_boltdb_test.go
│       ├── benchmark_common_test.go
│       ├── benchmark_gtreap_test.go
│       ├── benchmark_null_test.go
│       ├── dump.go
│       ├── dump_test.go
│       ├── field_cache.go
│       ├── field_dict.go
│       ├── field_dict_test.go
│       ├── index_reader.go
│       ├── protoc-README.md
│       ├── reader.go
│       ├── reader_test.go
│       ├── row.go
│       ├── row_merge.go
│       ├── row_merge_test.go
│       ├── row_test.go
│       ├── stats.go
│       ├── store/
│       │   ├── boltdb/
│       │   │   ├── iterator.go
│       │   │   ├── reader.go
│       │   │   ├── stats.go
│       │   │   ├── store.go
│       │   │   ├── store_test.go
│       │   │   └── writer.go
│       │   ├── goleveldb/
│       │   │   ├── batch.go
│       │   │   ├── config.go
│       │   │   ├── iterator.go
│       │   │   ├── reader.go
│       │   │   ├── store.go
│       │   │   ├── store_test.go
│       │   │   └── writer.go
│       │   ├── gtreap/
│       │   │   ├── iterator.go
│       │   │   ├── reader.go
│       │   │   ├── store.go
│       │   │   ├── store_test.go
│       │   │   └── writer.go
│       │   ├── metrics/
│       │   │   ├── batch.go
│       │   │   ├── iterator.go
│       │   │   ├── metrics_test.go
│       │   │   ├── reader.go
│       │   │   ├── stats.go
│       │   │   ├── store.go
│       │   │   ├── store_test.go
│       │   │   ├── util.go
│       │   │   └── writer.go
│       │   ├── moss/
│       │   │   ├── batch.go
│       │   │   ├── iterator.go
│       │   │   ├── lower.go
│       │   │   ├── lower_test.go
│       │   │   ├── reader.go
│       │   │   ├── stats.go
│       │   │   ├── store.go
│       │   │   ├── store_test.go
│       │   │   └── writer.go
│       │   └── null/
│       │       ├── null.go
│       │       └── null_test.go
│       ├── upsidedown.go
│       ├── upsidedown.pb.go
│       ├── upsidedown.proto
│       └── upsidedown_test.go
├── index.go
├── index_alias.go
├── index_alias_impl.go
├── index_alias_impl_test.go
├── index_impl.go
├── index_meta.go
├── index_meta_test.go
├── index_stats.go
├── index_test.go
├── index_update.go
├── index_update_test.go
├── mapping/
│   ├── analysis.go
│   ├── document.go
│   ├── examples_test.go
│   ├── field.go
│   ├── index.go
│   ├── mapping.go
│   ├── mapping_no_vectors.go
│   ├── mapping_test.go
│   ├── mapping_vectors.go
│   ├── mapping_vectors_test.go
│   ├── reflect.go
│   ├── reflect_test.go
│   └── synonym.go
├── mapping.go
├── mapping_vector.go
├── numeric/
│   ├── bin.go
│   ├── bin_test.go
│   ├── float.go
│   ├── float_test.go
│   ├── prefix_coded.go
│   └── prefix_coded_test.go
├── pre_search.go
├── query.go
├── query_bench_test.go
├── registry/
│   ├── analyzer.go
│   ├── cache.go
│   ├── char_filter.go
│   ├── datetime_parser.go
│   ├── fragment_formatter.go
│   ├── fragmenter.go
│   ├── highlighter.go
│   ├── index_type.go
│   ├── nested.go
│   ├── registry.go
│   ├── store.go
│   ├── synonym_source.go
│   ├── token_filter.go
│   ├── token_maps.go
│   └── tokenizer.go
├── rescorer.go
├── rescorer_knn_test.go
├── rescorer_test.go
├── search/
│   ├── collector/
│   │   ├── bench_test.go
│   │   ├── eligible.go
│   │   ├── heap.go
│   │   ├── knn.go
│   │   ├── list.go
│   │   ├── nested.go
│   │   ├── search_test.go
│   │   ├── slice.go
│   │   ├── topn.go
│   │   └── topn_test.go
│   ├── collector.go
│   ├── explanation.go
│   ├── facet/
│   │   ├── benchmark_data.txt
│   │   ├── facet_builder_datetime.go
│   │   ├── facet_builder_numeric.go
│   │   ├── facet_builder_numeric_test.go
│   │   ├── facet_builder_terms.go
│   │   └── facet_builder_terms_test.go
│   ├── facets_builder.go
│   ├── facets_builder_test.go
│   ├── highlight/
│   │   ├── format/
│   │   │   ├── ansi/
│   │   │   │   └── ansi.go
│   │   │   ├── html/
│   │   │   │   ├── html.go
│   │   │   │   └── html_test.go
│   │   │   └── plain/
│   │   │       ├── plain.go
│   │   │       └── plain_test.go
│   │   ├── fragmenter/
│   │   │   └── simple/
│   │   │       ├── simple.go
│   │   │       └── simple_test.go
│   │   ├── highlighter/
│   │   │   ├── ansi/
│   │   │   │   └── ansi.go
│   │   │   ├── html/
│   │   │   │   └── html.go
│   │   │   └── simple/
│   │   │       ├── fragment_scorer_simple.go
│   │   │       ├── fragment_scorer_simple_test.go
│   │   │       ├── highlighter_simple.go
│   │   │       └── highlighter_simple_test.go
│   │   ├── highlighter.go
│   │   ├── term_locations.go
│   │   └── term_locations_test.go
│   ├── levenshtein.go
│   ├── levenshtein_test.go
│   ├── pool.go
│   ├── pool_test.go
│   ├── query/
│   │   ├── bool_field.go
│   │   ├── boolean.go
│   │   ├── boost.go
│   │   ├── conjunction.go
│   │   ├── date_range.go
│   │   ├── date_range_string.go
│   │   ├── date_range_test.go
│   │   ├── disjunction.go
│   │   ├── docid.go
│   │   ├── fuzzy.go
│   │   ├── geo_boundingbox.go
│   │   ├── geo_boundingpolygon.go
│   │   ├── geo_distance.go
│   │   ├── geo_shape.go
│   │   ├── ip_range.go
│   │   ├── knn.go
│   │   ├── match.go
│   │   ├── match_all.go
│   │   ├── match_none.go
│   │   ├── match_phrase.go
│   │   ├── match_phrase_test.go
│   │   ├── multi_phrase.go
│   │   ├── numeric_range.go
│   │   ├── phrase.go
│   │   ├── prefix.go
│   │   ├── query.go
│   │   ├── query_string.go
│   │   ├── query_string.y
│   │   ├── query_string.y.go
│   │   ├── query_string_lex.go
│   │   ├── query_string_lex_test.go
│   │   ├── query_string_parser.go
│   │   ├── query_string_parser_test.go
│   │   ├── query_test.go
│   │   ├── regexp.go
│   │   ├── term.go
│   │   ├── term_range.go
│   │   └── wildcard.go
│   ├── scorer/
│   │   ├── scorer_conjunction.go
│   │   ├── scorer_constant.go
│   │   ├── scorer_constant_test.go
│   │   ├── scorer_disjunction.go
│   │   ├── scorer_knn.go
│   │   ├── scorer_knn_test.go
│   │   ├── scorer_term.go
│   │   ├── scorer_term_test.go
│   │   └── sqrt_cache.go
│   ├── search.go
│   ├── search_test.go
│   ├── searcher/
│   │   ├── base_test.go
│   │   ├── geoshape_contains_test.go
│   │   ├── geoshape_intersects_test.go
│   │   ├── geoshape_within_test.go
│   │   ├── optimize_knn.go
│   │   ├── optimize_no_knn.go
│   │   ├── ordered_searchers_list.go
│   │   ├── search_boolean.go
│   │   ├── search_boolean_test.go
│   │   ├── search_conjunction.go
│   │   ├── search_conjunction_nested.go
│   │   ├── search_conjunction_test.go
│   │   ├── search_disjunction.go
│   │   ├── search_disjunction_heap.go
│   │   ├── search_disjunction_slice.go
│   │   ├── search_disjunction_test.go
│   │   ├── search_docid.go
│   │   ├── search_docid_test.go
│   │   ├── search_filter.go
│   │   ├── search_fuzzy.go
│   │   ├── search_fuzzy_test.go
│   │   ├── search_geoboundingbox.go
│   │   ├── search_geoboundingbox_test.go
│   │   ├── search_geopointdistance.go
│   │   ├── search_geopointdistance_test.go
│   │   ├── search_geopolygon.go
│   │   ├── search_geopolygon_test.go
│   │   ├── search_geoshape.go
│   │   ├── search_geoshape_circle_test.go
│   │   ├── search_geoshape_envelope_test.go
│   │   ├── search_geoshape_geometrycollection_test.go
│   │   ├── search_geoshape_linestring_test.go
│   │   ├── search_geoshape_points_test.go
│   │   ├── search_geoshape_polygon_test.go
│   │   ├── search_ip_range.go
│   │   ├── search_ip_range_test.go
│   │   ├── search_knn.go
│   │   ├── search_match_all.go
│   │   ├── search_match_all_test.go
│   │   ├── search_match_none.go
│   │   ├── search_match_none_test.go
│   │   ├── search_multi_term.go
│   │   ├── search_numeric_range.go
│   │   ├── search_numeric_range_test.go
│   │   ├── search_phrase.go
│   │   ├── search_phrase_test.go
│   │   ├── search_regexp.go
│   │   ├── search_regexp_test.go
│   │   ├── search_term.go
│   │   ├── search_term_prefix.go
│   │   ├── search_term_range.go
│   │   ├── search_term_range_test.go
│   │   └── search_term_test.go
│   ├── sort.go
│   ├── sort_test.go
│   ├── util.go
│   └── util_test.go
├── search.go
├── search_knn.go
├── search_knn_test.go
├── search_nested_test.go
├── search_no_knn.go
├── search_test.go
├── size/
│   └── sizes.go
├── test/
│   ├── integration.go
│   ├── integration_test.go
│   ├── ip_field_test.go
│   ├── tests/
│   │   ├── alias/
│   │   │   ├── datasets/
│   │   │   │   ├── shard0/
│   │   │   │   │   ├── a.json
│   │   │   │   │   └── c.json
│   │   │   │   └── shard1/
│   │   │   │       ├── b.json
│   │   │   │       └── d.json
│   │   │   ├── mapping.json
│   │   │   └── searches.json
│   │   ├── basic/
│   │   │   ├── data/
│   │   │   │   ├── a.json
│   │   │   │   ├── b.json
│   │   │   │   ├── c.json
│   │   │   │   └── d.json
│   │   │   ├── mapping.json
│   │   │   └── searches.json
│   │   ├── employee/
│   │   │   ├── data/
│   │   │   │   └── emp10508560.json
│   │   │   ├── mapping.json
│   │   │   └── searches.json
│   │   ├── facet/
│   │   │   ├── data/
│   │   │   │   ├── a.json
│   │   │   │   ├── b.json
│   │   │   │   ├── c.json
│   │   │   │   ├── d.json
│   │   │   │   ├── e.json
│   │   │   │   ├── f.json
│   │   │   │   ├── g.json
│   │   │   │   ├── h.json
│   │   │   │   ├── i.json
│   │   │   │   └── j.json
│   │   │   ├── mapping.json
│   │   │   └── searches.json
│   │   ├── fosdem/
│   │   │   ├── data/
│   │   │   │   ├── 3311@FOSDEM15@fosdem.org.json
│   │   │   │   ├── 3492@FOSDEM15@fosdem.org.json
│   │   │   │   ├── 3496@FOSDEM15@fosdem.org.json
│   │   │   │   ├── 3505@FOSDEM15@fosdem.org.json
│   │   │   │   └── 3507@FOSDEM15@fosdem.org.json
│   │   │   ├── mapping.json
│   │   │   └── searches.json
│   │   ├── geo/
│   │   │   ├── data/
│   │   │   │   ├── amoeba_brewery.json
│   │   │   │   ├── brewpub_on_the_green.json
│   │   │   │   ├── capital_city_brewing_company.json
│   │   │   │   ├── communiti_brewery.json
│   │   │   │   ├── firehouse_grill_brewery.json
│   │   │   │   ├── hook_ladder_brewing_company.json
│   │   │   │   ├── jack_s_brewing.json
│   │   │   │   ├── social_brewery.json
│   │   │   │   └── sweet_water_tavern_and_brewery.json
│   │   │   ├── mapping.json
│   │   │   └── searches.json
│   │   ├── geoshapes/
│   │   │   ├── data/
│   │   │   │   ├── circle_halairport.json
│   │   │   │   ├── envelope_brockwell_park.json
│   │   │   │   ├── geometrycollection_tvm.json
│   │   │   │   ├── linestring_putney_bridge.json
│   │   │   │   ├── multilinestring_old_airport_road.json
│   │   │   │   ├── multipoint_blr_stadiums.json
│   │   │   │   ├── multipolygon_london_parks.json
│   │   │   │   ├── point_museum_of_london.json
│   │   │   │   └── polygon_cubbonpark.json
│   │   │   ├── mapping.json
│   │   │   └── searches.json
│   │   ├── phrase/
│   │   │   ├── data/
│   │   │   │   ├── a.json
│   │   │   │   └── b.json
│   │   │   ├── mapping.json
│   │   │   └── searches.json
│   │   └── sort/
│   │       ├── data/
│   │       │   ├── a.json
│   │       │   ├── b.json
│   │       │   ├── c.json
│   │       │   ├── d.json
│   │       │   ├── e.json
│   │       │   └── f.json
│   │       ├── mapping.json
│   │       └── searches.json
│   ├── versus_score_test.go
│   └── versus_test.go
└── util/
    ├── extract.go
    ├── json.go
    └── keys.go

================================================
FILE CONTENTS
================================================

================================================
FILE: .github/workflows/cover.yml
================================================
on:
  push:
    branches:
      - master
  pull_request:
name: Coverage
jobs:
  coverage:
    runs-on: ubuntu-latest
    steps:
      - name: Install Go
        uses: actions/setup-go@v5
        with:
          go-version: '1.25.x'
      - name: Checkout code
        uses: actions/checkout@v2
      - name: Clean environment
        run: |
          go clean -cache -testcache -modcache
          rm -f profile.cov
      - name: Test
        run: |
          go test -coverprofile=profile.cov ./...
      - name: Remove non-GO entries from coverage profile
        run: |
          grep -E 'mode|\.go' profile.cov > profile_go.cov
      - name: Send coverage
        uses: shogo82148/actions-goveralls@v1
        with:
          path-to-profile: profile_go.cov


================================================
FILE: .github/workflows/tests.yml
================================================
on:
  push:
    branches:
    - master
  pull_request:
name: Tests
jobs:
  test:
    strategy:
      matrix:
        go-version: [1.23.x, 1.24.x, 1.25.x]
        platform: [ubuntu-latest, macos-latest, windows-latest]
    runs-on: ${{ matrix.platform }}
    steps:
    - name: Install Go
      uses: actions/setup-go@v5
      with:
        go-version: ${{ matrix.go-version }}
    - name: Checkout code
      uses: actions/checkout@v2
    - name: Test
      run: |
        go version
        go test -race ./...


================================================
FILE: .gitignore
================================================
#*
*.sublime-*
*~
.#*
.project
.settings
**/.idea/
**/*.iml
.DS_Store
query_string.y.go.tmp
/analysis/token_filters/cld2/cld2-read-only
/analysis/token_filters/cld2/libcld2_full.a
/cmd/bleve/bleve
vendor/**
!vendor/manifest
/y.output
/search/query/y.output
*.test
tags
go.sum


================================================
FILE: CONTRIBUTING.md
================================================
# Contributing to Bleve

We look forward to your contributions, but ask that you first review these guidelines.

## Sign the CLA

As Bleve is a Couchbase project we require contributors accept the [Couchbase Contributor License Agreement](http://review.couchbase.org/static/individual_agreement.html). To sign this agreement log into the Couchbase [code review tool](http://review.couchbase.org/). The Bleve project does not use this code review tool but it is still used to track acceptance of the contributor license agreements.

## Submitting a Pull Request

All types of contributions are welcome, but please keep the following in mind:

- If you're planning a large change, you should really discuss it in a github issue or on the google group first. This helps avoid duplicate effort and spending time on something that may not be merged.
- Existing tests should continue to pass, new tests for the contribution are nice to have.
- All code should have gone through `go fmt`
- All code should pass `go vet`


================================================
FILE: LICENSE
================================================

                                 Apache License
                           Version 2.0, January 2004
                        http://www.apache.org/licenses/

   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

   1. Definitions.

      "License" shall mean the terms and conditions for use, reproduction,
      and distribution as defined by Sections 1 through 9 of this document.

      "Licensor" shall mean the copyright owner or entity authorized by
      the copyright owner that is granting the License.

      "Legal Entity" shall mean the union of the acting entity and all
      other entities that control, are controlled by, or are under common
      control with that entity. For the purposes of this definition,
      "control" means (i) the power, direct or indirect, to cause the
      direction or management of such entity, whether by contract or
      otherwise, or (ii) ownership of fifty percent (50%) or more of the
      outstanding shares, or (iii) beneficial ownership of such entity.

      "You" (or "Your") shall mean an individual or Legal Entity
      exercising permissions granted by this License.

      "Source" form shall mean the preferred form for making modifications,
      including but not limited to software source code, documentation
      source, and configuration files.

      "Object" form shall mean any form resulting from mechanical
      transformation or translation of a Source form, including but
      not limited to compiled object code, generated documentation,
      and conversions to other media types.

      "Work" shall mean the work of authorship, whether in Source or
      Object form, made available under the License, as indicated by a
      copyright notice that is included in or attached to the work
      (an example is provided in the Appendix below).

      "Derivative Works" shall mean any work, whether in Source or Object
      form, that is based on (or derived from) the Work and for which the
      editorial revisions, annotations, elaborations, or other modifications
      represent, as a whole, an original work of authorship. For the purposes
      of this License, Derivative Works shall not include works that remain
      separable from, or merely link (or bind by name) to the interfaces of,
      the Work and Derivative Works thereof.

      "Contribution" shall mean any work of authorship, including
      the original version of the Work and any modifications or additions
      to that Work or Derivative Works thereof, that is intentionally
      submitted to Licensor for inclusion in the Work by the copyright owner
      or by an individual or Legal Entity authorized to submit on behalf of
      the copyright owner. For the purposes of this definition, "submitted"
      means any form of electronic, verbal, or written communication sent
      to the Licensor or its representatives, including but not limited to
      communication on electronic mailing lists, source code control systems,
      and issue tracking systems that are managed by, or on behalf of, the
      Licensor for the purpose of discussing and improving the Work, but
      excluding communication that is conspicuously marked or otherwise
      designated in writing by the copyright owner as "Not a Contribution."

      "Contributor" shall mean Licensor and any individual or Legal Entity
      on behalf of whom a Contribution has been received by Licensor and
      subsequently incorporated within the Work.

   2. Grant of Copyright License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      copyright license to reproduce, prepare Derivative Works of,
      publicly display, publicly perform, sublicense, and distribute the
      Work and such Derivative Works in Source or Object form.

   3. Grant of Patent License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      (except as stated in this section) patent license to make, have made,
      use, offer to sell, sell, import, and otherwise transfer the Work,
      where such license applies only to those patent claims licensable
      by such Contributor that are necessarily infringed by their
      Contribution(s) alone or by combination of their Contribution(s)
      with the Work to which such Contribution(s) was submitted. If You
      institute patent litigation against any entity (including a
      cross-claim or counterclaim in a lawsuit) alleging that the Work
      or a Contribution incorporated within the Work constitutes direct
      or contributory patent infringement, then any patent licenses
      granted to You under this License for that Work shall terminate
      as of the date such litigation is filed.

   4. Redistribution. You may reproduce and distribute copies of the
      Work or Derivative Works thereof in any medium, with or without
      modifications, and in Source or Object form, provided that You
      meet the following conditions:

      (a) You must give any other recipients of the Work or
          Derivative Works a copy of this License; and

      (b) You must cause any modified files to carry prominent notices
          stating that You changed the files; and

      (c) You must retain, in the Source form of any Derivative Works
          that You distribute, all copyright, patent, trademark, and
          attribution notices from the Source form of the Work,
          excluding those notices that do not pertain to any part of
          the Derivative Works; and

      (d) If the Work includes a "NOTICE" text file as part of its
          distribution, then any Derivative Works that You distribute must
          include a readable copy of the attribution notices contained
          within such NOTICE file, excluding those notices that do not
          pertain to any part of the Derivative Works, in at least one
          of the following places: within a NOTICE text file distributed
          as part of the Derivative Works; within the Source form or
          documentation, if provided along with the Derivative Works; or,
          within a display generated by the Derivative Works, if and
          wherever such third-party notices normally appear. The contents
          of the NOTICE file are for informational purposes only and
          do not modify the License. You may add Your own attribution
          notices within Derivative Works that You distribute, alongside
          or as an addendum to the NOTICE text from the Work, provided
          that such additional attribution notices cannot be construed
          as modifying the License.

      You may add Your own copyright statement to Your modifications and
      may provide additional or different license terms and conditions
      for use, reproduction, or distribution of Your modifications, or
      for any such Derivative Works as a whole, provided Your use,
      reproduction, and distribution of the Work otherwise complies with
      the conditions stated in this License.

   5. Submission of Contributions. Unless You explicitly state otherwise,
      any Contribution intentionally submitted for inclusion in the Work
      by You to the Licensor shall be under the terms and conditions of
      this License, without any additional terms or conditions.
      Notwithstanding the above, nothing herein shall supersede or modify
      the terms of any separate license agreement you may have executed
      with Licensor regarding such Contributions.

   6. Trademarks. This License does not grant permission to use the trade
      names, trademarks, service marks, or product names of the Licensor,
      except as required for reasonable and customary use in describing the
      origin of the Work and reproducing the content of the NOTICE file.

   7. Disclaimer of Warranty. Unless required by applicable law or
      agreed to in writing, Licensor provides the Work (and each
      Contributor provides its Contributions) on an "AS IS" BASIS,
      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
      implied, including, without limitation, any warranties or conditions
      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
      PARTICULAR PURPOSE. You are solely responsible for determining the
      appropriateness of using or redistributing the Work and assume any
      risks associated with Your exercise of permissions under this License.

   8. Limitation of Liability. In no event and under no legal theory,
      whether in tort (including negligence), contract, or otherwise,
      unless required by applicable law (such as deliberate and grossly
      negligent acts) or agreed to in writing, shall any Contributor be
      liable to You for damages, including any direct, indirect, special,
      incidental, or consequential damages of any character arising as a
      result of this License or out of the use or inability to use the
      Work (including but not limited to damages for loss of goodwill,
      work stoppage, computer failure or malfunction, or any and all
      other commercial damages or losses), even if such Contributor
      has been advised of the possibility of such damages.

   9. Accepting Warranty or Additional Liability. While redistributing
      the Work or Derivative Works thereof, You may choose to offer,
      and charge a fee for, acceptance of support, warranty, indemnity,
      or other liability obligations and/or rights consistent with this
      License. However, in accepting such obligations, You may act only
      on Your own behalf and on Your sole responsibility, not on behalf
      of any other Contributor, and only if You agree to indemnify,
      defend, and hold each Contributor harmless for any liability
      incurred by, or claims asserted against, such Contributor by reason
      of your accepting any such warranty or additional liability.

   END OF TERMS AND CONDITIONS

   APPENDIX: How to apply the Apache License to your work.

      To apply the Apache License to your work, attach the following
      boilerplate notice, with the fields enclosed by brackets "[]"
      replaced with your own identifying information. (Don't include
      the brackets!)  The text should be enclosed in the appropriate
      comment syntax for the file format. We also recommend that a
      file or class name and description of purpose be included on the
      same "printed page" as the copyright notice for easier
      identification within third-party archives.

   Copyright [yyyy] [name of copyright owner]

   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
   You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.

================================================
FILE: README.md
================================================
# ![bleve](docs/bleve.png) bleve

[![Tests](https://github.com/blevesearch/bleve/actions/workflows/tests.yml/badge.svg?branch=master&event=push)](https://github.com/blevesearch/bleve/actions/workflows/tests.yml?query=event%3Apush+branch%3Amaster)
[![Coverage Status](https://coveralls.io/repos/github/blevesearch/bleve/badge.svg)](https://coveralls.io/github/blevesearch/bleve)
[![Go Reference](https://pkg.go.dev/badge/github.com/blevesearch/bleve/v2.svg)](https://pkg.go.dev/github.com/blevesearch/bleve/v2)
[![Join the chat](https://badges.gitter.im/join_chat.svg)](https://app.gitter.im/#/room/#blevesearch_bleve:gitter.im)
[![Go Report Card](https://goreportcard.com/badge/github.com/blevesearch/bleve/v2)](https://goreportcard.com/report/github.com/blevesearch/bleve/v2)
[![Sourcegraph](https://sourcegraph.com/github.com/blevesearch/bleve/-/badge.svg)](https://sourcegraph.com/github.com/blevesearch/bleve?badge)
[![License](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](https://opensource.org/licenses/Apache-2.0)

A modern indexing + search library in GO

## Features

* Index any GO data structure or JSON
* Intelligent defaults backed up by powerful configuration ([scorch](https://github.com/blevesearch/bleve/blob/master/index/scorch/README.md))
* Supported field types:
  * `text`, `number`, `datetime`, `boolean`, `geopoint`, `geoshape`, `IP`, `vector`
* Supported query types:
  * `term`, `phrase`, `match`, `match_phrase`, `prefix`, `regexp`, `wildcard`, `fuzzy`
  * term range, numeric range, date range, boolean field
  * compound queries: `conjuncts`, `disjuncts`, boolean (`must`/`should`/`must_not`)
  * [query string syntax](http://www.blevesearch.com/docs/Query-String-Query/)
  * [geo spatial search](https://github.com/blevesearch/bleve/blob/master/geo/README.md)
  * approximate k-nearest neighbors via [vector search](https://github.com/blevesearch/bleve/blob/master/docs/vectors.md)
  * [synonym search](https://github.com/blevesearch/bleve/blob/master/docs/synonyms.md)
  * [hierarchical nested search](https://github.com/blevesearch/bleve/blob/master/docs/hierarchy.md)
* [tf-idf](https://github.com/blevesearch/bleve/blob/master/docs/scoring.md#tf-idf) / [bm25](https://github.com/blevesearch/bleve/blob/master/docs/scoring.md#bm25) scoring models
* Hybrid search: exact + semantic
  * Supports [RRF (Reciprocal Rank Fusion) and RSF (Relative Score Fusion)](docs/score_fusion.md)
* [Result pagination](https://github.com/blevesearch/bleve/blob/master/docs/pagination.md)
* Query time boosting
* Search result match highlighting with document fragments
* Aggregations/faceting support:
  * terms facet
  * numeric range facet
  * date range facet

## Indexing

```go
message := struct {
    Id   string
    From string
    Body string
}{
    Id:   "example",
    From: "xyz@couchbase.com",
    Body: "bleve indexing is easy",
}

mapping := bleve.NewIndexMapping()
index, err := bleve.New("example.bleve", mapping)
if err != nil {
    panic(err)
}
index.Index(message.Id, message)
```

## Querying

```go
index, _ := bleve.Open("example.bleve")
query := bleve.NewQueryStringQuery("bleve")
searchRequest := bleve.NewSearchRequest(query)
searchResult, _ := index.Search(searchRequest)
```

## Command Line Interface

To install the CLI for the latest release of bleve, run:

```bash
go install github.com/blevesearch/bleve/v2/cmd/bleve@latest
```

```text
$ bleve --help
Bleve is a command-line tool to interact with a bleve index.

Usage:
  bleve [command]

Available Commands:
  bulk        bulk loads from newline delimited JSON files
  check       checks the contents of the index
  count       counts the number documents in the index
  create      creates a new index
  dictionary  prints the term dictionary for the specified field in the index
  dump        dumps the contents of the index
  fields      lists the fields in this index
  help        Help about any command
  index       adds the files to the index
  mapping     prints the mapping used for this index
  query       queries the index
  registry    registry lists the bleve components compiled into this executable
  scorch      command-line tool to interact with a scorch index

Flags:
  -h, --help   help for bleve

Use "bleve [command] --help" for more information about a command.
```

## Text Analysis

Bleve includes general-purpose analyzers (customizable) as well as pre-built text analyzers for the following languages:

Arabic (ar), Bulgarian (bg), Catalan (ca), Chinese-Japanese-Korean (cjk), Kurdish (ckb), Danish (da), German (de), Greek (el), English (en), Spanish - Castilian (es), Basque (eu), Persian (fa), Finnish (fi), French (fr), Gaelic (ga), Spanish - Galician (gl), Hindi (hi), Croatian (hr), Hungarian (hu), Armenian (hy), Indonesian (id, in), Italian (it), Dutch (nl), Norwegian (no), Polish (pl), Portuguese (pt), Romanian (ro), Russian (ru), Swedish (sv), Turkish (tr)

## Text Analysis Wizard

[bleveanalysis.couchbase.com](https://bleveanalysis.couchbase.com)

## Discussion/Issues

Discuss usage/development of bleve and/or report issues here:

* [Github issues](https://github.com/blevesearch/bleve/issues)
* [Google group](https://groups.google.com/forum/#!forum/bleve)

## License

Apache License Version 2.0


================================================
FILE: SECURITY.md
================================================
# Security Policy

## Supported Versions

We support the latest release (for example, bleve v2.5.x).

## Reporting a Vulnerability

All security issues for this project should be reported via email to [security@couchbase.com](mailto:security@couchbase.com) and [fts-team@couchbase.com](mailto:fts-team@couchbase.com).

This mail will be delivered to the owners of this project.

- To ensure your report is NOT marked as spam, please include the word "security/vulnerability" along with the project name (blevesearch/bleve) in the subject of the email.
- Please be as descriptive as possible while explaining the issue, and a testcase highlighting the issue is always welcome.

Your email will be acknowledged at the soonest possible.


================================================
FILE: analysis/analyzer/custom/custom.go
================================================
//  Copyright (c) 2014 Couchbase, Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// 		http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package custom

import (
	"fmt"

	"github.com/blevesearch/bleve/v2/analysis"
	"github.com/blevesearch/bleve/v2/registry"
)

const Name = "custom"

func AnalyzerConstructor(config map[string]interface{}, cache *registry.Cache) (analysis.Analyzer, error) {

	var err error
	var charFilters []analysis.CharFilter
	charFiltersValue, ok := config["char_filters"]
	if ok {
		switch charFiltersValue := charFiltersValue.(type) {
		case []string:
			charFilters, err = getCharFilters(charFiltersValue, cache)
			if err != nil {
				return nil, err
			}
		case []interface{}:
			charFiltersNames, err := convertInterfaceSliceToStringSlice(charFiltersValue, "char filter")
			if err != nil {
				return nil, err
			}
			charFilters, err = getCharFilters(charFiltersNames, cache)
			if err != nil {
				return nil, err
			}
		default:
			return nil, fmt.Errorf("unsupported type for char_filters, must be slice")
		}
	}

	var tokenizerName string
	tokenizerValue, ok := config["tokenizer"]
	if ok {
		tokenizerName, ok = tokenizerValue.(string)
		if !ok {
			return nil, fmt.Errorf("must specify tokenizer as string")
		}
	} else {
		return nil, fmt.Errorf("must specify tokenizer")
	}

	tokenizer, err := cache.TokenizerNamed(tokenizerName)
	if err != nil {
		return nil, err
	}

	var tokenFilters []analysis.TokenFilter
	tokenFiltersValue, ok := config["token_filters"]
	if ok {
		switch tokenFiltersValue := tokenFiltersValue.(type) {
		case []string:
			tokenFilters, err = getTokenFilters(tokenFiltersValue, cache)
			if err != nil {
				return nil, err
			}
		case []interface{}:
			tokenFiltersNames, err := convertInterfaceSliceToStringSlice(tokenFiltersValue, "token filter")
			if err != nil {
				return nil, err
			}
			tokenFilters, err = getTokenFilters(tokenFiltersNames, cache)
			if err != nil {
				return nil, err
			}
		default:
			return nil, fmt.Errorf("unsupported type for token_filters, must be slice")
		}
	}

	rv := analysis.DefaultAnalyzer{
		Tokenizer: tokenizer,
	}
	if charFilters != nil {
		rv.CharFilters = charFilters
	}
	if tokenFilters != nil {
		rv.TokenFilters = tokenFilters
	}
	return &rv, nil
}

func init() {
	err := registry.RegisterAnalyzer(Name, AnalyzerConstructor)
	if err != nil {
		panic(err)
	}
}

func getCharFilters(charFilterNames []string, cache *registry.Cache) ([]analysis.CharFilter, error) {
	charFilters := make([]analysis.CharFilter, len(charFilterNames))
	for i, charFilterName := range charFilterNames {
		charFilter, err := cache.CharFilterNamed(charFilterName)
		if err != nil {
			return nil, err
		}
		charFilters[i] = charFilter
	}

	return charFilters, nil
}

func getTokenFilters(tokenFilterNames []string, cache *registry.Cache) ([]analysis.TokenFilter, error) {
	tokenFilters := make([]analysis.TokenFilter, len(tokenFilterNames))
	for i, tokenFilterName := range tokenFilterNames {
		tokenFilter, err := cache.TokenFilterNamed(tokenFilterName)
		if err != nil {
			return nil, err
		}
		tokenFilters[i] = tokenFilter
	}

	return tokenFilters, nil
}

func convertInterfaceSliceToStringSlice(interfaceSlice []interface{}, objType string) ([]string, error) {
	stringSlice := make([]string, len(interfaceSlice))
	for i, interfaceObj := range interfaceSlice {
		stringObj, ok := interfaceObj.(string)
		if ok {
			stringSlice[i] = stringObj
		} else {
			return nil, fmt.Errorf("%s name must be a string", objType)
		}
	}

	return stringSlice, nil
}


================================================
FILE: analysis/analyzer/keyword/keyword.go
================================================
//  Copyright (c) 2014 Couchbase, Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// 		http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package keyword

import (
	"github.com/blevesearch/bleve/v2/analysis"
	"github.com/blevesearch/bleve/v2/analysis/tokenizer/single"
	"github.com/blevesearch/bleve/v2/registry"
)

const Name = "keyword"

func AnalyzerConstructor(config map[string]interface{}, cache *registry.Cache) (analysis.Analyzer, error) {
	keywordTokenizer, err := cache.TokenizerNamed(single.Name)
	if err != nil {
		return nil, err
	}
	rv := analysis.DefaultAnalyzer{
		Tokenizer: keywordTokenizer,
	}
	return &rv, nil
}

func init() {
	err := registry.RegisterAnalyzer(Name, AnalyzerConstructor)
	if err != nil {
		panic(err)
	}
}


================================================
FILE: analysis/analyzer/simple/simple.go
================================================
//  Copyright (c) 2014 Couchbase, Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// 		http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package simple

import (
	"github.com/blevesearch/bleve/v2/analysis"
	"github.com/blevesearch/bleve/v2/analysis/token/lowercase"
	"github.com/blevesearch/bleve/v2/analysis/tokenizer/letter"
	"github.com/blevesearch/bleve/v2/registry"
)

const Name = "simple"

func AnalyzerConstructor(config map[string]interface{}, cache *registry.Cache) (analysis.Analyzer, error) {
	tokenizer, err := cache.TokenizerNamed(letter.Name)
	if err != nil {
		return nil, err
	}
	toLowerFilter, err := cache.TokenFilterNamed(lowercase.Name)
	if err != nil {
		return nil, err
	}
	rv := analysis.DefaultAnalyzer{
		Tokenizer: tokenizer,
		TokenFilters: []analysis.TokenFilter{
			toLowerFilter,
		},
	}
	return &rv, nil
}

func init() {
	err := registry.RegisterAnalyzer(Name, AnalyzerConstructor)
	if err != nil {
		panic(err)
	}
}


================================================
FILE: analysis/analyzer/standard/standard.go
================================================
//  Copyright (c) 2014 Couchbase, Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// 		http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package standard

import (
	"github.com/blevesearch/bleve/v2/analysis"
	"github.com/blevesearch/bleve/v2/analysis/lang/en"
	"github.com/blevesearch/bleve/v2/analysis/token/lowercase"
	"github.com/blevesearch/bleve/v2/analysis/tokenizer/unicode"
	"github.com/blevesearch/bleve/v2/registry"
)

const Name = "standard"

func AnalyzerConstructor(config map[string]interface{}, cache *registry.Cache) (analysis.Analyzer, error) {
	tokenizer, err := cache.TokenizerNamed(unicode.Name)
	if err != nil {
		return nil, err
	}
	toLowerFilter, err := cache.TokenFilterNamed(lowercase.Name)
	if err != nil {
		return nil, err
	}
	stopEnFilter, err := cache.TokenFilterNamed(en.StopName)
	if err != nil {
		return nil, err
	}
	rv := analysis.DefaultAnalyzer{
		Tokenizer: tokenizer,
		TokenFilters: []analysis.TokenFilter{
			toLowerFilter,
			stopEnFilter,
		},
	}
	return &rv, nil
}

func init() {
	err := registry.RegisterAnalyzer(Name, AnalyzerConstructor)
	if err != nil {
		panic(err)
	}
}


================================================
FILE: analysis/analyzer/web/web.go
================================================
//  Copyright (c) 2014 Couchbase, Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// 		http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package web

import (
	"github.com/blevesearch/bleve/v2/analysis"
	"github.com/blevesearch/bleve/v2/analysis/lang/en"
	"github.com/blevesearch/bleve/v2/analysis/token/lowercase"
	"github.com/blevesearch/bleve/v2/analysis/tokenizer/web"
	"github.com/blevesearch/bleve/v2/registry"
)

const Name = "web"

func AnalyzerConstructor(config map[string]interface{}, cache *registry.Cache) (analysis.Analyzer, error) {
	tokenizer, err := cache.TokenizerNamed(web.Name)
	if err != nil {
		return nil, err
	}
	toLowerFilter, err := cache.TokenFilterNamed(lowercase.Name)
	if err != nil {
		return nil, err
	}
	stopEnFilter, err := cache.TokenFilterNamed(en.StopName)
	if err != nil {
		return nil, err
	}
	rv := analysis.DefaultAnalyzer{
		Tokenizer: tokenizer,
		TokenFilters: []analysis.TokenFilter{
			toLowerFilter,
			stopEnFilter,
		},
	}
	return &rv, nil
}

func init() {
	err := registry.RegisterAnalyzer(Name, AnalyzerConstructor)
	if err != nil {
		panic(err)
	}
}


================================================
FILE: analysis/benchmark_test.go
================================================
//  Copyright (c) 2015 Couchbase, Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// 		http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package analysis_test

import (
	index "github.com/blevesearch/bleve_index_api"
	"testing"

	"github.com/blevesearch/bleve/v2/analysis"
	"github.com/blevesearch/bleve/v2/analysis/analyzer/standard"
	"github.com/blevesearch/bleve/v2/registry"
)

func BenchmarkAnalysis(b *testing.B) {
	for i := 0; i < b.N; i++ {

		cache := registry.NewCache()
		analyzer, err := cache.AnalyzerNamed(standard.Name)
		if err != nil {
			b.Fatal(err)
		}

		ts := analyzer.Analyze(bleveWikiArticle)
		freqs := analysis.TokenFrequency(ts, nil, index.IncludeTermVectors)
		if len(freqs) != 511 {
			b.Errorf("expected %d freqs, got %d", 511, len(freqs))
		}
	}
}

var bleveWikiArticle = []byte(`Boiling liquid expanding vapor explosion
From Wikipedia, the free encyclopedia
See also: Boiler explosion and Steam explosion

Flames subsequent to a flammable liquid BLEVE from a tanker. BLEVEs do not necessarily involve fire.

This article's tone or style may not reflect the encyclopedic tone used on Wikipedia. See Wikipedia's guide to writing better articles for suggestions. (July 2013)
A boiling liquid expanding vapor explosion (BLEVE, /ˈblɛviː/ blev-ee) is an explosion caused by the rupture of a vessel containing a pressurized liquid above its boiling point.[1]
Contents  [hide]
1 Mechanism
1.1 Water example
1.2 BLEVEs without chemical reactions
2 Fires
3 Incidents
4 Safety measures
5 See also
6 References
7 External links
Mechanism[edit]

This section needs additional citations for verification. Please help improve this article by adding citations to reliable sources. Unsourced material may be challenged and removed. (July 2013)
There are three characteristics of liquids which are relevant to the discussion of a BLEVE:
If a liquid in a sealed container is boiled, the pressure inside the container increases. As the liquid changes to a gas it expands - this expansion in a vented container would cause the gas and liquid to take up more space. In a sealed container the gas and liquid are not able to take up more space and so the pressure rises. Pressurized vessels containing liquids can reach an equilibrium where the liquid stops boiling and the pressure stops rising. This occurs when no more heat is being added to the system (either because it has reached ambient temperature or has had a heat source removed).
The boiling temperature of a liquid is dependent on pressure - high pressures will yield high boiling temperatures, and low pressures will yield low boiling temperatures. A common simple experiment is to place a cup of water in a vacuum chamber, and then reduce the pressure in the chamber until the water boils. By reducing the pressure the water will boil even at room temperature. This works both ways - if the pressure is increased beyond normal atmospheric pressures, the boiling of hot water could be suppressed far beyond normal temperatures. The cooling system of a modern internal combustion engine is a real-world example.
When a liquid boils it turns into a gas. The resulting gas takes up far more space than the liquid did.
Typically, a BLEVE starts with a container of liquid which is held above its normal, atmospheric-pressure boiling temperature. Many substances normally stored as liquids, such as CO2, propane, and other similar industrial gases have boiling temperatures, at atmospheric pressure, far below room temperature. In the case of water, a BLEVE could occur if a pressurized chamber of water is heated far beyond the standard 100 °C (212 °F). That container, because the boiling water pressurizes it, is capable of holding liquid water at very high temperatures.
If the pressurized vessel, containing liquid at high temperature (which may be room temperature, depending on the substance) ruptures, the pressure which prevents the liquid from boiling is lost. If the rupture is catastrophic, where the vessel is immediately incapable of holding any pressure at all, then there suddenly exists a large mass of liquid which is at very high temperature and very low pressure. This causes the entire volume of liquid to instantaneously boil, which in turn causes an extremely rapid expansion. Depending on temperatures, pressures and the substance involved, that expansion may be so rapid that it can be classified as an explosion, fully capable of inflicting severe damage on its surroundings.
Water example[edit]
Imagine, for example, a tank of pressurized liquid water held at 204.4 °C (400 °F). This tank would normally be pressurized to 1.7 MPa (250 psi) above atmospheric ("gauge") pressure. If the tank containing the water were to rupture, there would for a slight moment exist a volume of liquid water which would be
at atmospheric pressure, and
204.4 °C (400 °F).
At atmospheric pressure the boiling point of water is 100 °C (212 °F) - liquid water at atmospheric pressure cannot exist at temperatures higher than 100 °C (212 °F). At that moment, the water would boil and turn to vapour explosively, and the 204.4 °C (400 °F) liquid water turned to gas would take up a lot more volume than it did as liquid, causing a vapour explosion. Such explosions can happen when the superheated water of a steam engine escapes through a crack in a boiler, causing a boiler explosion.
BLEVEs without chemical reactions[edit]
It is important to note that a BLEVE need not be a chemical explosion—nor does there need to be a fire—however if a flammable substance is subject to a BLEVE it may also be subject to intense heating, either from an external source of heat which may have caused the vessel to rupture in the first place or from an internal source of localized heating such as skin friction. This heating can cause a flammable substance to ignite, adding a secondary explosion caused by the primary BLEVE. While blast effects of any BLEVE can be devastating, a flammable substance such as propane can add significantly to the danger.
Bleve explosion.svg
While the term BLEVE is most often used to describe the results of a container of flammable liquid rupturing due to fire, a BLEVE can occur even with a non-flammable substance such as water,[2] liquid nitrogen,[3] liquid helium or other refrigerants or cryogens, and therefore is not usually considered a type of chemical explosion.
Fires[edit]
BLEVEs can be caused by an external fire near the storage vessel causing heating of the contents and pressure build-up. While tanks are often designed to withstand great pressure, constant heating can cause the metal to weaken and eventually fail. If the tank is being heated in an area where there is no liquid, it may rupture faster without the liquid to absorb the heat. Gas containers are usually equipped with relief valves that vent off excess pressure, but the tank can still fail if the pressure is not released quickly enough.[1] Relief valves are sized to release pressure fast enough to prevent the pressure from increasing beyond the strength of the vessel, but not so fast as to be the cause of an explosion. An appropriately sized relief valve will allow the liquid inside to boil slowly, maintaining a constant pressure in the vessel until all the liquid has boiled and the vessel empties.
If the substance involved is flammable, it is likely that the resulting cloud of the substance will ignite after the BLEVE has occurred, forming a fireball and possibly a fuel-air explosion, also termed a vapor cloud explosion (VCE). If the materials are toxic, a large area will be contaminated.[4]
Incidents[edit]
The term "BLEVE" was coined by three researchers at Factory Mutual, in the analysis of an accident there in 1957 involving a chemical reactor vessel.[5]
In August 1959 the Kansas City Fire Department suffered its largest ever loss of life in the line of duty, when a 25,000 gallon (95,000 litre) gas tank exploded during a fire on Southwest Boulevard killing five firefighters. This was the first time BLEVE was used to describe a burning fuel tank.[citation needed]
Later incidents included the Cheapside Street Whisky Bond Fire in Glasgow, Scotland in 1960; Feyzin, France in 1966; Crescent City, Illinois in 1970; Kingman, Arizona in 1973; a liquid nitrogen tank rupture[6] at Air Products and Chemicals and Mobay Chemical Company at New Martinsville, West Virginia on January 31, 1978 [1];Texas City, Texas in 1978; Murdock, Illinois in 1983; San Juan Ixhuatepec, Mexico City in 1984; and Toronto, Ontario in 2008.
Safety measures[edit]
[icon]	This section requires expansion. (July 2013)
Some fire mitigation measures are listed under liquefied petroleum gas.
See also[edit]
Boiler explosion
Expansion ratio
Explosive boiling or phase explosion
Rapid phase transition
Viareggio train derailment
2008 Toronto explosions
Gas carriers
Los Alfaques Disaster
Lac-Mégantic derailment
References[edit]
^ Jump up to: a b Kletz, Trevor (March 1990). Critical Aspects of Safety and Loss Prevention. London: Butterworth–Heinemann. pp. 43–45. ISBN 0-408-04429-2.
Jump up ^ "Temperature Pressure Relief Valves on Water Heaters: test, inspect, replace, repair guide". Inspect-ny.com. Retrieved 2011-07-12.
Jump up ^ Liquid nitrogen BLEVE demo
Jump up ^ "Chemical Process Safety" (PDF). Retrieved 2011-07-12.
Jump up ^ David F. Peterson, BLEVE: Facts, Risk Factors, and Fallacies, Fire Engineering magazine (2002).
Jump up ^ "STATE EX REL. VAPOR CORP. v. NARICK". Supreme Court of Appeals of West Virginia. 1984-07-12. Retrieved 2014-03-16.
External links[edit]
	Look up boiling liquid expanding vapor explosion in Wiktionary, the free dictionary.
	Wikimedia Commons has media related to BLEVE.
BLEVE Demo on YouTube — video of a controlled BLEVE demo
huge explosions on YouTube — video of propane and isobutane BLEVEs from a train derailment at Murdock, Illinois (3 September 1983)
Propane BLEVE on YouTube — video of BLEVE from the Toronto propane depot fire
Moscow Ring Road Accident on YouTube - Dozens of LPG tank BLEVEs after a road accident in Moscow
Kingman, AZ BLEVE — An account of the 5 July 1973 explosion in Kingman, with photographs
Propane Tank Explosions — Description of circumstances required to cause a propane tank BLEVE.
Analysis of BLEVE Events at DOE Sites - Details physics and mathematics of BLEVEs.
HID - SAFETY REPORT ASSESSMENT GUIDE: Whisky Maturation Warehouses - The liquor is aged in wooden barrels that can suffer BLEVE.
Categories: ExplosivesFirefightingFireTypes of fireGas technologiesIndustrial fires and explosions`)


================================================
FILE: analysis/char/asciifolding/asciifolding.go
================================================
//  Copyright (c) 2018 Couchbase, Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// 		http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

// converted to Go from Lucene's AsciiFoldingFilter
// https://lucene.apache.org/core/4_0_0/analyzers-common/org/apache/lucene/analysis/miscellaneous/ASCIIFoldingFilter.html

package asciifolding

import (
	"github.com/blevesearch/bleve/v2/analysis"
	"github.com/blevesearch/bleve/v2/registry"
)

const Name = "asciifolding"

type AsciiFoldingFilter struct{}

func New() *AsciiFoldingFilter {
	return &AsciiFoldingFilter{}
}

func (s *AsciiFoldingFilter) Filter(input []byte) []byte {
	if len(input) == 0 {
		return input
	}

	in := []rune(string(input))
	length := len(in)

	// Worst-case length required if all runes fold to 4 runes
	out := make([]rune, length, length*4)

	out = foldToASCII(in, 0, out, 0, length)
	return []byte(string(out))
}

func AsciiFoldingFilterConstructor(config map[string]interface{}, cache *registry.Cache) (analysis.CharFilter, error) {
	return New(), nil
}

func init() {
	err := registry.RegisterCharFilter(Name, AsciiFoldingFilterConstructor)
	if err != nil {
		panic(err)
	}
}

// Converts characters above ASCII to their ASCII equivalents.
// For example, accents are removed from accented characters.
func foldToASCII(input []rune, inputPos int, output []rune, outputPos int, length int) []rune {
	end := inputPos + length
	for pos := inputPos; pos < end; pos++ {
		c := input[pos]

		// Quick test: if it's not in range then just keep current character
		if c < '\u0080' {
			output[outputPos] = c
			outputPos++
		} else {
			switch c {
			case '\u00C0': // À [LATIN CAPITAL LETTER A WITH GRAVE]
				fallthrough
			case '\u00C1': // Á [LATIN CAPITAL LETTER A WITH ACUTE]
				fallthrough
			case '\u00C2': // Â [LATIN CAPITAL LETTER A WITH CIRCUMFLEX]
				fallthrough
			case '\u00C3': // Ã [LATIN CAPITAL LETTER A WITH TILDE]
				fallthrough
			case '\u00C4': // Ä [LATIN CAPITAL LETTER A WITH DIAERESIS]
				fallthrough
			case '\u00C5': // Å [LATIN CAPITAL LETTER A WITH RING ABOVE]
				fallthrough
			case '\u0100': // Ā [LATIN CAPITAL LETTER A WITH MACRON]
				fallthrough
			case '\u0102': // Ă [LATIN CAPITAL LETTER A WITH BREVE]
				fallthrough
			case '\u0104': // Ą [LATIN CAPITAL LETTER A WITH OGONEK]
				fallthrough
			case '\u018F': // Ə http://en.wikipedia.org/wiki/Schwa [LATIN CAPITAL LETTER SCHWA]
				fallthrough
			case '\u01CD': // Ǎ [LATIN CAPITAL LETTER A WITH CARON]
				fallthrough
			case '\u01DE': // Ǟ [LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON]
				fallthrough
			case '\u01E0': // Ǡ [LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON]
				fallthrough
			case '\u01FA': // Ǻ [LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE]
				fallthrough
			case '\u0200': // Ȁ [LATIN CAPITAL LETTER A WITH DOUBLE GRAVE]
				fallthrough
			case '\u0202': // Ȃ [LATIN CAPITAL LETTER A WITH INVERTED BREVE]
				fallthrough
			case '\u0226': // Ȧ [LATIN CAPITAL LETTER A WITH DOT ABOVE]
				fallthrough
			case '\u023A': // Ⱥ [LATIN CAPITAL LETTER A WITH STROKE]
				fallthrough
			case '\u1D00': // ᴀ [LATIN LETTER SMALL CAPITAL A]
				fallthrough
			case '\u1E00': // Ḁ [LATIN CAPITAL LETTER A WITH RING BELOW]
				fallthrough
			case '\u1EA0': // Ạ [LATIN CAPITAL LETTER A WITH DOT BELOW]
				fallthrough
			case '\u1EA2': // Ả [LATIN CAPITAL LETTER A WITH HOOK ABOVE]
				fallthrough
			case '\u1EA4': // Ấ [LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE]
				fallthrough
			case '\u1EA6': // Ầ [LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE]
				fallthrough
			case '\u1EA8': // Ẩ [LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE]
				fallthrough
			case '\u1EAA': // Ẫ [LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE]
				fallthrough
			case '\u1EAC': // Ậ [LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW]
				fallthrough
			case '\u1EAE': // Ắ [LATIN CAPITAL LETTER A WITH BREVE AND ACUTE]
				fallthrough
			case '\u1EB0': // Ằ [LATIN CAPITAL LETTER A WITH BREVE AND GRAVE]
				fallthrough
			case '\u1EB2': // Ẳ [LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE]
				fallthrough
			case '\u1EB4': // Ẵ [LATIN CAPITAL LETTER A WITH BREVE AND TILDE]
				fallthrough
			case '\u24B6': // Ⓐ [CIRCLED LATIN CAPITAL LETTER A]
				fallthrough
			case '\uFF21': // A [FULLWIDTH LATIN CAPITAL LETTER A]
				fallthrough
			case '\u1EB6': // Ặ [LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW]
				output[outputPos] = 'A'
				outputPos++

			case '\u00E0': // à [LATIN SMALL LETTER A WITH GRAVE]
				fallthrough
			case '\u00E1': // á [LATIN SMALL LETTER A WITH ACUTE]
				fallthrough
			case '\u00E2': // â [LATIN SMALL LETTER A WITH CIRCUMFLEX]
				fallthrough
			case '\u00E3': // ã [LATIN SMALL LETTER A WITH TILDE]
				fallthrough
			case '\u00E4': // ä [LATIN SMALL LETTER A WITH DIAERESIS]
				fallthrough
			case '\u00E5': // å [LATIN SMALL LETTER A WITH RING ABOVE]
				fallthrough
			case '\u0101': // ā [LATIN SMALL LETTER A WITH MACRON]
				fallthrough
			case '\u0103': // ă [LATIN SMALL LETTER A WITH BREVE]
				fallthrough
			case '\u0105': // ą [LATIN SMALL LETTER A WITH OGONEK]
				fallthrough
			case '\u01CE': // ǎ [LATIN SMALL LETTER A WITH CARON]
				fallthrough
			case '\u01DF': // ǟ [LATIN SMALL LETTER A WITH DIAERESIS AND MACRON]
				fallthrough
			case '\u01E1': // ǡ [LATIN SMALL LETTER A WITH DOT ABOVE AND MACRON]
				fallthrough
			case '\u01FB': // ǻ [LATIN SMALL LETTER A WITH RING ABOVE AND ACUTE]
				fallthrough
			case '\u0201': // ȁ [LATIN SMALL LETTER A WITH DOUBLE GRAVE]
				fallthrough
			case '\u0203': // ȃ [LATIN SMALL LETTER A WITH INVERTED BREVE]
				fallthrough
			case '\u0227': // ȧ [LATIN SMALL LETTER A WITH DOT ABOVE]
				fallthrough
			case '\u0250': // ɐ [LATIN SMALL LETTER TURNED A]
				fallthrough
			case '\u0259': // ə [LATIN SMALL LETTER SCHWA]
				fallthrough
			case '\u025A': // ɚ [LATIN SMALL LETTER SCHWA WITH HOOK]
				fallthrough
			case '\u1D8F': // ᶏ [LATIN SMALL LETTER A WITH RETROFLEX HOOK]
				fallthrough
			case '\u1D95': // ᶕ [LATIN SMALL LETTER SCHWA WITH RETROFLEX HOOK]
				fallthrough
			case '\u1E01': // ạ [LATIN SMALL LETTER A WITH RING BELOW]
				fallthrough
			case '\u1E9A': // ả [LATIN SMALL LETTER A WITH RIGHT HALF RING]
				fallthrough
			case '\u1EA1': // ạ [LATIN SMALL LETTER A WITH DOT BELOW]
				fallthrough
			case '\u1EA3': // ả [LATIN SMALL LETTER A WITH HOOK ABOVE]
				fallthrough
			case '\u1EA5': // ấ [LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE]
				fallthrough
			case '\u1EA7': // ầ [LATIN SMALL LETTER A WITH CIRCUMFLEX AND GRAVE]
				fallthrough
			case '\u1EA9': // ẩ [LATIN SMALL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE]
				fallthrough
			case '\u1EAB': // ẫ [LATIN SMALL LETTER A WITH CIRCUMFLEX AND TILDE]
				fallthrough
			case '\u1EAD': // ậ [LATIN SMALL LETTER A WITH CIRCUMFLEX AND DOT BELOW]
				fallthrough
			case '\u1EAF': // ắ [LATIN SMALL LETTER A WITH BREVE AND ACUTE]
				fallthrough
			case '\u1EB1': // ằ [LATIN SMALL LETTER A WITH BREVE AND GRAVE]
				fallthrough
			case '\u1EB3': // ẳ [LATIN SMALL LETTER A WITH BREVE AND HOOK ABOVE]
				fallthrough
			case '\u1EB5': // ẵ [LATIN SMALL LETTER A WITH BREVE AND TILDE]
				fallthrough
			case '\u1EB7': // ặ [LATIN SMALL LETTER A WITH BREVE AND DOT BELOW]
				fallthrough
			case '\u2090': // ₐ [LATIN SUBSCRIPT SMALL LETTER A]
				fallthrough
			case '\u2094': // ₔ [LATIN SUBSCRIPT SMALL LETTER SCHWA]
				fallthrough
			case '\u24D0': // ⓐ [CIRCLED LATIN SMALL LETTER A]
				fallthrough
			case '\u2C65': // ⱥ [LATIN SMALL LETTER A WITH STROKE]
				fallthrough
			case '\u2C6F': // Ɐ [LATIN CAPITAL LETTER TURNED A]
				fallthrough
			case '\uFF41': // a [FULLWIDTH LATIN SMALL LETTER A]
				output[outputPos] = 'a'
				outputPos++

			case '\uA732': // Ꜳ [LATIN CAPITAL LETTER AA]
				output = output[:(len(output) + 1)]
				output[outputPos] = 'A'
				outputPos++
				output[outputPos] = 'A'
				outputPos++

			case '\u00C6': // Æ [LATIN CAPITAL LETTER AE]
				fallthrough
			case '\u01E2': // Ǣ [LATIN CAPITAL LETTER AE WITH MACRON]
				fallthrough
			case '\u01FC': // Ǽ [LATIN CAPITAL LETTER AE WITH ACUTE]
				fallthrough
			case '\u1D01': // ᴁ [LATIN LETTER SMALL CAPITAL AE]
				output = output[:(len(output) + 1)]
				output[outputPos] = 'A'
				outputPos++
				output[outputPos] = 'E'
				outputPos++

			case '\uA734': // Ꜵ [LATIN CAPITAL LETTER AO]
				output = output[:(len(output) + 1)]
				output[outputPos] = 'A'
				outputPos++
				output[outputPos] = 'O'
				outputPos++

			case '\uA736': // Ꜷ [LATIN CAPITAL LETTER AU]
				output = output[:(len(output) + 1)]
				output[outputPos] = 'A'
				outputPos++
				output[outputPos] = 'U'
				outputPos++

			case '\uA738': // Ꜹ [LATIN CAPITAL LETTER AV]
				fallthrough
			case '\uA73A': // Ꜻ [LATIN CAPITAL LETTER AV WITH HORIZONTAL BAR]
				output = output[:(len(output) + 1)]
				output[outputPos] = 'A'
				outputPos++
				output[outputPos] = 'V'
				outputPos++

			case '\uA73C': // Ꜽ [LATIN CAPITAL LETTER AY]
				output = output[:(len(output) + 1)]
				output[outputPos] = 'A'
				outputPos++
				output[outputPos] = 'Y'
				outputPos++

			case '\u249C': // ⒜ [PARENTHESIZED LATIN SMALL LETTER A]
				output = output[:(len(output) + 2)]
				output[outputPos] = '('
				outputPos++
				output[outputPos] = 'a'
				outputPos++
				output[outputPos] = ')'
				outputPos++

			case '\uA733': // ꜳ [LATIN SMALL LETTER AA]
				output = output[:(len(output) + 1)]
				output[outputPos] = 'a'
				outputPos++
				output[outputPos] = 'a'
				outputPos++

			case '\u00E6': // æ [LATIN SMALL LETTER AE]
				fallthrough
			case '\u01E3': // ǣ [LATIN SMALL LETTER AE WITH MACRON]
				fallthrough
			case '\u01FD': // ǽ [LATIN SMALL LETTER AE WITH ACUTE]
				fallthrough
			case '\u1D02': // ᴂ [LATIN SMALL LETTER TURNED AE]
				output = output[:(len(output) + 1)]
				output[outputPos] = 'a'
				outputPos++
				output[outputPos] = 'e'
				outputPos++

			case '\uA735': // ꜵ [LATIN SMALL LETTER AO]
				output = output[:(len(output) + 1)]
				output[outputPos] = 'a'
				outputPos++
				output[outputPos] = 'o'
				outputPos++

			case '\uA737': // ꜷ [LATIN SMALL LETTER AU]
				output = output[:(len(output) + 1)]
				output[outputPos] = 'a'
				outputPos++
				output[outputPos] = 'u'
				outputPos++

			case '\uA739': // ꜹ [LATIN SMALL LETTER AV]
				fallthrough
			case '\uA73B': // ꜻ [LATIN SMALL LETTER AV WITH HORIZONTAL BAR]
				output = output[:(len(output) + 1)]
				output[outputPos] = 'a'
				outputPos++
				output[outputPos] = 'v'
				outputPos++

			case '\uA73D': // ꜽ [LATIN SMALL LETTER AY]
				output = output[:(len(output) + 1)]
				output[outputPos] = 'a'
				outputPos++
				output[outputPos] = 'y'
				outputPos++

			case '\u0181': // Ɓ [LATIN CAPITAL LETTER B WITH HOOK]
				fallthrough
			case '\u0182': // Ƃ [LATIN CAPITAL LETTER B WITH TOPBAR]
				fallthrough
			case '\u0243': // Ƀ [LATIN CAPITAL LETTER B WITH STROKE]
				fallthrough
			case '\u0299': // ʙ [LATIN LETTER SMALL CAPITAL B]
				fallthrough
			case '\u1D03': // ᴃ [LATIN LETTER SMALL CAPITAL BARRED B]
				fallthrough
			case '\u1E02': // Ḃ [LATIN CAPITAL LETTER B WITH DOT ABOVE]
				fallthrough
			case '\u1E04': // Ḅ [LATIN CAPITAL LETTER B WITH DOT BELOW]
				fallthrough
			case '\u1E06': // Ḇ [LATIN CAPITAL LETTER B WITH LINE BELOW]
				fallthrough
			case '\u24B7': // Ⓑ [CIRCLED LATIN CAPITAL LETTER B]
				fallthrough
			case '\uFF22': // B [FULLWIDTH LATIN CAPITAL LETTER B]
				output[outputPos] = 'B'
				outputPos++

			case '\u0180': // ƀ [LATIN SMALL LETTER B WITH STROKE]
				fallthrough
			case '\u0183': // ƃ [LATIN SMALL LETTER B WITH TOPBAR]
				fallthrough
			case '\u0253': // ɓ [LATIN SMALL LETTER B WITH HOOK]
				fallthrough
			case '\u1D6C': // ᵬ [LATIN SMALL LETTER B WITH MIDDLE TILDE]
				fallthrough
			case '\u1D80': // ᶀ [LATIN SMALL LETTER B WITH PALATAL HOOK]
				fallthrough
			case '\u1E03': // ḃ [LATIN SMALL LETTER B WITH DOT ABOVE]
				fallthrough
			case '\u1E05': // ḅ [LATIN SMALL LETTER B WITH DOT BELOW]
				fallthrough
			case '\u1E07': // ḇ [LATIN SMALL LETTER B WITH LINE BELOW]
				fallthrough
			case '\u24D1': // ⓑ [CIRCLED LATIN SMALL LETTER B]
				fallthrough
			case '\uFF42': // b [FULLWIDTH LATIN SMALL LETTER B]
				output[outputPos] = 'b'
				outputPos++

			case '\u249D': // ⒝ [PARENTHESIZED LATIN SMALL LETTER B]
				output = output[:(len(output) + 2)]
				output[outputPos] = '('
				outputPos++
				output[outputPos] = 'b'
				outputPos++
				output[outputPos] = ')'
				outputPos++

			case '\u00C7': // Ç [LATIN CAPITAL LETTER C WITH CEDILLA]
				fallthrough
			case '\u0106': // Ć [LATIN CAPITAL LETTER C WITH ACUTE]
				fallthrough
			case '\u0108': // Ĉ [LATIN CAPITAL LETTER C WITH CIRCUMFLEX]
				fallthrough
			case '\u010A': // Ċ [LATIN CAPITAL LETTER C WITH DOT ABOVE]
				fallthrough
			case '\u010C': // Č [LATIN CAPITAL LETTER C WITH CARON]
				fallthrough
			case '\u0187': // Ƈ [LATIN CAPITAL LETTER C WITH HOOK]
				fallthrough
			case '\u023B': // Ȼ [LATIN CAPITAL LETTER C WITH STROKE]
				fallthrough
			case '\u0297': // ʗ [LATIN LETTER STRETCHED C]
				fallthrough
			case '\u1D04': // ᴄ [LATIN LETTER SMALL CAPITAL C]
				fallthrough
			case '\u1E08': // Ḉ [LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE]
				fallthrough
			case '\u24B8': // Ⓒ [CIRCLED LATIN CAPITAL LETTER C]
				fallthrough
			case '\uFF23': // C [FULLWIDTH LATIN CAPITAL LETTER C]
				output[outputPos] = 'C'
				outputPos++

			case '\u00E7': // ç [LATIN SMALL LETTER C WITH CEDILLA]
				fallthrough
			case '\u0107': // ć [LATIN SMALL LETTER C WITH ACUTE]
				fallthrough
			case '\u0109': // ĉ [LATIN SMALL LETTER C WITH CIRCUMFLEX]
				fallthrough
			case '\u010B': // ċ [LATIN SMALL LETTER C WITH DOT ABOVE]
				fallthrough
			case '\u010D': // č [LATIN SMALL LETTER C WITH CARON]
				fallthrough
			case '\u0188': // ƈ [LATIN SMALL LETTER C WITH HOOK]
				fallthrough
			case '\u023C': // ȼ [LATIN SMALL LETTER C WITH STROKE]
				fallthrough
			case '\u0255': // ɕ [LATIN SMALL LETTER C WITH CURL]
				fallthrough
			case '\u1E09': // ḉ [LATIN SMALL LETTER C WITH CEDILLA AND ACUTE]
				fallthrough
			case '\u2184': // ↄ [LATIN SMALL LETTER REVERSED C]
				fallthrough
			case '\u24D2': // ⓒ [CIRCLED LATIN SMALL LETTER C]
				fallthrough
			case '\uA73E': // Ꜿ [LATIN CAPITAL LETTER REVERSED C WITH DOT]
				fallthrough
			case '\uA73F': // ꜿ [LATIN SMALL LETTER REVERSED C WITH DOT]
				fallthrough
			case '\uFF43': // c [FULLWIDTH LATIN SMALL LETTER C]
				output[outputPos] = 'c'
				outputPos++

			case '\u249E': // ⒞ [PARENTHESIZED LATIN SMALL LETTER C]
				output = output[:(len(output) + 2)]
				output[outputPos] = '('
				outputPos++
				output[outputPos] = 'c'
				outputPos++
				output[outputPos] = ')'
				outputPos++

			case '\u00D0': // Ð [LATIN CAPITAL LETTER ETH]
				fallthrough
			case '\u010E': // Ď [LATIN CAPITAL LETTER D WITH CARON]
				fallthrough
			case '\u0110': // Đ [LATIN CAPITAL LETTER D WITH STROKE]
				fallthrough
			case '\u0189': // Ɖ [LATIN CAPITAL LETTER AFRICAN D]
				fallthrough
			case '\u018A': // Ɗ [LATIN CAPITAL LETTER D WITH HOOK]
				fallthrough
			case '\u018B': // Ƌ [LATIN CAPITAL LETTER D WITH TOPBAR]
				fallthrough
			case '\u1D05': // ᴅ [LATIN LETTER SMALL CAPITAL D]
				fallthrough
			case '\u1D06': // ᴆ [LATIN LETTER SMALL CAPITAL ETH]
				fallthrough
			case '\u1E0A': // Ḋ [LATIN CAPITAL LETTER D WITH DOT ABOVE]
				fallthrough
			case '\u1E0C': // Ḍ [LATIN CAPITAL LETTER D WITH DOT BELOW]
				fallthrough
			case '\u1E0E': // Ḏ [LATIN CAPITAL LETTER D WITH LINE BELOW]
				fallthrough
			case '\u1E10': // Ḑ [LATIN CAPITAL LETTER D WITH CEDILLA]
				fallthrough
			case '\u1E12': // Ḓ [LATIN CAPITAL LETTER D WITH CIRCUMFLEX BELOW]
				fallthrough
			case '\u24B9': // Ⓓ [CIRCLED LATIN CAPITAL LETTER D]
				fallthrough
			case '\uA779': // Ꝺ [LATIN CAPITAL LETTER INSULAR D]
				fallthrough
			case '\uFF24': // D [FULLWIDTH LATIN CAPITAL LETTER D]
				output[outputPos] = 'D'
				outputPos++

			case '\u00F0': // ð [LATIN SMALL LETTER ETH]
				fallthrough
			case '\u010F': // ď [LATIN SMALL LETTER D WITH CARON]
				fallthrough
			case '\u0111': // đ [LATIN SMALL LETTER D WITH STROKE]
				fallthrough
			case '\u018C': // ƌ [LATIN SMALL LETTER D WITH TOPBAR]
				fallthrough
			case '\u0221': // ȡ [LATIN SMALL LETTER D WITH CURL]
				fallthrough
			case '\u0256': // ɖ [LATIN SMALL LETTER D WITH TAIL]
				fallthrough
			case '\u0257': // ɗ [LATIN SMALL LETTER D WITH HOOK]
				fallthrough
			case '\u1D6D': // ᵭ [LATIN SMALL LETTER D WITH MIDDLE TILDE]
				fallthrough
			case '\u1D81': // ᶁ [LATIN SMALL LETTER D WITH PALATAL HOOK]
				fallthrough
			case '\u1D91': // ᶑ [LATIN SMALL LETTER D WITH HOOK AND TAIL]
				fallthrough
			case '\u1E0B': // ḋ [LATIN SMALL LETTER D WITH DOT ABOVE]
				fallthrough
			case '\u1E0D': // ḍ [LATIN SMALL LETTER D WITH DOT BELOW]
				fallthrough
			case '\u1E0F': // ḏ [LATIN SMALL LETTER D WITH LINE BELOW]
				fallthrough
			case '\u1E11': // ḑ [LATIN SMALL LETTER D WITH CEDILLA]
				fallthrough
			case '\u1E13': // ḓ [LATIN SMALL LETTER D WITH CIRCUMFLEX BELOW]
				fallthrough
			case '\u24D3': // ⓓ [CIRCLED LATIN SMALL LETTER D]
				fallthrough
			case '\uA77A': // ꝺ [LATIN SMALL LETTER INSULAR D]
				fallthrough
			case '\uFF44': // d [FULLWIDTH LATIN SMALL LETTER D]
				output[outputPos] = 'd'
				outputPos++

			case '\u01C4': // DŽ [LATIN CAPITAL LETTER DZ WITH CARON]
				fallthrough
			case '\u01F1': // DZ [LATIN CAPITAL LETTER DZ]
				output = output[:(len(output) + 1)]
				output[outputPos] = 'D'
				outputPos++
				output[outputPos] = 'Z'
				outputPos++

			case '\u01C5': // Dž [LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON]
				fallthrough
			case '\u01F2': // Dz [LATIN CAPITAL LETTER D WITH SMALL LETTER Z]
				output = output[:(len(output) + 1)]
				output[outputPos] = 'D'
				outputPos++
				output[outputPos] = 'z'
				outputPos++

			case '\u249F': // ⒟ [PARENTHESIZED LATIN SMALL LETTER D]
				output = output[:(len(output) + 2)]
				output[outputPos] = '('
				outputPos++
				output[outputPos] = 'd'
				outputPos++
				output[outputPos] = ')'
				outputPos++

			case '\u0238': // ȸ [LATIN SMALL LETTER DB DIGRAPH]
				output = output[:(len(output) + 1)]
				output[outputPos] = 'd'
				outputPos++
				output[outputPos] = 'b'
				outputPos++

			case '\u01C6': // dž [LATIN SMALL LETTER DZ WITH CARON]
				fallthrough
			case '\u01F3': // dz [LATIN SMALL LETTER DZ]
				fallthrough
			case '\u02A3': // ʣ [LATIN SMALL LETTER DZ DIGRAPH]
				fallthrough
			case '\u02A5': // ʥ [LATIN SMALL LETTER DZ DIGRAPH WITH CURL]
				output = output[:(len(output) + 1)]
				output[outputPos] = 'd'
				outputPos++
				output[outputPos] = 'z'
				outputPos++

			case '\u00C8': // È [LATIN CAPITAL LETTER E WITH GRAVE]
				fallthrough
			case '\u00C9': // É [LATIN CAPITAL LETTER E WITH ACUTE]
				fallthrough
			case '\u00CA': // Ê [LATIN CAPITAL LETTER E WITH CIRCUMFLEX]
				fallthrough
			case '\u00CB': // Ë [LATIN CAPITAL LETTER E WITH DIAERESIS]
				fallthrough
			case '\u0112': // Ē [LATIN CAPITAL LETTER E WITH MACRON]
				fallthrough
			case '\u0114': // Ĕ [LATIN CAPITAL LETTER E WITH BREVE]
				fallthrough
			case '\u0116': // Ė [LATIN CAPITAL LETTER E WITH DOT ABOVE]
				fallthrough
			case '\u0118': // Ę [LATIN CAPITAL LETTER E WITH OGONEK]
				fallthrough
			case '\u011A': // Ě [LATIN CAPITAL LETTER E WITH CARON]
				fallthrough
			case '\u018E': // Ǝ [LATIN CAPITAL LETTER REVERSED E]
				fallthrough
			case '\u0190': // Ɛ [LATIN CAPITAL LETTER OPEN E]
				fallthrough
			case '\u0204': // Ȅ [LATIN CAPITAL LETTER E WITH DOUBLE GRAVE]
				fallthrough
			case '\u0206': // Ȇ [LATIN CAPITAL LETTER E WITH INVERTED BREVE]
				fallthrough
			case '\u0228': // Ȩ [LATIN CAPITAL LETTER E WITH CEDILLA]
				fallthrough
			case '\u0246': // Ɇ [LATIN CAPITAL LETTER E WITH STROKE]
				fallthrough
			case '\u1D07': // ᴇ [LATIN LETTER SMALL CAPITAL E]
				fallthrough
			case '\u1E14': // Ḕ [LATIN CAPITAL LETTER E WITH MACRON AND GRAVE]
				fallthrough
			case '\u1E16': // Ḗ [LATIN CAPITAL LETTER E WITH MACRON AND ACUTE]
				fallthrough
			case '\u1E18': // Ḙ [LATIN CAPITAL LETTER E WITH CIRCUMFLEX BELOW]
				fallthrough
			case '\u1E1A': // Ḛ [LATIN CAPITAL LETTER E WITH TILDE BELOW]
				fallthrough
			case '\u1E1C': // Ḝ [LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE]
				fallthrough
			case '\u1EB8': // Ẹ [LATIN CAPITAL LETTER E WITH DOT BELOW]
				fallthrough
			case '\u1EBA': // Ẻ [LATIN CAPITAL LETTER E WITH HOOK ABOVE]
				fallthrough
			case '\u1EBC': // Ẽ [LATIN CAPITAL LETTER E WITH TILDE]
				fallthrough
			case '\u1EBE': // Ế [LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE]
				fallthrough
			case '\u1EC0': // Ề [LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE]
				fallthrough
			case '\u1EC2': // Ể [LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE]
				fallthrough
			case '\u1EC4': // Ễ [LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE]
				fallthrough
			case '\u1EC6': // Ệ [LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW]
				fallthrough
			case '\u24BA': // Ⓔ [CIRCLED LATIN CAPITAL LETTER E]
				fallthrough
			case '\u2C7B': // ⱻ [LATIN LETTER SMALL CAPITAL TURNED E]
				fallthrough
			case '\uFF25': // E [FULLWIDTH LATIN CAPITAL LETTER E]
				output[outputPos] = 'E'
				outputPos++

			case '\u00E8': // è [LATIN SMALL LETTER E WITH GRAVE]
				fallthrough
			case '\u00E9': // é [LATIN SMALL LETTER E WITH ACUTE]
				fallthrough
			case '\u00EA': // ê [LATIN SMALL LETTER E WITH CIRCUMFLEX]
				fallthrough
			case '\u00EB': // ë [LATIN SMALL LETTER E WITH DIAERESIS]
				fallthrough
			case '\u0113': // ē [LATIN SMALL LETTER E WITH MACRON]
				fallthrough
			case '\u0115': // ĕ [LATIN SMALL LETTER E WITH BREVE]
				fallthrough
			case '\u0117': // ė [LATIN SMALL LETTER E WITH DOT ABOVE]
				fallthrough
			case '\u0119': // ę [LATIN SMALL LETTER E WITH OGONEK]
				fallthrough
			case '\u011B': // ě [LATIN SMALL LETTER E WITH CARON]
				fallthrough
			case '\u01DD': // ǝ [LATIN SMALL LETTER TURNED E]
				fallthrough
			case '\u0205': // ȅ [LATIN SMALL LETTER E WITH DOUBLE GRAVE]
				fallthrough
			case '\u0207': // ȇ [LATIN SMALL LETTER E WITH INVERTED BREVE]
				fallthrough
			case '\u0229': // ȩ [LATIN SMALL LETTER E WITH CEDILLA]
				fallthrough
			case '\u0247': // ɇ [LATIN SMALL LETTER E WITH STROKE]
				fallthrough
			case '\u0258': // ɘ [LATIN SMALL LETTER REVERSED E]
				fallthrough
			case '\u025B': // ɛ [LATIN SMALL LETTER OPEN E]
				fallthrough
			case '\u025C': // ɜ [LATIN SMALL LETTER REVERSED OPEN E]
				fallthrough
			case '\u025D': // ɝ [LATIN SMALL LETTER REVERSED OPEN E WITH HOOK]
				fallthrough
			case '\u025E': // ɞ [LATIN SMALL LETTER CLOSED REVERSED OPEN E]
				fallthrough
			case '\u029A': // ʚ [LATIN SMALL LETTER CLOSED OPEN E]
				fallthrough
			case '\u1D08': // ᴈ [LATIN SMALL LETTER TURNED OPEN E]
				fallthrough
			case '\u1D92': // ᶒ [LATIN SMALL LETTER E WITH RETROFLEX HOOK]
				fallthrough
			case '\u1D93': // ᶓ [LATIN SMALL LETTER OPEN E WITH RETROFLEX HOOK]
				fallthrough
			case '\u1D94': // ᶔ [LATIN SMALL LETTER REVERSED OPEN E WITH RETROFLEX HOOK]
				fallthrough
			case '\u1E15': // ḕ [LATIN SMALL LETTER E WITH MACRON AND GRAVE]
				fallthrough
			case '\u1E17': // ḗ [LATIN SMALL LETTER E WITH MACRON AND ACUTE]
				fallthrough
			case '\u1E19': // ḙ [LATIN SMALL LETTER E WITH CIRCUMFLEX BELOW]
				fallthrough
			case '\u1E1B': // ḛ [LATIN SMALL LETTER E WITH TILDE BELOW]
				fallthrough
			case '\u1E1D': // ḝ [LATIN SMALL LETTER E WITH CEDILLA AND BREVE]
				fallthrough
			case '\u1EB9': // ẹ [LATIN SMALL LETTER E WITH DOT BELOW]
				fallthrough
			case '\u1EBB': // ẻ [LATIN SMALL LETTER E WITH HOOK ABOVE]
				fallthrough
			case '\u1EBD': // ẽ [LATIN SMALL LETTER E WITH TILDE]
				fallthrough
			case '\u1EBF': // ế [LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE]
				fallthrough
			case '\u1EC1': // ề [LATIN SMALL LETTER E WITH CIRCUMFLEX AND GRAVE]
				fallthrough
			case '\u1EC3': // ể [LATIN SMALL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE]
				fallthrough
			case '\u1EC5': // ễ [LATIN SMALL LETTER E WITH CIRCUMFLEX AND TILDE]
				fallthrough
			case '\u1EC7': // ệ [LATIN SMALL LETTER E WITH CIRCUMFLEX AND DOT BELOW]
				fallthrough
			case '\u2091': // ₑ [LATIN SUBSCRIPT SMALL LETTER E]
				fallthrough
			case '\u24D4': // ⓔ [CIRCLED LATIN SMALL LETTER E]
				fallthrough
			case '\u2C78': // ⱸ [LATIN SMALL LETTER E WITH NOTCH]
				fallthrough
			case '\uFF45': // e [FULLWIDTH LATIN SMALL LETTER E]
				output[outputPos] = 'e'
				outputPos++

			case '\u24A0': // ⒠ [PARENTHESIZED LATIN SMALL LETTER E]
				output = output[:(len(output) + 2)]
				output[outputPos] = '('
				outputPos++
				output[outputPos] = 'e'
				outputPos++
				output[outputPos] = ')'
				outputPos++

			case '\u0191': // Ƒ [LATIN CAPITAL LETTER F WITH HOOK]
				fallthrough
			case '\u1E1E': // Ḟ [LATIN CAPITAL LETTER F WITH DOT ABOVE]
				fallthrough
			case '\u24BB': // Ⓕ [CIRCLED LATIN CAPITAL LETTER F]
				fallthrough
			case '\uA730': // ꜰ [LATIN LETTER SMALL CAPITAL F]
				fallthrough
			case '\uA77B': // Ꝼ [LATIN CAPITAL LETTER INSULAR F]
				fallthrough
			case '\uA7FB': // ꟻ [LATIN EPIGRAPHIC LETTER REVERSED F]
				fallthrough
			case '\uFF26': // F [FULLWIDTH LATIN CAPITAL LETTER F]
				output[outputPos] = 'F'
				outputPos++

			case '\u0192': // ƒ [LATIN SMALL LETTER F WITH HOOK]
				fallthrough
			case '\u1D6E': // ᵮ [LATIN SMALL LETTER F WITH MIDDLE TILDE]
				fallthrough
			case '\u1D82': // ᶂ [LATIN SMALL LETTER F WITH PALATAL HOOK]
				fallthrough
			case '\u1E1F': // ḟ [LATIN SMALL LETTER F WITH DOT ABOVE]
				fallthrough
			case '\u1E9B': // ẛ [LATIN SMALL LETTER LONG S WITH DOT ABOVE]
				fallthrough
			case '\u24D5': // ⓕ [CIRCLED LATIN SMALL LETTER F]
				fallthrough
			case '\uA77C': // ꝼ [LATIN SMALL LETTER INSULAR F]
				fallthrough
			case '\uFF46': // f [FULLWIDTH LATIN SMALL LETTER F]
				output[outputPos] = 'f'
				outputPos++

			case '\u24A1': // ⒡ [PARENTHESIZED LATIN SMALL LETTER F]
				output = output[:(len(output) + 2)]
				output[outputPos] = '('
				outputPos++
				output[outputPos] = 'f'
				outputPos++
				output[outputPos] = ')'
				outputPos++

			case '\uFB00': // ff [LATIN SMALL LIGATURE FF]
				output = output[:(len(output) + 1)]
				output[outputPos] = 'f'
				outputPos++
				output[outputPos] = 'f'
				outputPos++

			case '\uFB03': // ffi [LATIN SMALL LIGATURE FFI]
				output = output[:(len(output) + 2)]
				output[outputPos] = 'f'
				outputPos++
				output[outputPos] = 'f'
				outputPos++
				output[outputPos] = 'i'
				outputPos++

			case '\uFB04': // ffl [LATIN SMALL LIGATURE FFL]
				output = output[:(len(output) + 2)]
				output[outputPos] = 'f'
				outputPos++
				output[outputPos] = 'f'
				outputPos++
				output[outputPos] = 'l'
				outputPos++

			case '\uFB01': // fi [LATIN SMALL LIGATURE FI]
				output = output[:(len(output) + 1)]
				output[outputPos] = 'f'
				outputPos++
				output[outputPos] = 'i'
				outputPos++

			case '\uFB02': // fl [LATIN SMALL LIGATURE FL]
				output = output[:(len(output) + 1)]
				output[outputPos] = 'f'
				outputPos++
				output[outputPos] = 'l'
				outputPos++

			case '\u011C': // Ĝ [LATIN CAPITAL LETTER G WITH CIRCUMFLEX]
				fallthrough
			case '\u011E': // Ğ [LATIN CAPITAL LETTER G WITH BREVE]
				fallthrough
			case '\u0120': // Ġ [LATIN CAPITAL LETTER G WITH DOT ABOVE]
				fallthrough
			case '\u0122': // Ģ [LATIN CAPITAL LETTER G WITH CEDILLA]
				fallthrough
			case '\u0193': // Ɠ [LATIN CAPITAL LETTER G WITH HOOK]
				fallthrough
			case '\u01E4': // Ǥ [LATIN CAPITAL LETTER G WITH STROKE]
				fallthrough
			case '\u01E5': // ǥ [LATIN SMALL LETTER G WITH STROKE]
				fallthrough
			case '\u01E6': // Ǧ [LATIN CAPITAL LETTER G WITH CARON]
				fallthrough
			case '\u01E7': // ǧ [LATIN SMALL LETTER G WITH CARON]
				fallthrough
			case '\u01F4': // Ǵ [LATIN CAPITAL LETTER G WITH ACUTE]
				fallthrough
			case '\u0262': // ɢ [LATIN LETTER SMALL CAPITAL G]
				fallthrough
			case '\u029B': // ʛ [LATIN LETTER SMALL CAPITAL G WITH HOOK]
				fallthrough
			case '\u1E20': // Ḡ [LATIN CAPITAL LETTER G WITH MACRON]
				fallthrough
			case '\u24BC': // Ⓖ [CIRCLED LATIN CAPITAL LETTER G]
				fallthrough
			case '\uA77D': // Ᵹ [LATIN CAPITAL LETTER INSULAR G]
				fallthrough
			case '\uA77E': // Ꝿ [LATIN CAPITAL LETTER TURNED INSULAR G]
				fallthrough
			case '\uFF27': // G [FULLWIDTH LATIN CAPITAL LETTER G]
				output[outputPos] = 'G'
				outputPos++

			case '\u011D': // ĝ [LATIN SMALL LETTER G WITH CIRCUMFLEX]
				fallthrough
			case '\u011F': // ğ [LATIN SMALL LETTER G WITH BREVE]
				fallthrough
			case '\u0121': // ġ [LATIN SMALL LETTER G WITH DOT ABOVE]
				fallthrough
			case '\u0123': // ģ [LATIN SMALL LETTER G WITH CEDILLA]
				fallthrough
			case '\u01F5': // ǵ [LATIN SMALL LETTER G WITH ACUTE]
				fallthrough
			case '\u0260': // ɠ [LATIN SMALL LETTER G WITH HOOK]
				fallthrough
			case '\u0261': // ɡ [LATIN SMALL LETTER SCRIPT G]
				fallthrough
			case '\u1D77': // ᵷ [LATIN SMALL LETTER TURNED G]
				fallthrough
			case '\u1D79': // ᵹ [LATIN SMALL LETTER INSULAR G]
				fallthrough
			case '\u1D83': // ᶃ [LATIN SMALL LETTER G WITH PALATAL HOOK]
				fallthrough
			case '\u1E21': // ḡ [LATIN SMALL LETTER G WITH MACRON]
				fallthrough
			case '\u24D6': // ⓖ [CIRCLED LATIN SMALL LETTER G]
				fallthrough
			case '\uA77F': // ꝿ [LATIN SMALL LETTER TURNED INSULAR G]
				fallthrough
			case '\uFF47': // g [FULLWIDTH LATIN SMALL LETTER G]
				output[outputPos] = 'g'
				outputPos++

			case '\u24A2': // ⒢ [PARENTHESIZED LATIN SMALL LETTER G]
				output = output[:(len(output) + 2)]
				output[outputPos] = '('
				outputPos++
				output[outputPos] = 'g'
				outputPos++
				output[outputPos] = ')'
				outputPos++

			case '\u0124': // Ĥ [LATIN CAPITAL LETTER H WITH CIRCUMFLEX]
				fallthrough
			case '\u0126': // Ħ [LATIN CAPITAL LETTER H WITH STROKE]
				fallthrough
			case '\u021E': // Ȟ [LATIN CAPITAL LETTER H WITH CARON]
				fallthrough
			case '\u029C': // ʜ [LATIN LETTER SMALL CAPITAL H]
				fallthrough
			case '\u1E22': // Ḣ [LATIN CAPITAL LETTER H WITH DOT ABOVE]
				fallthrough
			case '\u1E24': // Ḥ [LATIN CAPITAL LETTER H WITH DOT BELOW]
				fallthrough
			case '\u1E26': // Ḧ [LATIN CAPITAL LETTER H WITH DIAERESIS]
				fallthrough
			case '\u1E28': // Ḩ [LATIN CAPITAL LETTER H WITH CEDILLA]
				fallthrough
			case '\u1E2A': // Ḫ [LATIN CAPITAL LETTER H WITH BREVE BELOW]
				fallthrough
			case '\u24BD': // Ⓗ [CIRCLED LATIN CAPITAL LETTER H]
				fallthrough
			case '\u2C67': // Ⱨ [LATIN CAPITAL LETTER H WITH DESCENDER]
				fallthrough
			case '\u2C75': // Ⱶ [LATIN CAPITAL LETTER HALF H]
				fallthrough
			case '\uFF28': // H [FULLWIDTH LATIN CAPITAL LETTER H]
				output[outputPos] = 'H'
				outputPos++

			case '\u0125': // ĥ [LATIN SMALL LETTER H WITH CIRCUMFLEX]
				fallthrough
			case '\u0127': // ħ [LATIN SMALL LETTER H WITH STROKE]
				fallthrough
			case '\u021F': // ȟ [LATIN SMALL LETTER H WITH CARON]
				fallthrough
			case '\u0265': // ɥ [LATIN SMALL LETTER TURNED H]
				fallthrough
			case '\u0266': // ɦ [LATIN SMALL LETTER H WITH HOOK]
				fallthrough
			case '\u02AE': // ʮ [LATIN SMALL LETTER TURNED H WITH FISHHOOK]
				fallthrough
			case '\u02AF': // ʯ [LATIN SMALL LETTER TURNED H WITH FISHHOOK AND TAIL]
				fallthrough
			case '\u1E23': // ḣ [LATIN SMALL LETTER H WITH DOT ABOVE]
				fallthrough
			case '\u1E25': // ḥ [LATIN SMALL LETTER H WITH DOT BELOW]
				fallthrough
			case '\u1E27': // ḧ [LATIN SMALL LETTER H WITH DIAERESIS]
				fallthrough
			case '\u1E29': // ḩ [LATIN SMALL LETTER H WITH CEDILLA]
				fallthrough
			case '\u1E2B': // ḫ [LATIN SMALL LETTER H WITH BREVE BELOW]
				fallthrough
			case '\u1E96': // ẖ [LATIN SMALL LETTER H WITH LINE BELOW]
				fallthrough
			case '\u24D7': // ⓗ [CIRCLED LATIN SMALL LETTER H]
				fallthrough
			case '\u2C68': // ⱨ [LATIN SMALL LETTER H WITH DESCENDER]
				fallthrough
			case '\u2C76': // ⱶ [LATIN SMALL LETTER HALF H]
				fallthrough
			case '\uFF48': // h [FULLWIDTH LATIN SMALL LETTER H]
				output[outputPos] = 'h'
				outputPos++

			case '\u01F6': // Ƕ http://en.wikipedia.org/wiki/Hwair [LATIN CAPITAL LETTER HWAIR]
				output = output[:(len(output) + 1)]
				output[outputPos] = 'H'
				outputPos++
				output[outputPos] = 'V'
				outputPos++

			case '\u24A3': // ⒣ [PARENTHESIZED LATIN SMALL LETTER H]
				output = output[:(len(output) + 2)]
				output[outputPos] = '('
				outputPos++
				output[outputPos] = 'h'
				outputPos++
				output[outputPos] = ')'
				outputPos++

			case '\u0195': // ƕ [LATIN SMALL LETTER HV]
				output = output[:(len(output) + 1)]
				output[outputPos] = 'h'
				outputPos++
				output[outputPos] = 'v'
				outputPos++

			case '\u00CC': // Ì [LATIN CAPITAL LETTER I WITH GRAVE]
				fallthrough
			case '\u00CD': // Í [LATIN CAPITAL LETTER I WITH ACUTE]
				fallthrough
			case '\u00CE': // Î [LATIN CAPITAL LETTER I WITH CIRCUMFLEX]
				fallthrough
			case '\u00CF': // Ï [LATIN CAPITAL LETTER I WITH DIAERESIS]
				fallthrough
			case '\u0128': // Ĩ [LATIN CAPITAL LETTER I WITH TILDE]
				fallthrough
			case '\u012A': // Ī [LATIN CAPITAL LETTER I WITH MACRON]
				fallthrough
			case '\u012C': // Ĭ [LATIN CAPITAL LETTER I WITH BREVE]
				fallthrough
			case '\u012E': // Į [LATIN CAPITAL LETTER I WITH OGONEK]
				fallthrough
			case '\u0130': // İ [LATIN CAPITAL LETTER I WITH DOT ABOVE]
				fallthrough
			case '\u0196': // Ɩ [LATIN CAPITAL LETTER IOTA]
				fallthrough
			case '\u0197': // Ɨ [LATIN CAPITAL LETTER I WITH STROKE]
				fallthrough
			case '\u01CF': // Ǐ [LATIN CAPITAL LETTER I WITH CARON]
				fallthrough
			case '\u0208': // Ȉ [LATIN CAPITAL LETTER I WITH DOUBLE GRAVE]
				fallthrough
			case '\u020A': // Ȋ [LATIN CAPITAL LETTER I WITH INVERTED BREVE]
				fallthrough
			case '\u026A': // ɪ [LATIN LETTER SMALL CAPITAL I]
				fallthrough
			case '\u1D7B': // ᵻ [LATIN SMALL CAPITAL LETTER I WITH STROKE]
				fallthrough
			case '\u1E2C': // Ḭ [LATIN CAPITAL LETTER I WITH TILDE BELOW]
				fallthrough
			case '\u1E2E': // Ḯ [LATIN CAPITAL LETTER I WITH DIAERESIS AND ACUTE]
				fallthrough
			case '\u1EC8': // Ỉ [LATIN CAPITAL LETTER I WITH HOOK ABOVE]
				fallthrough
			case '\u1ECA': // Ị [LATIN CAPITAL LETTER I WITH DOT BELOW]
				fallthrough
			case '\u24BE': // Ⓘ [CIRCLED LATIN CAPITAL LETTER I]
				fallthrough
			case '\uA7FE': // ꟾ [LATIN EPIGRAPHIC LETTER I LONGA]
				fallthrough
			case '\uFF29': // I [FULLWIDTH LATIN CAPITAL LETTER I]
				output[outputPos] = 'I'
				outputPos++

			case '\u00EC': // ì [LATIN SMALL LETTER I WITH GRAVE]
				fallthrough
			case '\u00ED': // í [LATIN SMALL LETTER I WITH ACUTE]
				fallthrough
			case '\u00EE': // î [LATIN SMALL LETTER I WITH CIRCUMFLEX]
				fallthrough
			case '\u00EF': // ï [LATIN SMALL LETTER I WITH DIAERESIS]
				fallthrough
			case '\u0129': // ĩ [LATIN SMALL LETTER I WITH TILDE]
				fallthrough
			case '\u012B': // ī [LATIN SMALL LETTER I WITH MACRON]
				fallthrough
			case '\u012D': // ĭ [LATIN SMALL LETTER I WITH BREVE]
				fallthrough
			case '\u012F': // į [LATIN SMALL LETTER I WITH OGONEK]
				fallthrough
			case '\u0131': // ı [LATIN SMALL LETTER DOTLESS I]
				fallthrough
			case '\u01D0': // ǐ [LATIN SMALL LETTER I WITH CARON]
				fallthrough
			case '\u0209': // ȉ [LATIN SMALL LETTER I WITH DOUBLE GRAVE]
				fallthrough
			case '\u020B': // ȋ [LATIN SMALL LETTER I WITH INVERTED BREVE]
				fallthrough
			case '\u0268': // ɨ [LATIN SMALL LETTER I WITH STROKE]
				fallthrough
			case '\u1D09': // ᴉ [LATIN SMALL LETTER TURNED I]
				fallthrough
			case '\u1D62': // ᵢ [LATIN SUBSCRIPT SMALL LETTER I]
				fallthrough
			case '\u1D7C': // ᵼ [LATIN SMALL LETTER IOTA WITH STROKE]
				fallthrough
			case '\u1D96': // ᶖ [LATIN SMALL LETTER I WITH RETROFLEX HOOK]
				fallthrough
			case '\u1E2D': // ḭ [LATIN SMALL LETTER I WITH TILDE BELOW]
				fallthrough
			case '\u1E2F': // ḯ [LATIN SMALL LETTER I WITH DIAERESIS AND ACUTE]
				fallthrough
			case '\u1EC9': // ỉ [LATIN SMALL LETTER I WITH HOOK ABOVE]
				fallthrough
			case '\u1ECB': // ị [LATIN SMALL LETTER I WITH DOT BELOW]
				fallthrough
			case '\u2071': // ⁱ [SUPERSCRIPT LATIN SMALL LETTER I]
				fallthrough
			case '\u24D8': // ⓘ [CIRCLED LATIN SMALL LETTER I]
				fallthrough
			case '\uFF49': // i [FULLWIDTH LATIN SMALL LETTER I]
				output[outputPos] = 'i'
				outputPos++

			case '\u0132': // IJ [LATIN CAPITAL LIGATURE IJ]
				output = output[:(len(output) + 1)]
				output[outputPos] = 'I'
				outputPos++
				output[outputPos] = 'J'
				outputPos++

			case '\u24A4': // ⒤ [PARENTHESIZED LATIN SMALL LETTER I]
				output = output[:(len(output) + 2)]
				output[outputPos] = '('
				outputPos++
				output[outputPos] = 'i'
				outputPos++
				output[outputPos] = ')'
				outputPos++

			case '\u0133': // ij [LATIN SMALL LIGATURE IJ]
				output = output[:(len(output) + 1)]
				output[outputPos] = 'i'
				outputPos++
				output[outputPos] = 'j'
				outputPos++

			case '\u0134': // Ĵ [LATIN CAPITAL LETTER J WITH CIRCUMFLEX]
				fallthrough
			case '\u0248': // Ɉ [LATIN CAPITAL LETTER J WITH STROKE]
				fallthrough
			case '\u1D0A': // ᴊ [LATIN LETTER SMALL CAPITAL J]
				fallthrough
			case '\u24BF': // Ⓙ [CIRCLED LATIN CAPITAL LETTER J]
				fallthrough
			case '\uFF2A': // J [FULLWIDTH LATIN CAPITAL LETTER J]
				output[outputPos] = 'J'
				outputPos++

			case '\u0135': // ĵ [LATIN SMALL LETTER J WITH CIRCUMFLEX]
				fallthrough
			case '\u01F0': // ǰ [LATIN SMALL LETTER J WITH CARON]
				fallthrough
			case '\u0237': // ȷ [LATIN SMALL LETTER DOTLESS J]
				fallthrough
			case '\u0249': // ɉ [LATIN SMALL LETTER J WITH STROKE]
				fallthrough
			case '\u025F': // ɟ [LATIN SMALL LETTER DOTLESS J WITH STROKE]
				fallthrough
			case '\u0284': // ʄ [LATIN SMALL LETTER DOTLESS J WITH STROKE AND HOOK]
				fallthrough
			case '\u029D': // ʝ [LATIN SMALL LETTER J WITH CROSSED-TAIL]
				fallthrough
			case '\u24D9': // ⓙ [CIRCLED LATIN SMALL LETTER J]
				fallthrough
			case '\u2C7C': // ⱼ [LATIN SUBSCRIPT SMALL LETTER J]
				fallthrough
			case '\uFF4A': // j [FULLWIDTH LATIN SMALL LETTER J]
				output[outputPos] = 'j'
				outputPos++

			case '\u24A5': // ⒥ [PARENTHESIZED LATIN SMALL LETTER J]
				output = output[:(len(output) + 2)]
				output[outputPos] = '('
				outputPos++
				output[outputPos] = 'j'
				outputPos++
				output[outputPos] = ')'
				outputPos++

			case '\u0136': // Ķ [LATIN CAPITAL LETTER K WITH CEDILLA]
				fallthrough
			case '\u0198': // Ƙ [LATIN CAPITAL LETTER K WITH HOOK]
				fallthrough
			case '\u01E8': // Ǩ [LATIN CAPITAL LETTER K WITH CARON]
				fallthrough
			case '\u1D0B': // ᴋ [LATIN LETTER SMALL CAPITAL K]
				fallthrough
			case '\u1E30': // Ḱ [LATIN CAPITAL LETTER K WITH ACUTE]
				fallthrough
			case '\u1E32': // Ḳ [LATIN CAPITAL LETTER K WITH DOT BELOW]
				fallthrough
			case '\u1E34': // Ḵ [LATIN CAPITAL LETTER K WITH LINE BELOW]
				fallthrough
			case '\u24C0': // Ⓚ [CIRCLED LATIN CAPITAL LETTER K]
				fallthrough
			case '\u2C69': // Ⱪ [LATIN CAPITAL LETTER K WITH DESCENDER]
				fallthrough
			case '\uA740': // Ꝁ [LATIN CAPITAL LETTER K WITH STROKE]
				fallthrough
			case '\uA742': // Ꝃ [LATIN CAPITAL LETTER K WITH DIAGONAL STROKE]
				fallthrough
			case '\uA744': // Ꝅ [LATIN CAPITAL LETTER K WITH STROKE AND DIAGONAL STROKE]
				fallthrough
			case '\uFF2B': // K [FULLWIDTH LATIN CAPITAL LETTER K]
				output[outputPos] = 'K'
				outputPos++

			case '\u0137': // ķ [LATIN SMALL LETTER K WITH CEDILLA]
				fallthrough
			case '\u0199': // ƙ [LATIN SMALL LETTER K WITH HOOK]
				fallthrough
			case '\u01E9': // ǩ [LATIN SMALL LETTER K WITH CARON]
				fallthrough
			case '\u029E': // ʞ [LATIN SMALL LETTER TURNED K]
				fallthrough
			case '\u1D84': // ᶄ [LATIN SMALL LETTER K WITH PALATAL HOOK]
				fallthrough
			case '\u1E31': // ḱ [LATIN SMALL LETTER K WITH ACUTE]
				fallthrough
			case '\u1E33': // ḳ [LATIN SMALL LETTER K WITH DOT BELOW]
				fallthrough
			case '\u1E35': // ḵ [LATIN SMALL LETTER K WITH LINE BELOW]
				fallthrough
			case '\u24DA': // ⓚ [CIRCLED LATIN SMALL LETTER K]
				fallthrough
			case '\u2C6A': // ⱪ [LATIN SMALL LETTER K WITH DESCENDER]
				fallthrough
			case '\uA741': // ꝁ [LATIN SMALL LETTER K WITH STROKE]
				fallthrough
			case '\uA743': // ꝃ [LATIN SMALL LETTER K WITH DIAGONAL STROKE]
				fallthrough
			case '\uA745': // ꝅ [LATIN SMALL LETTER K WITH STROKE AND DIAGONAL STROKE]
				fallthrough
			case '\uFF4B': // k [FULLWIDTH LATIN SMALL LETTER K]
				output[outputPos] = 'k'
				outputPos++

			case '\u24A6': // ⒦ [PARENTHESIZED LATIN SMALL LETTER K]
				output = output[:(len(output) + 2)]
				output[outputPos] = '('
				outputPos++
				output[outputPos] = 'k'
				outputPos++
				output[outputPos] = ')'
				outputPos++

			case '\u0139': // Ĺ [LATIN CAPITAL LETTER L WITH ACUTE]
				fallthrough
			case '\u013B': // Ļ [LATIN CAPITAL LETTER L WITH CEDILLA]
				fallthrough
			case '\u013D': // Ľ [LATIN CAPITAL LETTER L WITH CARON]
				fallthrough
			case '\u013F': // Ŀ [LATIN CAPITAL LETTER L WITH MIDDLE DOT]
				fallthrough
			case '\u0141': // Ł [LATIN CAPITAL LETTER L WITH STROKE]
				fallthrough
			case '\u023D': // Ƚ [LATIN CAPITAL LETTER L WITH BAR]
				fallthrough
			case '\u029F': // ʟ [LATIN LETTER SMALL CAPITAL L]
				fallthrough
			case '\u1D0C': // ᴌ [LATIN LETTER SMALL CAPITAL L WITH STROKE]
				fallthrough
			case '\u1E36': // Ḷ [LATIN CAPITAL LETTER L WITH DOT BELOW]
				fallthrough
			case '\u1E38': // Ḹ [LATIN CAPITAL LETTER L WITH DOT BELOW AND MACRON]
				fallthrough
			case '\u1E3A': // Ḻ [LATIN CAPITAL LETTER L WITH LINE BELOW]
				fallthrough
			case '\u1E3C': // Ḽ [LATIN CAPITAL LETTER L WITH CIRCUMFLEX BELOW]
				fallthrough
			case '\u24C1': // Ⓛ [CIRCLED LATIN CAPITAL LETTER L]
				fallthrough
			case '\u2C60': // Ⱡ [LATIN CAPITAL LETTER L WITH DOUBLE BAR]
				fallthrough
			case '\u2C62': // Ɫ [LATIN CAPITAL LETTER L WITH MIDDLE TILDE]
				fallthrough
			case '\uA746': // Ꝇ [LATIN CAPITAL LETTER BROKEN L]
				fallthrough
			case '\uA748': // Ꝉ [LATIN CAPITAL LETTER L WITH HIGH STROKE]
				fallthrough
			case '\uA780': // Ꞁ [LATIN CAPITAL LETTER TURNED L]
				fallthrough
			case '\uFF2C': // L [FULLWIDTH LATIN CAPITAL LETTER L]
				output[outputPos] = 'L'
				outputPos++

			case '\u013A': // ĺ [LATIN SMALL LETTER L WITH ACUTE]
				fallthrough
			case '\u013C': // ļ [LATIN SMALL LETTER L WITH CEDILLA]
				fallthrough
			case '\u013E': // ľ [LATIN SMALL LETTER L WITH CARON]
				fallthrough
			case '\u0140': // ŀ [LATIN SMALL LETTER L WITH MIDDLE DOT]
				fallthrough
			case '\u0142': // ł [LATIN SMALL LETTER L WITH STROKE]
				fallthrough
			case '\u019A': // ƚ [LATIN SMALL LETTER L WITH BAR]
				fallthrough
			case '\u0234': // ȴ [LATIN SMALL LETTER L WITH CURL]
				fallthrough
			case '\u026B': // ɫ [LATIN SMALL LETTER L WITH MIDDLE TILDE]
				fallthrough
			case '\u026C': // ɬ [LATIN SMALL LETTER L WITH BELT]
				fallthrough
			case '\u026D': // ɭ [LATIN SMALL LETTER L WITH RETROFLEX HOOK]
				fallthrough
			case '\u1D85': // ᶅ [LATIN SMALL LETTER L WITH PALATAL HOOK]
				fallthrough
			case '\u1E37': // ḷ [LATIN SMALL LETTER L WITH DOT BELOW]
				fallthrough
			case '\u1E39': // ḹ [LATIN SMALL LETTER L WITH DOT BELOW AND MACRON]
				fallthrough
			case '\u1E3B': // ḻ [LATIN SMALL LETTER L WITH LINE BELOW]
				fallthrough
			case '\u1E3D': // ḽ [LATIN SMALL LETTER L WITH CIRCUMFLEX BELOW]
				fallthrough
			case '\u24DB': // ⓛ [CIRCLED LATIN SMALL LETTER L]
				fallthrough
			case '\u2C61': // ⱡ [LATIN SMALL LETTER L WITH DOUBLE BAR]
				fallthrough
			case '\uA747': // ꝇ [LATIN SMALL LETTER BROKEN L]
				fallthrough
			case '\uA749': // ꝉ [LATIN SMALL LETTER L WITH HIGH STROKE]
				fallthrough
			case '\uA781': // ꞁ [LATIN SMALL LETTER TURNED L]
				fallthrough
			case '\uFF4C': // l [FULLWIDTH LATIN SMALL LETTER L]
				output[outputPos] = 'l'
				outputPos++

			case '\u01C7': // LJ [LATIN CAPITAL LETTER LJ]
				output = output[:(len(output) + 1)]
				output[outputPos] = 'L'
				outputPos++
				output[outputPos] = 'J'
				outputPos++

			case '\u1EFA': // Ỻ [LATIN CAPITAL LETTER MIDDLE-WELSH LL]
				output = output[:(len(output) + 1)]
				output[outputPos] = 'L'
				outputPos++
				output[outputPos] = 'L'
				outputPos++

			case '\u01C8': // Lj [LATIN CAPITAL LETTER L WITH SMALL LETTER J]
				output = output[:(len(output) + 1)]
				output[outputPos] = 'L'
				outputPos++
				output[outputPos] = 'j'
				outputPos++

			case '\u24A7': // ⒧ [PARENTHESIZED LATIN SMALL LETTER L]
				output = output[:(len(output) + 2)]
				output[outputPos] = '('
				outputPos++
				output[outputPos] = 'l'
				outputPos++
				output[outputPos] = ')'
				outputPos++

			case '\u01C9': // lj [LATIN SMALL LETTER LJ]
				output = output[:(len(output) + 1)]
				output[outputPos] = 'l'
				outputPos++
				output[outputPos] = 'j'
				outputPos++

			case '\u1EFB': // ỻ [LATIN SMALL LETTER MIDDLE-WELSH LL]
				output = output[:(len(output) + 1)]
				output[outputPos] = 'l'
				outputPos++
				output[outputPos] = 'l'
				outputPos++

			case '\u02AA': // ʪ [LATIN SMALL LETTER LS DIGRAPH]
				output = output[:(len(output) + 1)]
				output[outputPos] = 'l'
				outputPos++
				output[outputPos] = 's'
				outputPos++

			case '\u02AB': // ʫ [LATIN SMALL LETTER LZ DIGRAPH]
				output = output[:(len(output) + 1)]
				output[outputPos] = 'l'
				outputPos++
				output[outputPos] = 'z'
				outputPos++

			case '\u019C': // Ɯ [LATIN CAPITAL LETTER TURNED M]
				fallthrough
			case '\u1D0D': // ᴍ [LATIN LETTER SMALL CAPITAL M]
				fallthrough
			case '\u1E3E': // Ḿ [LATIN CAPITAL LETTER M WITH ACUTE]
				fallthrough
			case '\u1E40': // Ṁ [LATIN CAPITAL LETTER M WITH DOT ABOVE]
				fallthrough
			case '\u1E42': // Ṃ [LATIN CAPITAL LETTER M WITH DOT BELOW]
				fallthrough
			case '\u24C2': // Ⓜ [CIRCLED LATIN CAPITAL LETTER M]
				fallthrough
			case '\u2C6E': // Ɱ [LATIN CAPITAL LETTER M WITH HOOK]
				fallthrough
			case '\uA7FD': // ꟽ [LATIN EPIGRAPHIC LETTER INVERTED M]
				fallthrough
			case '\uA7FF': // ꟿ [LATIN EPIGRAPHIC LETTER ARCHAIC M]
				fallthrough
			case '\uFF2D': // M [FULLWIDTH LATIN CAPITAL LETTER M]
				output[outputPos] = 'M'
				outputPos++

			case '\u026F': // ɯ [LATIN SMALL LETTER TURNED M]
				fallthrough
			case '\u0270': // ɰ [LATIN SMALL LETTER TURNED M WITH LONG LEG]
				fallthrough
			case '\u0271': // ɱ [LATIN SMALL LETTER M WITH HOOK]
				fallthrough
			case '\u1D6F': // ᵯ [LATIN SMALL LETTER M WITH MIDDLE TILDE]
				fallthrough
			case '\u1D86': // ᶆ [LATIN SMALL LETTER M WITH PALATAL HOOK]
				fallthrough
			case '\u1E3F': // ḿ [LATIN SMALL LETTER M WITH ACUTE]
				fallthrough
			case '\u1E41': // ṁ [LATIN SMALL LETTER M WITH DOT ABOVE]
				fallthrough
			case '\u1E43': // ṃ [LATIN SMALL LETTER M WITH DOT BELOW]
				fallthrough
			case '\u24DC': // ⓜ [CIRCLED LATIN SMALL LETTER M]
				fallthrough
			case '\uFF4D': // m [FULLWIDTH LATIN SMALL LETTER M]
				output[outputPos] = 'm'
				outputPos++

			case '\u24A8': // ⒨ [PARENTHESIZED LATIN SMALL LETTER M]
				output = output[:(len(output) + 2)]
				output[outputPos] = '('
				outputPos++
				output[outputPos] = 'm'
				outputPos++
				output[outputPos] = ')'
				outputPos++

			case '\u00D1': // Ñ [LATIN CAPITAL LETTER N WITH TILDE]
				fallthrough
			case '\u0143': // Ń [LATIN CAPITAL LETTER N WITH ACUTE]
				fallthrough
			case '\u0145': // Ņ [LATIN CAPITAL LETTER N WITH CEDILLA]
				fallthrough
			case '\u0147': // Ň [LATIN CAPITAL LETTER N WITH CARON]
				fallthrough
			case '\u014A': // Ŋ http://en.wikipedia.org/wiki/Eng_(letter) [LATIN CAPITAL LETTER ENG]
				fallthrough
			case '\u019D': // Ɲ [LATIN CAPITAL LETTER N WITH LEFT HOOK]
				fallthrough
			case '\u01F8': // Ǹ [LATIN CAPITAL LETTER N WITH GRAVE]
				fallthrough
			case '\u0220': // Ƞ [LATIN CAPITAL LETTER N WITH LONG RIGHT LEG]
				fallthrough
			case '\u0274': // ɴ [LATIN LETTER SMALL CAPITAL N]
				fallthrough
			case '\u1D0E': // ᴎ [LATIN LETTER SMALL CAPITAL REVERSED N]
				fallthrough
			case '\u1E44': // Ṅ [LATIN CAPITAL LETTER N WITH DOT ABOVE]
				fallthrough
			case '\u1E46': // Ṇ [LATIN CAPITAL LETTER N WITH DOT BELOW]
				fallthrough
			case '\u1E48': // Ṉ [LATIN CAPITAL LETTER N WITH LINE BELOW]
				fallthrough
			case '\u1E4A': // Ṋ [LATIN CAPITAL LETTER N WITH CIRCUMFLEX BELOW]
				fallthrough
			case '\u24C3': // Ⓝ [CIRCLED LATIN CAPITAL LETTER N]
				fallthrough
			case '\uFF2E': // N [FULLWIDTH LATIN CAPITAL LETTER N]
				output[outputPos] = 'N'
				outputPos++

			case '\u00F1': // ñ [LATIN SMALL LETTER N WITH TILDE]
				fallthrough
			case '\u0144': // ń [LATIN SMALL LETTER N WITH ACUTE]
				fallthrough
			case '\u0146': // ņ [LATIN SMALL LETTER N WITH CEDILLA]
				fallthrough
			case '\u0148': // ň [LATIN SMALL LETTER N WITH CARON]
				fallthrough
			case '\u0149': // ʼn [LATIN SMALL LETTER N PRECEDED BY APOSTROPHE]
				fallthrough
			case '\u014B': // ŋ http://en.wikipedia.org/wiki/Eng_(letter) [LATIN SMALL LETTER ENG]
				fallthrough
			case '\u019E': // ƞ [LATIN SMALL LETTER N WITH LONG RIGHT LEG]
				fallthrough
			case '\u01F9': // ǹ [LATIN SMALL LETTER N WITH GRAVE]
				fallthrough
			case '\u0235': // ȵ [LATIN SMALL LETTER N WITH CURL]
				fallthrough
			case '\u0272': // ɲ [LATIN SMALL LETTER N WITH LEFT HOOK]
				fallthrough
			case '\u0273': // ɳ [LATIN SMALL LETTER N WITH RETROFLEX HOOK]
				fallthrough
			case '\u1D70': // ᵰ [LATIN SMALL LETTER N WITH MIDDLE TILDE]
				fallthrough
			case '\u1D87': // ᶇ [LATIN SMALL LETTER N WITH PALATAL HOOK]
				fallthrough
			case '\u1E45': // ṅ [LATIN SMALL LETTER N WITH DOT ABOVE]
				fallthrough
			case '\u1E47': // ṇ [LATIN SMALL LETTER N WITH DOT BELOW]
				fallthrough
			case '\u1E49': // ṉ [LATIN SMALL LETTER N WITH LINE BELOW]
				fallthrough
			case '\u1E4B': // ṋ [LATIN SMALL LETTER N WITH CIRCUMFLEX BELOW]
				fallthrough
			case '\u207F': // ⁿ [SUPERSCRIPT LATIN SMALL LETTER N]
				fallthrough
			case '\u24DD': // ⓝ [CIRCLED LATIN SMALL LETTER N]
				fallthrough
			case '\uFF4E': // n [FULLWIDTH LATIN SMALL LETTER N]
				output[outputPos] = 'n'
				outputPos++

			case '\u01CA': // NJ [LATIN CAPITAL LETTER NJ]
				output = output[:(len(output) + 1)]
				output[outputPos] = 'N'
				outputPos++
				output[outputPos] = 'J'
				outputPos++

			case '\u01CB': // Nj [LATIN CAPITAL LETTER N WITH SMALL LETTER J]
				output = output[:(len(output) + 1)]
				output[outputPos] = 'N'
				outputPos++
				output[outputPos] = 'j'
				outputPos++

			case '\u24A9': // ⒩ [PARENTHESIZED LATIN SMALL LETTER N]
				output = output[:(len(output) + 2)]
				output[outputPos] = '('
				outputPos++
				output[outputPos] = 'n'
				outputPos++
				output[outputPos] = ')'
				outputPos++

			case '\u01CC': // nj [LATIN SMALL LETTER NJ]
				output = output[:(len(output) + 1)]
				output[outputPos] = 'n'
				outputPos++
				output[outputPos] = 'j'
				outputPos++

			case '\u00D2': // Ò [LATIN CAPITAL LETTER O WITH GRAVE]
				fallthrough
			case '\u00D3': // Ó [LATIN CAPITAL LETTER O WITH ACUTE]
				fallthrough
			case '\u00D4': // Ô [LATIN CAPITAL LETTER O WITH CIRCUMFLEX]
				fallthrough
			case '\u00D5': // Õ [LATIN CAPITAL LETTER O WITH TILDE]
				fallthrough
			case '\u00D6': // Ö [LATIN CAPITAL LETTER O WITH DIAERESIS]
				fallthrough
			case '\u00D8': // Ø [LATIN CAPITAL LETTER O WITH STROKE]
				fallthrough
			case '\u014C': // Ō [LATIN CAPITAL LETTER O WITH MACRON]
				fallthrough
			case '\u014E': // Ŏ [LATIN CAPITAL LETTER O WITH BREVE]
				fallthrough
			case '\u0150': // Ő [LATIN CAPITAL LETTER O WITH DOUBLE ACUTE]
				fallthrough
			case '\u0186': // Ɔ [LATIN CAPITAL LETTER OPEN O]
				fallthrough
			case '\u019F': // Ɵ [LATIN CAPITAL LETTER O WITH MIDDLE TILDE]
				fallthrough
			case '\u01A0': // Ơ [LATIN CAPITAL LETTER O WITH HORN]
				fallthrough
			case '\u01D1': // Ǒ [LATIN CAPITAL LETTER O WITH CARON]
				fallthrough
			case '\u01EA': // Ǫ [LATIN CAPITAL LETTER O WITH OGONEK]
				fallthrough
			case '\u01EC': // Ǭ [LATIN CAPITAL LETTER O WITH OGONEK AND MACRON]
				fallthrough
			case '\u01FE': // Ǿ [LATIN CAPITAL LETTER O WITH STROKE AND ACUTE]
				fallthrough
			case '\u020C': // Ȍ [LATIN CAPITAL LETTER O WITH DOUBLE GRAVE]
				fallthrough
			case '\u020E': // Ȏ [LATIN CAPITAL LETTER O WITH INVERTED BREVE]
				fallthrough
			case '\u022A': // Ȫ [LATIN CAPITAL LETTER O WITH DIAERESIS AND MACRON]
				fallthrough
			case '\u022C': // Ȭ [LATIN CAPITAL LETTER O WITH TILDE AND MACRON]
				fallthrough
			case '\u022E': // Ȯ [LATIN CAPITAL LETTER O WITH DOT ABOVE]
				fallthrough
			case '\u0230': // Ȱ [LATIN CAPITAL LETTER O WITH DOT ABOVE AND MACRON]
				fallthrough
			case '\u1D0F': // ᴏ [LATIN LETTER SMALL CAPITAL O]
				fallthrough
			case '\u1D10': // ᴐ [LATIN LETTER SMALL CAPITAL OPEN O]
				fallthrough
			case '\u1E4C': // Ṍ [LATIN CAPITAL LETTER O WITH TILDE AND ACUTE]
				fallthrough
			case '\u1E4E': // Ṏ [LATIN CAPITAL LETTER O WITH TILDE AND DIAERESIS]
				fallthrough
			case '\u1E50': // Ṑ [LATIN CAPITAL LETTER O WITH MACRON AND GRAVE]
				fallthrough
			case '\u1E52': // Ṓ [LATIN CAPITAL LETTER O WITH MACRON AND ACUTE]
				fallthrough
			case '\u1ECC': // Ọ [LATIN CAPITAL LETTER O WITH DOT BELOW]
				fallthrough
			case '\u1ECE': // Ỏ [LATIN CAPITAL LETTER O WITH HOOK ABOVE]
				fallthrough
			case '\u1ED0': // Ố [LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE]
				fallthrough
			case '\u1ED2': // Ồ [LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE]
				fallthrough
			case '\u1ED4': // Ổ [LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE]
				fallthrough
			case '\u1ED6': // Ỗ [LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE]
				fallthrough
			case '\u1ED8': // Ộ [LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND DOT BELOW]
				fallthrough
			case '\u1EDA': // Ớ [LATIN CAPITAL LETTER O WITH HORN AND ACUTE]
				fallthrough
			case '\u1EDC': // Ờ [LATIN CAPITAL LETTER O WITH HORN AND GRAVE]
				fallthrough
			case '\u1EDE': // Ở [LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE]
				fallthrough
			case '\u1EE0': // Ỡ [LATIN CAPITAL LETTER O WITH HORN AND TILDE]
				fallthrough
			case '\u1EE2': // Ợ [LATIN CAPITAL LETTER O WITH HORN AND DOT BELOW]
				fallthrough
			case '\u24C4': // Ⓞ [CIRCLED LATIN CAPITAL LETTER O]
				fallthrough
			case '\uA74A': // Ꝋ [LATIN CAPITAL LETTER O WITH LONG STROKE OVERLAY]
				fallthrough
			case '\uA74C': // Ꝍ [LATIN CAPITAL LETTER O WITH LOOP]
				fallthrough
			case '\uFF2F': // O [FULLWIDTH LATIN CAPITAL LETTER O]
				output[outputPos] = 'O'
				outputPos++

			case '\u00F2': // ò [LATIN SMALL LETTER O WITH GRAVE]
				fallthrough
			case '\u00F3': // ó [LATIN SMALL LETTER O WITH ACUTE]
				fallthrough
			case '\u00F4': // ô [LATIN SMALL LETTER O WITH CIRCUMFLEX]
				fallthrough
			case '\u00F5': // õ [LATIN SMALL LETTER O WITH TILDE]
				fallthrough
			case '\u00F6': // ö [LATIN SMALL LETTER O WITH DIAERESIS]
				fallthrough
			case '\u00F8': // ø [LATIN SMALL LETTER O WITH STROKE]
				fallthrough
			case '\u014D': // ō [LATIN SMALL LETTER O WITH MACRON]
				fallthrough
			case '\u014F': // ŏ [LATIN SMALL LETTER O WITH BREVE]
				fallthrough
			case '\u0151': // ő [LATIN SMALL LETTER O WITH DOUBLE ACUTE]
				fallthrough
			case '\u01A1': // ơ [LATIN SMALL LETTER O WITH HORN]
				fallthrough
			case '\u01D2': // ǒ [LATIN SMALL LETTER O WITH CARON]
				fallthrough
			case '\u01EB': // ǫ [LATIN SMALL LETTER O WITH OGONEK]
				fallthrough
			case '\u01ED': // ǭ [LATIN SMALL LETTER O WITH OGONEK AND MACRON]
				fallthrough
			case '\u01FF': // ǿ [LATIN SMALL LETTER O WITH STROKE AND ACUTE]
				fallthrough
			case '\u020D': // ȍ [LATIN SMALL LETTER O WITH DOUBLE GRAVE]
				fallthrough
			case '\u020F': // ȏ [LATIN SMALL LETTER O WITH INVERTED BREVE]
				fallthrough
			case '\u022B': // ȫ [LATIN SMALL LETTER O WITH DIAERESIS AND MACRON]
				fallthrough
			case '\u022D': // ȭ [LATIN SMALL LETTER O WITH TILDE AND MACRON]
				fallthrough
			case '\u022F': // ȯ [LATIN SMALL LETTER O WITH DOT ABOVE]
				fallthrough
			case '\u0231': // ȱ [LATIN SMALL LETTER O WITH DOT ABOVE AND MACRON]
				fallthrough
			case '\u0254': // ɔ [LATIN SMALL LETTER OPEN O]
				fallthrough
			case '\u0275': // ɵ [LATIN SMALL LETTER BARRED O]
				fallthrough
			case '\u1D16': // ᴖ [LATIN SMALL LETTER TOP HALF O]
				fallthrough
			case '\u1D17': // ᴗ [LATIN SMALL LETTER BOTTOM HALF O]
				fallthrough
			case '\u1D97': // ᶗ [LATIN SMALL LETTER OPEN O WITH RETROFLEX HOOK]
				fallthrough
			case '\u1E4D': // ṍ [LATIN SMALL LETTER O WITH TILDE AND ACUTE]
				fallthrough
			case '\u1E4F': // ṏ [LATIN SMALL LETTER O WITH TILDE AND DIAERESIS]
				fallthrough
			case '\u1E51': // ṑ [LATIN SMALL LETTER O WITH MACRON AND GRAVE]
				fallthrough
			case '\u1E53': // ṓ [LATIN SMALL LETTER O WITH MACRON AND ACUTE]
				fallthrough
			case '\u1ECD': // ọ [LATIN SMALL LETTER O WITH DOT BELOW]
				fallthrough
			case '\u1ECF': // ỏ [LATIN SMALL LETTER O WITH HOOK ABOVE]
				fallthrough
			case '\u1ED1': // ố [LATIN SMALL LETTER O WITH CIRCUMFLEX AND ACUTE]
				fallthrough
			case '\u1ED3': // ồ [LATIN SMALL LETTER O WITH CIRCUMFLEX AND GRAVE]
				fallthrough
			case '\u1ED5': // ổ [LATIN SMALL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE]
				fallthrough
			case '\u1ED7': // ỗ [LATIN SMALL LETTER O WITH CIRCUMFLEX AND TILDE]
				fallthrough
			case '\u1ED9': // ộ [LATIN SMALL LETTER O WITH CIRCUMFLEX AND DOT BELOW]
				fallthrough
			case '\u1EDB': // ớ [LATIN SMALL LETTER O WITH HORN AND ACUTE]
				fallthrough
			case '\u1EDD': // ờ [LATIN SMALL LETTER O WITH HORN AND GRAVE]
				fallthrough
			case '\u1EDF': // ở [LATIN SMALL LETTER O WITH HORN AND HOOK ABOVE]
				fallthrough
			case '\u1EE1': // ỡ [LATIN SMALL LETTER O WITH HORN AND TILDE]
				fallthrough
			case '\u1EE3': // ợ [LATIN SMALL LETTER O WITH HORN AND DOT BELOW]
				fallthrough
			case '\u2092': // ₒ [LATIN SUBSCRIPT SMALL LETTER O]
				fallthrough
			case '\u24DE': // ⓞ [CIRCLED LATIN SMALL LETTER O]
				fallthrough
			case '\u2C7A': // ⱺ [LATIN SMALL LETTER O WITH LOW RING INSIDE]
				fallthrough
			case '\uA74B': // ꝋ [LATIN SMALL LETTER O WITH LONG STROKE OVERLAY]
				fallthrough
			case '\uA74D': // ꝍ [LATIN SMALL LETTER O WITH LOOP]
				fallthrough
			case '\uFF4F': // o [FULLWIDTH LATIN SMALL LETTER O]
				output[outputPos] = 'o'
				outputPos++

			case '\u0152': // Œ [LATIN CAPITAL LIGATURE OE]
				fallthrough
			case '\u0276': // ɶ [LATIN LETTER SMALL CAPITAL OE]
				output = output[:(len(output) + 1)]
				output[outputPos] = 'O'
				outputPos++
				output[outputPos] = 'E'
				outputPos++

			case '\uA74E': // Ꝏ [LATIN CAPITAL LETTER OO]
				output = output[:(len(output) + 1)]
				output[outputPos] = 'O'
				outputPos++
				output[outputPos] = 'O'
				outputPos++

			case '\u0222': // Ȣ http://en.wikipedia.org/wiki/OU [LATIN CAPITAL LETTER OU]
				fallthrough
			case '\u1D15': // ᴕ [LATIN LETTER SMALL CAPITAL OU]
				output = output[:(len(output) + 1)]
				output[outputPos] = 'O'
				outputPos++
				output[outputPos] = 'U'
				outputPos++

			case '\u24AA': // ⒪ [PARENTHESIZED LATIN SMALL LETTER O]
				output = output[:(len(output) + 2)]
				output[outputPos] = '('
				outputPos++
				output[outputPos] = 'o'
				outputPos++
				output[outputPos] = ')'
				outputPos++

			case '\u0153': // œ [LATIN SMALL LIGATURE OE]
				fallthrough
			case '\u1D14': // ᴔ [LATIN SMALL LETTER TURNED OE]
				output = output[:(len(output) + 1)]
				output[outputPos] = 'o'
				outputPos++
				output[outputPos] = 'e'
				outputPos++

			case '\uA74F': // ꝏ [LATIN SMALL LETTER OO]
				output = output[:(len(output) + 1)]
				output[outputPos] = 'o'
				outputPos++
				output[outputPos] = 'o'
				outputPos++

			case '\u0223': // ȣ http://en.wikipedia.org/wiki/OU [LATIN SMALL LETTER OU]
				output = output[:(len(output) + 1)]
				output[outputPos] = 'o'
				outputPos++
				output[outputPos] = 'u'
				outputPos++

			case '\u01A4': // Ƥ [LATIN CAPITAL LETTER P WITH HOOK]
				fallthrough
			case '\u1D18': // ᴘ [LATIN LETTER SMALL CAPITAL P]
				fallthrough
			case '\u1E54': // Ṕ [LATIN CAPITAL LETTER P WITH ACUTE]
				fallthrough
			case '\u1E56': // Ṗ [LATIN CAPITAL LETTER P WITH DOT ABOVE]
				fallthrough
			case '\u24C5': // Ⓟ [CIRCLED LATIN CAPITAL LETTER P]
				fallthrough
			case '\u2C63': // Ᵽ [LATIN CAPITAL LETTER P WITH STROKE]
				fallthrough
			case '\uA750': // Ꝑ [LATIN CAPITAL LETTER P WITH STROKE THROUGH DESCENDER]
				fallthrough
			case '\uA752': // Ꝓ [LATIN CAPITAL LETTER P WITH FLOURISH]
				fallthrough
			case '\uA754': // Ꝕ [LATIN CAPITAL LETTER P WITH SQUIRREL TAIL]
				fallthrough
			case '\uFF30': // P [FULLWIDTH LATIN CAPITAL LETTER P]
				output[outputPos] = 'P'
				outputPos++

			case '\u01A5': // ƥ [LATIN SMALL LETTER P WITH HOOK]
				fallthrough
			case '\u1D71': // ᵱ [LATIN SMALL LETTER P WITH MIDDLE TILDE]
				fallthrough
			case '\u1D7D': // ᵽ [LATIN SMALL LETTER P WITH STROKE]
				fallthrough
			case '\u1D88': // ᶈ [LATIN SMALL LETTER P WITH PALATAL HOOK]
				fallthrough
			case '\u1E55': // ṕ [LATIN SMALL LETTER P WITH ACUTE]
				fallthrough
			case '\u1E57': // ṗ [LATIN SMALL LETTER P WITH DOT ABOVE]
				fallthrough
			case '\u24DF': // ⓟ [CIRCLED LATIN SMALL LETTER P]
				fallthrough
			case '\uA751': // ꝑ [LATIN SMALL LETTER P WITH STROKE THROUGH DESCENDER]
				fallthrough
			case '\uA753': // ꝓ [LATIN SMALL LETTER P WITH FLOURISH]
				fallthrough
			case '\uA755': // ꝕ [LATIN SMALL LETTER P WITH SQUIRREL TAIL]
				fallthrough
			case '\uA7FC': // ꟼ [LATIN EPIGRAPHIC LETTER REVERSED P]
				fallthrough
			case '\uFF50': // p [FULLWIDTH LATIN SMALL LETTER P]
				output[outputPos] = 'p'
				outputPos++

			case '\u24AB': // ⒫ [PARENTHESIZED LATIN SMALL LETTER P]
				output = output[:(len(output) + 2)]
				output[outputPos] = '('
				outputPos++
				output[outputPos] = 'p'
				outputPos++
				output[outputPos] = ')'
				outputPos++

			case '\u024A': // Ɋ [LATIN CAPITAL LETTER SMALL Q WITH HOOK TAIL]
				fallthrough
			case '\u24C6': // Ⓠ [CIRCLED LATIN CAPITAL LETTER Q]
				fallthrough
			case '\uA756': // Ꝗ [LATIN CAPITAL LETTER Q WITH STROKE THROUGH DESCENDER]
				fallthrough
			case '\uA758': // Ꝙ [LATIN CAPITAL LETTER Q WITH DIAGONAL STROKE]
				fallthrough
			case '\uFF31': // Q [FULLWIDTH LATIN CAPITAL LETTER Q]
				output[outputPos] = 'Q'
				outputPos++

			case '\u0138': // ĸ http://en.wikipedia.org/wiki/Kra_(letter) [LATIN SMALL LETTER KRA]
				fallthrough
			case '\u024B': // ɋ [LATIN SMALL LETTER Q WITH HOOK TAIL]
				fallthrough
			case '\u02A0': // ʠ [LATIN SMALL LETTER Q WITH HOOK]
				fallthrough
			case '\u24E0': // ⓠ [CIRCLED LATIN SMALL LETTER Q]
				fallthrough
			case '\uA757': // ꝗ [LATIN SMALL LETTER Q WITH STROKE THROUGH DESCENDER]
				fallthrough
			case '\uA759': // ꝙ [LATIN SMALL LETTER Q WITH DIAGONAL STROKE]
				fallthrough
			case '\uFF51': // q [FULLWIDTH LATIN SMALL LETTER Q]
				output[outputPos] = 'q'
				outputPos++

			case '\u24AC': // ⒬ [PARENTHESIZED LATIN SMALL LETTER Q]
				output = output[:(len(output) + 2)]
				output[outputPos] = '('
				outputPos++
				output[outputPos] = 'q'
				outputPos++
				output[outputPos] = ')'
				outputPos++

			case '\u0239': // ȹ [LATIN SMALL LETTER QP DIGRAPH]
				output = output[:(len(output) + 1)]
				output[outputPos] = 'q'
				outputPos++
				output[outputPos] = 'p'
				outputPos++

			case '\u0154': // Ŕ [LATIN CAPITAL LETTER R WITH ACUTE]
				fallthrough
			case '\u0156': // Ŗ [LATIN CAPITAL LETTER R WITH CEDILLA]
				fallthrough
			case '\u0158': // Ř [LATIN CAPITAL LETTER R WITH CARON]
				fallthrough
			case '\u0210': // Ȓ [LATIN CAPITAL LETTER R WITH DOUBLE GRAVE]
				fallthrough
			case '\u0212': // Ȓ [LATIN CAPITAL LETTER R WITH INVERTED BREVE]
				fallthrough
			case '\u024C': // Ɍ [LATIN CAPITAL LETTER R WITH STROKE]
				fallthrough
			case '\u0280': // ʀ [LATIN LETTER SMALL CAPITAL R]
				fallthrough
			case '\u0281': // ʁ [LATIN LETTER SMALL CAPITAL INVERTED R]
				fallthrough
			case '\u1D19': // ᴙ [LATIN LETTER SMALL CAPITAL REVERSED R]
				fallthrough
			case '\u1D1A': // ᴚ [LATIN LETTER SMALL CAPITAL TURNED R]
				fallthrough
			case '\u1E58': // Ṙ [LATIN CAPITAL LETTER R WITH DOT ABOVE]
				fallthrough
			case '\u1E5A': // Ṛ [LATIN CAPITAL LETTER R WITH DOT BELOW]
				fallthrough
			case '\u1E5C': // Ṝ [LATIN CAPITAL LETTER R WITH DOT BELOW AND MACRON]
				fallthrough
			case '\u1E5E': // Ṟ [LATIN CAPITAL LETTER R WITH LINE BELOW]
				fallthrough
			case '\u24C7': // Ⓡ [CIRCLED LATIN CAPITAL LETTER R]
				fallthrough
			case '\u2C64': // Ɽ [LATIN CAPITAL LETTER R WITH TAIL]
				fallthrough
			case '\uA75A': // Ꝛ [LATIN CAPITAL LETTER R ROTUNDA]
				fallthrough
			case '\uA782': // Ꞃ [LATIN CAPITAL LETTER INSULAR R]
				fallthrough
			case '\uFF32': // R [FULLWIDTH LATIN CAPITAL LETTER R]
				output[outputPos] = 'R'
				outputPos++

			case '\u0155': // ŕ [LATIN SMALL LETTER R WITH ACUTE]
				fallthrough
			case '\u0157': // ŗ [LATIN SMALL LETTER R WITH CEDILLA]
				fallthrough
			case '\u0159': // ř [LATIN SMALL LETTER R WITH CARON]
				fallthrough
			case '\u0211': // ȑ [LATIN SMALL LETTER R WITH DOUBLE GRAVE]
				fallthrough
			case '\u0213': // ȓ [LATIN SMALL LETTER R WITH INVERTED BREVE]
				fallthrough
			case '\u024D': // ɍ [LATIN SMALL LETTER R WITH STROKE]
				fallthrough
			case '\u027C': // ɼ [LATIN SMALL LETTER R WITH LONG LEG]
				fallthrough
			case '\u027D': // ɽ [LATIN SMALL LETTER R WITH TAIL]
				fallthrough
			case '\u027E': // ɾ [LATIN SMALL LETTER R WITH FISHHOOK]
				fallthrough
			case '\u027F': // ɿ [LATIN SMALL LETTER REVERSED R WITH FISHHOOK]
				fallthrough
			case '\u1D63': // ᵣ [LATIN SUBSCRIPT SMALL LETTER R]
				fallthrough
			case '\u1D72': // ᵲ [LATIN SMALL LETTER R WITH MIDDLE TILDE]
				fallthrough
			case '\u1D73': // ᵳ [LATIN SMALL LETTER R WITH FISHHOOK AND MIDDLE TILDE]
				fallthrough
			case '\u1D89': // ᶉ [LATIN SMALL LETTER R WITH PALATAL HOOK]
				fallthrough
			case '\u1E59': // ṙ [LATIN SMALL LETTER R WITH DOT ABOVE]
				fallthrough
			case '\u1E5B': // ṛ [LATIN SMALL LETTER R WITH DOT BELOW]
				fallthrough
			case '\u1E5D': // ṝ [LATIN SMALL LETTER R WITH DOT BELOW AND MACRON]
				fallthrough
			case '\u1E5F': // ṟ [LATIN SMALL LETTER R WITH LINE BELOW]
				fallthrough
			case '\u24E1': // ⓡ [CIRCLED LATIN SMALL LETTER R]
				fallthrough
			case '\uA75B': // ꝛ [LATIN SMALL LETTER R ROTUNDA]
				fallthrough
			case '\uA783': // ꞃ [LATIN SMALL LETTER INSULAR R]
				fallthrough
			case '\uFF52': // r [FULLWIDTH LATIN SMALL LETTER R]
				output[outputPos] = 'r'
				outputPos++

			case '\u24AD': // ⒭ [PARENTHESIZED LATIN SMALL LETTER R]
				output = output[:(len(output) + 2)]
				output[outputPos] = '('
				outputPos++
				output[outputPos] = 'r'
				outputPos++
				output[outputPos] = ')'
				outputPos++

			case '\u015A': // Ś [LATIN CAPITAL LETTER S WITH ACUTE]
				fallthrough
			case '\u015C': // Ŝ [LATIN CAPITAL LETTER S WITH CIRCUMFLEX]
				fallthrough
			case '\u015E': // Ş [LATIN CAPITAL LETTER S WITH CEDILLA]
				fallthrough
			case '\u0160': // Š [LATIN CAPITAL LETTER S WITH CARON]
				fallthrough
			case '\u0218': // Ș [LATIN CAPITAL LETTER S WITH COMMA BELOW]
				fallthrough
			case '\u1E60': // Ṡ [LATIN CAPITAL LETTER S WITH DOT ABOVE]
				fallthrough
			case '\u1E62': // Ṣ [LATIN CAPITAL LETTER S WITH DOT BELOW]
				fallthrough
			case '\u1E64': // Ṥ [LATIN CAPITAL LETTER S WITH ACUTE AND DOT ABOVE]
				fallthrough
			case '\u1E66': // Ṧ [LATIN CAPITAL LETTER S WITH CARON AND DOT ABOVE]
				fallthrough
			case '\u1E68': // Ṩ [LATIN CAPITAL LETTER S WITH DOT BELOW AND DOT ABOVE]
				fallthrough
			case '\u24C8': // Ⓢ [CIRCLED LATIN CAPITAL LETTER S]
				fallthrough
			case '\uA731': // ꜱ [LATIN LETTER SMALL CAPITAL S]
				fallthrough
			case '\uA785': // ꞅ [LATIN SMALL LETTER INSULAR S]
				fallthrough
			case '\uFF33': // S [FULLWIDTH LATIN CAPITAL LETTER S]
				output[outputPos] = 'S'
				outputPos++

			case '\u015B': // ś [LATIN SMALL LETTER S WITH ACUTE]
				fallthrough
			case '\u015D': // ŝ [LATIN SMALL LETTER S WITH CIRCUMFLEX]
				fallthrough
			case '\u015F': // ş [LATIN SMALL LETTER S WITH CEDILLA]
				fallthrough
			case '\u0161': // š [LATIN SMALL LETTER S WITH CARON]
				fallthrough
			case '\u017F': // ſ http://en.wikipedia.org/wiki/Long_S [LATIN SMALL LETTER LONG S]
				fallthrough
			case '\u0219': // ș [LATIN SMALL LETTER S WITH COMMA BELOW]
				fallthrough
			case '\u023F': // ȿ [LATIN SMALL LETTER S WITH SWASH TAIL]
				fallthrough
			case '\u0282': // ʂ [LATIN SMALL LETTER S WITH HOOK]
				fallthrough
			case '\u1D74': // ᵴ [LATIN SMALL LETTER S WITH MIDDLE TILDE]
				fallthrough
			case '\u1D8A': // ᶊ [LATIN SMALL LETTER S WITH PALATAL HOOK]
				fallthrough
			case '\u1E61': // ṡ [LATIN SMALL LETTER S WITH DOT ABOVE]
				fallthrough
			case '\u1E63': // ṣ [LATIN SMALL LETTER S WITH DOT BELOW]
				fallthrough
			case '\u1E65': // ṥ [LATIN SMALL LETTER S WITH ACUTE AND DOT ABOVE]
				fallthrough
			case '\u1E67': // ṧ [LATIN SMALL LETTER S WITH CARON AND DOT ABOVE]
				fallthrough
			case '\u1E69': // ṩ [LATIN SMALL LETTER S WITH DOT BELOW AND DOT ABOVE]
				fallthrough
			case '\u1E9C': // ẜ [LATIN SMALL LETTER LONG S WITH DIAGONAL STROKE]
				fallthrough
			case '\u1E9D': // ẝ [LATIN SMALL LETTER LONG S WITH HIGH STROKE]
				fallthrough
			case '\u24E2': // ⓢ [CIRCLED LATIN SMALL LETTER S]
				fallthrough
			case '\uA784': // Ꞅ [LATIN CAPITAL LETTER INSULAR S]
				fallthrough
			case '\uFF53': // s [FULLWIDTH LATIN SMALL LETTER S]
				output[outputPos] = 's'
				outputPos++

			case '\u1E9E': // ẞ [LATIN CAPITAL LETTER SHARP S]
				output = output[:(len(output) + 1)]
				output[outputPos] = 'S'
				outputPos++
				output[outputPos] = 'S'
				outputPos++

			case '\u24AE': // ⒮ [PARENTHESIZED LATIN SMALL LETTER S]
				output = output[:(len(output) + 2)]
				output[outputPos] = '('
				outputPos++
				output[outputPos] = 's'
				outputPos++
				output[outputPos] = ')'
				outputPos++

			case '\u00DF': // ß [LATIN SMALL LETTER SHARP S]
				output = output[:(len(output) + 1)]
				output[outputPos] = 's'
				outputPos++
				output[outputPos] = 's'
				outputPos++

			case '\uFB06': // st [LATIN SMALL LIGATURE ST]
				output = output[:(len(output) + 1)]
				output[outputPos] = 's'
				outputPos++
				output[outputPos] = 't'
				outputPos++

			case '\u0162': // Ţ [LATIN CAPITAL LETTER T WITH CEDILLA]
				fallthrough
			case '\u0164': // Ť [LATIN CAPITAL LETTER T WITH CARON]
				fallthrough
			case '\u0166': // Ŧ [LATIN CAPITAL LETTER T WITH STROKE]
				fallthrough
			case '\u01AC': // Ƭ [LATIN CAPITAL LETTER T WITH HOOK]
				fallthrough
			case '\u01AE': // Ʈ [LATIN CAPITAL LETTER T WITH RETROFLEX HOOK]
				fallthrough
			case '\u021A': // Ț [LATIN CAPITAL LETTER T WITH COMMA BELOW]
				fallthrough
			case '\u023E': // Ⱦ [LATIN CAPITAL LETTER T WITH DIAGONAL STROKE]
				fallthrough
			case '\u1D1B': // ᴛ [LATIN LETTER SMALL CAPITAL T]
				fallthrough
			case '\u1E6A': // Ṫ [LATIN CAPITAL LETTER T WITH DOT ABOVE]
				fallthrough
			case '\u1E6C': // Ṭ [LATIN CAPITAL LETTER T WITH DOT BELOW]
				fallthrough
			case '\u1E6E': // Ṯ [LATIN CAPITAL LETTER T WITH LINE BELOW]
				fallthrough
			case '\u1E70': // Ṱ [LATIN CAPITAL LETTER T WITH CIRCUMFLEX BELOW]
				fallthrough
			case '\u24C9': // Ⓣ [CIRCLED LATIN CAPITAL LETTER T]
				fallthrough
			case '\uA786': // Ꞇ [LATIN CAPITAL LETTER INSULAR T]
				fallthrough
			case '\uFF34': // T [FULLWIDTH LATIN CAPITAL LETTER T]
				output[outputPos] = 'T'
				outputPos++

			case '\u0163': // ţ [LATIN SMALL LETTER T WITH CEDILLA]
				fallthrough
			case '\u0165': // ť [LATIN SMALL LETTER T WITH CARON]
				fallthrough
			case '\u0167': // ŧ [LATIN SMALL LETTER T WITH STROKE]
				fallthrough
			case '\u01AB': // ƫ [LATIN SMALL LETTER T WITH PALATAL HOOK]
				fallthrough
			case '\u01AD': // ƭ [LATIN SMALL LETTER T WITH HOOK]
				fallthrough
			case '\u021B': // ț [LATIN SMALL LETTER T WITH COMMA BELOW]
				fallthrough
			case '\u0236': // ȶ [LATIN SMALL LETTER T WITH CURL]
				fallthrough
			case '\u0287': // ʇ [LATIN SMALL LETTER TURNED T]
				fallthrough
			case '\u0288': // ʈ [LATIN SMALL LETTER T WITH RETROFLEX HOOK]
				fallthrough
			case '\u1D75': // ᵵ [LATIN SMALL LETTER T WITH MIDDLE TILDE]
				fallthrough
			case '\u1E6B': // ṫ [LATIN SMALL LETTER T WITH DOT ABOVE]
				fallthrough
			case '\u1E6D': // ṭ [LATIN SMALL LETTER T WITH DOT BELOW]
				fallthrough
			case '\u1E6F': // ṯ [LATIN SMALL LETTER T WITH LINE BELOW]
				fallthrough
			case '\u1E71': // ṱ [LATIN SMALL LETTER T WITH CIRCUMFLEX BELOW]
				fallthrough
			case '\u1E97': // ẗ [LATIN SMALL LETTER T WITH DIAERESIS]
				fallthrough
			case '\u24E3': // ⓣ [CIRCLED LATIN SMALL LETTER T]
				fallthrough
			case '\u2C66': // ⱦ [LATIN SMALL LETTER T WITH DIAGONAL STROKE]
				fallthrough
			case '\uFF54': // t [FULLWIDTH LATIN SMALL LETTER T]
				output[outputPos] = 't'
				outputPos++

			case '\u00DE': // Þ [LATIN CAPITAL LETTER THORN]
				fallthrough
			case '\uA766': // Ꝧ [LATIN CAPITAL LETTER THORN WITH STROKE THROUGH DESCENDER]
				output = output[:(len(output) + 1)]
				output[outputPos] = 'T'
				outputPos++
				output[outputPos] = 'H'
				outputPos++

			case '\uA728': // Ꜩ [LATIN CAPITAL LETTER TZ]
				output = output[:(len(output) + 1)]
				output[outputPos] = 'T'
				outputPos++
				output[outputPos] = 'Z'
				outputPos++

			case '\u24AF': // ⒯ [PARENTHESIZED LATIN SMALL LETTER T]
				output = output[:(len(output) + 2)]
				output[outputPos] = '('
				outputPos++
				output[outputPos] = 't'
				outputPos++
				output[outputPos] = ')'
				outputPos++

			case '\u02A8': // ʨ [LATIN SMALL LETTER TC DIGRAPH WITH CURL]
				output = output[:(len(output) + 1)]
				output[outputPos] = 't'
				outputPos++
				output[outputPos] = 'c'
				outputPos++

			case '\u00FE': // þ [LATIN SMALL LETTER THORN]
				fallthrough
			case '\u1D7A': // ᵺ [LATIN SMALL LETTER TH WITH STRIKETHROUGH]
				fallthrough
			case '\uA767': // ꝧ [LATIN SMALL LETTER THORN WITH STROKE THROUGH DESCENDER]
				output = output[:(len(output) + 1)]
				output[outputPos] = 't'
				outputPos++
				output[outputPos] = 'h'
				outputPos++

			case '\u02A6': // ʦ [LATIN SMALL LETTER TS DIGRAPH]
				output = output[:(len(output) + 1)]
				output[outputPos] = 't'
				outputPos++
				output[outputPos] = 's'
				outputPos++

			case '\uA729': // ꜩ [LATIN SMALL LETTER TZ]
				output = output[:(len(output) + 1)]
				output[outputPos] = 't'
				outputPos++
				output[outputPos] = 'z'
				outputPos++

			case '\u00D9': // Ù [LATIN CAPITAL LETTER U WITH GRAVE]
				fallthrough
			case '\u00DA': // Ú [LATIN CAPITAL LETTER U WITH ACUTE]
				fallthrough
			case '\u00DB': // Û [LATIN CAPITAL LETTER U WITH CIRCUMFLEX]
				fallthrough
			case '\u00DC': // Ü [LATIN CAPITAL LETTER U WITH DIAERESIS]
				fallthrough
			case '\u0168': // Ũ [LATIN CAPITAL LETTER U WITH TILDE]
				fallthrough
			case '\u016A': // Ū [LATIN CAPITAL LETTER U WITH MACRON]
				fallthrough
			case '\u016C': // Ŭ [LATIN CAPITAL LETTER U WITH BREVE]
				fallthrough
			case '\u016E': // Ů [LATIN CAPITAL LETTER U WITH RING ABOVE]
				fallthrough
			case '\u0170': // Ű [LATIN CAPITAL LETTER U WITH DOUBLE ACUTE]
				fallthrough
			case '\u0172': // Ų [LATIN CAPITAL LETTER U WITH OGONEK]
				fallthrough
			case '\u01AF': // Ư [LATIN CAPITAL LETTER U WITH HORN]
				fallthrough
			case '\u01D3': // Ǔ [LATIN CAPITAL LETTER U WITH CARON]
				fallthrough
			case '\u01D5': // Ǖ [LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON]
				fallthrough
			case '\u01D7': // Ǘ [LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE]
				fallthrough
			case '\u01D9': // Ǚ [LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON]
				fallthrough
			case '\u01DB': // Ǜ [LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE]
				fallthrough
			case '\u0214': // Ȕ [LATIN CAPITAL LETTER U WITH DOUBLE GRAVE]
				fallthrough
			case '\u0216': // Ȗ [LATIN CAPITAL LETTER U WITH INVERTED BREVE]
				fallthrough
			case '\u0244': // Ʉ [LATIN CAPITAL LETTER U BAR]
				fallthrough
			case '\u1D1C': // ᴜ [LATIN LETTER SMALL CAPITAL U]
				fallthrough
			case '\u1D7E': // ᵾ [LATIN SMALL CAPITAL LETTER U WITH STROKE]
				fallthrough
			case '\u1E72': // Ṳ [LATIN CAPITAL LETTER U WITH DIAERESIS BELOW]
				fallthrough
			case '\u1E74': // Ṵ [LATIN CAPITAL LETTER U WITH TILDE BELOW]
				fallthrough
			case '\u1E76': // Ṷ [LATIN CAPITAL LETTER U WITH CIRCUMFLEX BELOW]
				fallthrough
			case '\u1E78': // Ṹ [LATIN CAPITAL LETTER U WITH TILDE AND ACUTE]
				fallthrough
			case '\u1E7A': // Ṻ [LATIN CAPITAL LETTER U WITH MACRON AND DIAERESIS]
				fallthrough
			case '\u1EE4': // Ụ [LATIN CAPITAL LETTER U WITH DOT BELOW]
				fallthrough
			case '\u1EE6': // Ủ [LATIN CAPITAL LETTER U WITH HOOK ABOVE]
				fallthrough
			case '\u1EE8': // Ứ [LATIN CAPITAL LETTER U WITH HORN AND ACUTE]
				fallthrough
			case '\u1EEA': // Ừ [LATIN CAPITAL LETTER U WITH HORN AND GRAVE]
				fallthrough
			case '\u1EEC': // Ử [LATIN CAPITAL LETTER U WITH HORN AND HOOK ABOVE]
				fallthrough
			case '\u1EEE': // Ữ [LATIN CAPITAL LETTER U WITH HORN AND TILDE]
				fallthrough
			case '\u1EF0': // Ự [LATIN CAPITAL LETTER U WITH HORN AND DOT BELOW]
				fallthrough
			case '\u24CA': // Ⓤ [CIRCLED LATIN CAPITAL LETTER U]
				fallthrough
			case '\uFF35': // U [FULLWIDTH LATIN CAPITAL LETTER U]
				output[outputPos] = 'U'
				outputPos++

			case '\u00F9': // ù [LATIN SMALL LETTER U WITH GRAVE]
				fallthrough
			case '\u00FA': // ú [LATIN SMALL LETTER U WITH ACUTE]
				fallthrough
			case '\u00FB': // û [LATIN SMALL LETTER U WITH CIRCUMFLEX]
				fallthrough
			case '\u00FC': // ü [LATIN SMALL LETTER U WITH DIAERESIS]
				fallthrough
			case '\u0169': // ũ [LATIN SMALL LETTER U WITH TILDE]
				fallthrough
			case '\u016B': // ū [LATIN SMALL LETTER U WITH MACRON]
				fallthrough
			case '\u016D': // ŭ [LATIN SMALL LETTER U WITH BREVE]
				fallthrough
			case '\u016F': // ů [LATIN SMALL LETTER U WITH RING ABOVE]
				fallthrough
			case '\u0171': // ű [LATIN SMALL LETTER U WITH DOUBLE ACUTE]
				fallthrough
			case '\u0173': // ų [LATIN SMALL LETTER U WITH OGONEK]
				fallthrough
			case '\u01B0': // ư [LATIN SMALL LETTER U WITH HORN]
				fallthrough
			case '\u01D4': // ǔ [LATIN SMALL LETTER U WITH CARON]
				fallthrough
			case '\u01D6': // ǖ [LATIN SMALL LETTER U WITH DIAERESIS AND MACRON]
				fallthrough
			case '\u01D8': // ǘ [LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE]
				fallthrough
			case '\u01DA': // ǚ [LATIN SMALL LETTER U WITH DIAERESIS AND CARON]
				fallthrough
			case '\u01DC': // ǜ [LATIN SMALL LETTER U WITH DIAERESIS AND GRAVE]
				fallthrough
			case '\u0215': // ȕ [LATIN SMALL LETTER U WITH DOUBLE GRAVE]
				fallthrough
			case '\u0217': // ȗ [LATIN SMALL LETTER U WITH INVERTED BREVE]
				fallthrough
			case '\u0289': // ʉ [LATIN SMALL LETTER U BAR]
				fallthrough
			case '\u1D64': // ᵤ [LATIN SUBSCRIPT SMALL LETTER U]
				fallthrough
			case '\u1D99': // ᶙ [LATIN SMALL LETTER U WITH RETROFLEX HOOK]
				fallthrough
			case '\u1E73': // ṳ [LATIN SMALL LETTER U WITH DIAERESIS BELOW]
				fallthrough
			case '\u1E75': // ṵ [LATIN SMALL LETTER U WITH TILDE BELOW]
				fallthrough
			case '\u1E77': // ṷ [LATIN SMALL LETTER U WITH CIRCUMFLEX BELOW]
				fallthrough
			case '\u1E79': // ṹ [LATIN SMALL LETTER U WITH TILDE AND ACUTE]
				fallthrough
			case '\u1E7B': // ṻ [LATIN SMALL LETTER U WITH MACRON AND DIAERESIS]
				fallthrough
			case '\u1EE5': // ụ [LATIN SMALL LETTER U WITH DOT BELOW]
				fallthrough
			case '\u1EE7': // ủ [LATIN SMALL LETTER U WITH HOOK ABOVE]
				fallthrough
			case '\u1EE9': // ứ [LATIN SMALL LETTER U WITH HORN AND ACUTE]
				fallthrough
			case '\u1EEB': // ừ [LATIN SMALL LETTER U WITH HORN AND GRAVE]
				fallthrough
			case '\u1EED': // ử [LATIN SMALL LETTER U WITH HORN AND HOOK ABOVE]
				fallthrough
			case '\u1EEF': // ữ [LATIN SMALL LETTER U WITH HORN AND TILDE]
				fallthrough
			case '\u1EF1': // ự [LATIN SMALL LETTER U WITH HORN AND DOT BELOW]
				fallthrough
			case '\u24E4': // ⓤ [CIRCLED LATIN SMALL LETTER U]
				fallthrough
			case '\uFF55': // u [FULLWIDTH LATIN SMALL LETTER U]
				output[outputPos] = 'u'
				outputPos++

			case '\u24B0': // ⒰ [PARENTHESIZED LATIN SMALL LETTER U]
				output = output[:(len(output) + 2)]
				output[outputPos] = '('
				outputPos++
				output[outputPos] = 'u'
				outputPos++
				output[outputPos] = ')'
				outputPos++

			case '\u1D6B': // ᵫ [LATIN SMALL LETTER UE]
				output = output[:(len(output) + 1)]
				output[outputPos] = 'u'
				outputPos++
				output[outputPos] = 'e'
				outputPos++

			case '\u01B2': // Ʋ [LATIN CAPITAL LETTER V WITH HOOK]
				fallthrough
			case '\u0245': // Ʌ [LATIN CAPITAL LETTER TURNED V]
				fallthrough
			case '\u1D20': // ᴠ [LATIN LETTER SMALL CAPITAL V]
				fallthrough
			case '\u1E7C': // Ṽ [LATIN CAPITAL LETTER V WITH TILDE]
				fallthrough
			case '\u1E7E': // Ṿ [LATIN CAPITAL LETTER V WITH DOT BELOW]
				fallthrough
			case '\u1EFC': // Ỽ [LATIN CAPITAL LETTER MIDDLE-WELSH V]
				fallthrough
			case '\u24CB': // Ⓥ [CIRCLED LATIN CAPITAL LETTER V]
				fallthrough
			case '\uA75E': // Ꝟ [LATIN CAPITAL LETTER V WITH DIAGONAL STROKE]
				fallthrough
			case '\uA768': // Ꝩ [LATIN CAPITAL LETTER VEND]
				fallthrough
			case '\uFF36': // V [FULLWIDTH LATIN CAPITAL LETTER V]
				output[outputPos] = 'V'
				outputPos++

			case '\u028B': // ʋ [LATIN SMALL LETTER V WITH HOOK]
				fallthrough
			case '\u028C': // ʌ [LATIN SMALL LETTER TURNED V]
				fallthrough
			case '\u1D65': // ᵥ [LATIN SUBSCRIPT SMALL LETTER V]
				fallthrough
			case '\u1D8C': // ᶌ [LATIN SMALL LETTER V WITH PALATAL HOOK]
				fallthrough
			case '\u1E7D': // ṽ [LATIN SMALL LETTER V WITH TILDE]
				fallthrough
			case '\u1E7F': // ṿ [LATIN SMALL LETTER V WITH DOT BELOW]
				fallthrough
			case '\u24E5': // ⓥ [CIRCLED LATIN SMALL LETTER V]
				fallthrough
			case '\u2C71': // ⱱ [LATIN SMALL LETTER V WITH RIGHT HOOK]
				fallthrough
			case '\u2C74': // ⱴ [LATIN SMALL LETTER V WITH CURL]
				fallthrough
			case '\uA75F': // ꝟ [LATIN SMALL LETTER V WITH DIAGONAL STROKE]
				fallthrough
			case '\uFF56': // v [FULLWIDTH LATIN SMALL LETTER V]
				output[outputPos] = 'v'
				outputPos++

			case '\uA760': // Ꝡ [LATIN CAPITAL LETTER VY]
				output = output[:(len(output) + 1)]
				output[outputPos] = 'V'
				outputPos++
				output[outputPos] = 'Y'
				outputPos++

			case '\u24B1': // ⒱ [PARENTHESIZED LATIN SMALL LETTER V]
				output = output[:(len(output) + 2)]
				output[outputPos] = '('
				outputPos++
				output[outputPos] = 'v'
				outputPos++
				output[outputPos] = ')'
				outputPos++

			case '\uA761': // ꝡ [LATIN SMALL LETTER VY]
				output = output[:(len(output) + 1)]
				output[outputPos] = 'v'
				outputPos++
				output[outputPos] = 'y'
				outputPos++

			case '\u0174': // Ŵ [LATIN CAPITAL LETTER W WITH CIRCUMFLEX]
				fallthrough
			case '\u01F7': // Ƿ http://en.wikipedia.org/wiki/Wynn [LATIN CAPITAL LETTER WYNN]
				fallthrough
			case '\u1D21': // ᴡ [LATIN LETTER SMALL CAPITAL W]
				fallthrough
			case '\u1E80': // Ẁ [LATIN CAPITAL LETTER W WITH GRAVE]
				fallthrough
			case '\u1E82': // Ẃ [LATIN CAPITAL LETTER W WITH ACUTE]
				fallthrough
			case '\u1E84': // Ẅ [LATIN CAPITAL LETTER W WITH DIAERESIS]
				fallthrough
			case '\u1E86': // Ẇ [LATIN CAPITAL LETTER W WITH DOT ABOVE]
				fallthrough
			case '\u1E88': // Ẉ [LATIN CAPITAL LETTER W WITH DOT BELOW]
				fallthrough
			case '\u24CC': // Ⓦ [CIRCLED LATIN CAPITAL LETTER W]
				fallthrough
			case '\u2C72': // Ⱳ [LATIN CAPITAL LETTER W WITH HOOK]
				fallthrough
			case '\uFF37': // W [FULLWIDTH LATIN CAPITAL LETTER W]
				output[outputPos] = 'W'
				outputPos++

			case '\u0175': // ŵ [LATIN SMALL LETTER W WITH CIRCUMFLEX]
				fallthrough
			case '\u01BF': // ƿ http://en.wikipedia.org/wiki/Wynn [LATIN LETTER WYNN]
				fallthrough
			case '\u028D': // ʍ [LATIN SMALL LETTER TURNED W]
				fallthrough
			case '\u1E81': // ẁ [LATIN SMALL LETTER W WITH GRAVE]
				fallthrough
			case '\u1E83': // ẃ [LATIN SMALL LETTER W WITH ACUTE]
				fallthrough
			case '\u1E85': // ẅ [LATIN SMALL LETTER W WITH DIAERESIS]
				fallthrough
			case '\u1E87': // ẇ [LATIN SMALL LETTER W WITH DOT ABOVE]
				fallthrough
			case '\u1E89': // ẉ [LATIN SMALL LETTER W WITH DOT BELOW]
				fallthrough
			case '\u1E98': // ẘ [LATIN SMALL LETTER W WITH RING ABOVE]
				fallthrough
			case '\u24E6': // ⓦ [CIRCLED LATIN SMALL LETTER W]
				fallthrough
			case '\u2C73': // ⱳ [LATIN SMALL LETTER W WITH HOOK]
				fallthrough
			case '\uFF57': // w [FULLWIDTH LATIN SMALL LETTER W]
				output[outputPos] = 'w'
				outputPos++

			case '\u24B2': // ⒲ [PARENTHESIZED LATIN SMALL LETTER W]
				output = output[:(len(output) + 2)]
				output[outputPos] = '('
				outputPos++
				output[outputPos] = 'w'
				outputPos++
				output[outputPos] = ')'
				outputPos++

			case '\u1E8A': // Ẋ [LATIN CAPITAL LETTER X WITH DOT ABOVE]
				fallthrough
			case '\u1E8C': // Ẍ [LATIN CAPITAL LETTER X WITH DIAERESIS]
				fallthrough
			case '\u24CD': // Ⓧ [CIRCLED LATIN CAPITAL LETTER X]
				fallthrough
			case '\uFF38': // X [FULLWIDTH LATIN CAPITAL LETTER X]
				output[outputPos] = 'X'
				outputPos++

			case '\u1D8D': // ᶍ [LATIN SMALL LETTER X WITH PALATAL HOOK]
				fallthrough
			case '\u1E8B': // ẋ [LATIN SMALL LETTER X WITH DOT ABOVE]
				fallthrough
			case '\u1E8D': // ẍ [LATIN SMALL LETTER X WITH DIAERESIS]
				fallthrough
			case '\u2093': // ₓ [LATIN SUBSCRIPT SMALL LETTER X]
				fallthrough
			case '\u24E7': // ⓧ [CIRCLED LATIN SMALL LETTER X]
				fallthrough
			case '\uFF58': // x [FULLWIDTH LATIN SMALL LETTER X]
				output[outputPos] = 'x'
				outputPos++

			case '\u24B3': // ⒳ [PARENTHESIZED LATIN SMALL LETTER X]
				output = output[:(len(output) + 2)]
				output[outputPos] = '('
				outputPos++
				output[outputPos] = 'x'
				outputPos++
				output[outputPos] = ')'
				outputPos++

			case '\u00DD': // Ý [LATIN CAPITAL LETTER Y WITH ACUTE]
				fallthrough
			case '\u0176': // Ŷ [LATIN CAPITAL LETTER Y WITH CIRCUMFLEX]
				fallthrough
			case '\u0178': // Ÿ [LATIN CAPITAL LETTER Y WITH DIAERESIS]
				fallthrough
			case '\u01B3': // Ƴ [LATIN CAPITAL LETTER Y WITH HOOK]
				fallthrough
			case '\u0232': // Ȳ [LATIN CAPITAL LETTER Y WITH MACRON]
				fallthrough
			case '\u024E': // Ɏ [LATIN CAPITAL LETTER Y WITH STROKE]
				fallthrough
			case '\u028F': // ʏ [LATIN LETTER SMALL CAPITAL Y]
				fallthrough
			case '\u1E8E': // Ẏ [LATIN CAPITAL LETTER Y WITH DOT ABOVE]
				fallthrough
			case '\u1EF2': // Ỳ [LATIN CAPITAL LETTER Y WITH GRAVE]
				fallthrough
			case '\u1EF4': // Ỵ [LATIN CAPITAL LETTER Y WITH DOT BELOW]
				fallthrough
			case '\u1EF6': // Ỷ [LATIN CAPITAL LETTER Y WITH HOOK ABOVE]
				fallthrough
			case '\u1EF8': // Ỹ [LATIN CAPITAL LETTER Y WITH TILDE]
				fallthrough
			case '\u1EFE': // Ỿ [LATIN CAPITAL LETTER Y WITH LOOP]
				fallthrough
			case '\u24CE': // Ⓨ [CIRCLED LATIN CAPITAL LETTER Y]
				fallthrough
			case '\uFF39': // Y [FULLWIDTH LATIN CAPITAL LETTER Y]
				output[outputPos] = 'Y'
				outputPos++

			case '\u00FD': // ý [LATIN SMALL LETTER Y WITH ACUTE]
				fallthrough
			case '\u00FF': // ÿ [LATIN SMALL LETTER Y WITH DIAERESIS]
				fallthrough
			case '\u0177': // ŷ [LATIN SMALL LETTER Y WITH CIRCUMFLEX]
				fallthrough
			case '\u01B4': // ƴ [LATIN SMALL LETTER Y WITH HOOK]
				fallthrough
			case '\u0233': // ȳ [LATIN SMALL LETTER Y WITH MACRON]
				fallthrough
			case '\u024F': // ɏ [LATIN SMALL LETTER Y WITH STROKE]
				fallthrough
			case '\u028E': // ʎ [LATIN SMALL LETTER TURNED Y]
				fallthrough
			case '\u1E8F': // ẏ [LATIN SMALL LETTER Y WITH DOT ABOVE]
				fallthrough
			case '\u1E99': // ẙ [LATIN SMALL LETTER Y WITH RING ABOVE]
				fallthrough
			case '\u1EF3': // ỳ [LATIN SMALL LETTER Y WITH GRAVE]
				fallthrough
			case '\u1EF5': // ỵ [LATIN SMALL LETTER Y WITH DOT BELOW]
				fallthrough
			case '\u1EF7': // ỷ [LATIN SMALL LETTER Y WITH HOOK ABOVE]
				fallthrough
			case '\u1EF9': // ỹ [LATIN SMALL LETTER Y WITH TILDE]
				fallthrough
			case '\u1EFF': // ỿ [LATIN SMALL LETTER Y WITH LOOP]
				fallthrough
			case '\u24E8': // ⓨ [CIRCLED LATIN SMALL LETTER Y]
				fallthrough
			case '\uFF59': // y [FULLWIDTH LATIN SMALL LETTER Y]
				output[outputPos] = 'y'
				outputPos++

			case '\u24B4': // ⒴ [PARENTHESIZED LATIN SMALL LETTER Y]
				output = output[:(len(output) + 2)]
				output[outputPos] = '('
				outputPos++
				output[outputPos] = 'y'
				outputPos++
				output[outputPos] = ')'
				outputPos++

			case '\u0179': // Ź [LATIN CAPITAL LETTER Z WITH ACUTE]
				fallthrough
			case '\u017B': // Ż [LATIN CAPITAL LETTER Z WITH DOT ABOVE]
				fallthrough
			case '\u017D': // Ž [LATIN CAPITAL LETTER Z WITH CARON]
				fallthrough
			case '\u01B5': // Ƶ [LATIN CAPITAL LETTER Z WITH STROKE]
				fallthrough
			case '\u021C': // Ȝ http://en.wikipedia.org/wiki/Yogh [LATIN CAPITAL LETTER YOGH]
				fallthrough
			case '\u0224': // Ȥ [LATIN CAPITAL LETTER Z WITH HOOK]
				fallthrough
			case '\u1D22': // ᴢ [LATIN LETTER SMALL CAPITAL Z]
				fallthrough
			case '\u1E90': // Ẑ [LATIN CAPITAL LETTER Z WITH CIRCUMFLEX]
				fallthrough
			case '\u1E92': // Ẓ [LATIN CAPITAL LETTER Z WITH DOT BELOW]
				fallthrough
			case '\u1E94': // Ẕ [LATIN CAPITAL LETTER Z WITH LINE BELOW]
				fallthrough
			case '\u24CF': // Ⓩ [CIRCLED LATIN CAPITAL LETTER Z]
				fallthrough
			case '\u2C6B': // Ⱬ [LATIN CAPITAL LETTER Z WITH DESCENDER]
				fallthrough
			case '\uA762': // Ꝣ [LATIN CAPITAL LETTER VISIGOTHIC Z]
				fallthrough
			case '\uFF3A': // Z [FULLWIDTH LATIN CAPITAL LETTER Z]
				output[outputPos] = 'Z'
				outputPos++

			case '\u017A': // ź [LATIN SMALL LETTER Z WITH ACUTE]
				fallthrough
			case '\u017C': // ż [LATIN SMALL LETTER Z WITH DOT ABOVE]
				fallthrough
			case '\u017E': // ž [LATIN SMALL LETTER Z WITH CARON]
				fallthrough
			case '\u01B6': // ƶ [LATIN SMALL LETTER Z WITH STROKE]
				fallthrough
			case '\u021D': // ȝ http://en.wikipedia.org/wiki/Yogh [LATIN SMALL LETTER YOGH]
				fallthrough
			case '\u0225': // ȥ [LATIN SMALL LETTER Z WITH HOOK]
				fallthrough
			case '\u0240': // ɀ [LATIN SMALL LETTER Z WITH SWASH TAIL]
				fallthrough
			case '\u0290': // ʐ [LATIN SMALL LETTER Z WITH RETROFLEX HOOK]
				fallthrough
			case '\u0291': // ʑ [LATIN SMALL LETTER Z WITH CURL]
				fallthrough
			case '\u1D76': // ᵶ [LATIN SMALL LETTER Z WITH MIDDLE TILDE]
				fallthrough
			case '\u1D8E': // ᶎ [LATIN SMALL LETTER Z WITH PALATAL HOOK]
				fallthrough
			case '\u1E91': // ẑ [LATIN SMALL LETTER Z WITH CIRCUMFLEX]
				fallthrough
			case '\u1E93': // ẓ [LATIN SMALL LETTER Z WITH DOT BELOW]
				fallthrough
			case '\u1E95': // ẕ [LATIN SMALL LETTER Z WITH LINE BELOW]
				fallthrough
			case '\u24E9': // ⓩ [CIRCLED LATIN SMALL LETTER Z]
				fallthrough
			case '\u2C6C': // ⱬ [LATIN SMALL LETTER Z WITH DESCENDER]
				fallthrough
			case '\uA763': // ꝣ [LATIN SMALL LETTER VISIGOTHIC Z]
				fallthrough
			case '\uFF5A': // z [FULLWIDTH LATIN SMALL LETTER Z]
				output[outputPos] = 'z'
				outputPos++

			case '\u24B5': // ⒵ [PARENTHESIZED LATIN SMALL LETTER Z]
				output = output[:(len(output) + 2)]
				output[outputPos] = '('
				outputPos++
				output[outputPos] = 'z'
				outputPos++
				output[outputPos] = ')'
				outputPos++

			case '\u2070': // ⁰ [SUPERSCRIPT ZERO]
				fallthrough
			case '\u2080': // ₀ [SUBSCRIPT ZERO]
				fallthrough
			case '\u24EA': // ⓪ [CIRCLED DIGIT ZERO]
				fallthrough
			case '\u24FF': // ⓿ [NEGATIVE CIRCLED DIGIT ZERO]
				fallthrough
			case '\uFF10': // 0 [FULLWIDTH DIGIT ZERO]
				output[outputPos] = '0'
				outputPos++

			case '\u00B9': // ¹ [SUPERSCRIPT ONE]
				fallthrough
			case '\u2081': // ₁ [SUBSCRIPT ONE]
				fallthrough
			case '\u2460': // ① [CIRCLED DIGIT ONE]
				fallthrough
			case '\u24F5': // ⓵ [DOUBLE CIRCLED DIGIT ONE]
				fallthrough
			case '\u2776': // ❶ [DINGBAT NEGATIVE CIRCLED DIGIT ONE]
				fallthrough
			case '\u2780': // ➀ [DINGBAT CIRCLED SANS-SERIF DIGIT ONE]
				fallthrough
			case '\u278A': // ➊ [DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT ONE]
				fallthrough
			case '\uFF11': // 1 [FULLWIDTH DIGIT ONE]
				output[outputPos] = '1'
				outputPos++

			case '\u2488': // ⒈ [DIGIT ONE FULL STOP]
				output = output[:(len(output) + 1)]
				output[outputPos] = '1'
				outputPos++
				output[outputPos] = '.'
				outputPos++

			case '\u2474': // ⑴ [PARENTHESIZED DIGIT ONE]
				output = output[:(len(output) + 2)]
				output[outputPos] = '('
				outputPos++
				output[outputPos] = '1'
				outputPos++
				output[outputPos] = ')'
				outputPos++

			case '\u00B2': // ² [SUPERSCRIPT TWO]
				fallthrough
			case '\u2082': // ₂ [SUBSCRIPT TWO]
				fallthrough
			case '\u2461': // ② [CIRCLED DIGIT TWO]
				fallthrough
			case '\u24F6': // ⓶ [DOUBLE CIRCLED DIGIT TWO]
				fallthrough
			case '\u2777': // ❷ [DINGBAT NEGATIVE CIRCLED DIGIT TWO]
				fallthrough
			case '\u2781': // ➁ [DINGBAT CIRCLED SANS-SERIF DIGIT TWO]
				fallthrough
			case '\u278B': // ➋ [DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT TWO]
				fallthrough
			case '\uFF12': // 2 [FULLWIDTH DIGIT TWO]
				output[outputPos] = '2'
				outputPos++

			case '\u2489': // ⒉ [DIGIT TWO FULL STOP]
				output = output[:(len(output) + 1)]
				output[outputPos] = '2'
				outputPos++
				output[outputPos] = '.'
				outputPos++

			case '\u2475': // ⑵ [PARENTHESIZED DIGIT TWO]
				output = output[:(len(output) + 2)]
				output[outputPos] = '('
				outputPos++
				output[outputPos] = '2'
				outputPos++
				output[outputPos] = ')'
				outputPos++

			case '\u00B3': // ³ [SUPERSCRIPT THREE]
				fallthrough
			case '\u2083': // ₃ [SUBSCRIPT THREE]
				fallthrough
			case '\u2462': // ③ [CIRCLED DIGIT THREE]
				fallthrough
			case '\u24F7': // ⓷ [DOUBLE CIRCLED DIGIT THREE]
				fallthrough
			case '\u2778': // ❸ [DINGBAT NEGATIVE CIRCLED DIGIT THREE]
				fallthrough
			case '\u2782': // ➂ [DINGBAT CIRCLED SANS-SERIF DIGIT THREE]
				fallthrough
			case '\u278C': // ➌ [DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT THREE]
				fallthrough
			case '\uFF13': // 3 [FULLWIDTH DIGIT THREE]
				output[outputPos] = '3'
				outputPos++

			case '\u248A': // ⒊ [DIGIT THREE FULL STOP]
				output = output[:(len(output) + 1)]
				output[outputPos] = '3'
				outputPos++
				output[outputPos] = '.'
				outputPos++

			case '\u2476': // ⑶ [PARENTHESIZED DIGIT THREE]
				output = output[:(len(output) + 2)]
				output[outputPos] = '('
				outputPos++
				output[outputPos] = '3'
				outputPos++
				output[outputPos] = ')'
				outputPos++

			case '\u2074': // ⁴ [SUPERSCRIPT FOUR]
				fallthrough
			case '\u2084': // ₄ [SUBSCRIPT FOUR]
				fallthrough
			case '\u2463': // ④ [CIRCLED DIGIT FOUR]
				fallthrough
			case '\u24F8': // ⓸ [DOUBLE CIRCLED DIGIT FOUR]
				fallthrough
			case '\u2779': // ❹ [DINGBAT NEGATIVE CIRCLED DIGIT FOUR]
				fallthrough
			case '\u2783': // ➃ [DINGBAT CIRCLED SANS-SERIF DIGIT FOUR]
				fallthrough
			case '\u278D': // ➍ [DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT FOUR]
				fallthrough
			case '\uFF14': // 4 [FULLWIDTH DIGIT FOUR]
				output[outputPos] = '4'
				outputPos++

			case '\u248B': // ⒋ [DIGIT FOUR FULL STOP]
				output = output[:(len(output) + 1)]
				output[outputPos] = '4'
				outputPos++
				output[outputPos] = '.'
				outputPos++

			case '\u2477': // ⑷ [PARENTHESIZED DIGIT FOUR]
				output = output[:(len(output) + 2)]
				output[outputPos] = '('
				outputPos++
				output[outputPos] = '4'
				outputPos++
				output[outputPos] = ')'
				outputPos++

			case '\u2075': // ⁵ [SUPERSCRIPT FIVE]
				fallthrough
			case '\u2085': // ₅ [SUBSCRIPT FIVE]
				fallthrough
			case '\u2464': // ⑤ [CIRCLED DIGIT FIVE]
				fallthrough
			case '\u24F9': // ⓹ [DOUBLE CIRCLED DIGIT FIVE]
				fallthrough
			case '\u277A': // ❺ [DINGBAT NEGATIVE CIRCLED DIGIT FIVE]
				fallthrough
			case '\u2784': // ➄ [DINGBAT CIRCLED SANS-SERIF DIGIT FIVE]
				fallthrough
			case '\u278E': // ➎ [DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT FIVE]
				fallthrough
			case '\uFF15': // 5 [FULLWIDTH DIGIT FIVE]
				output[outputPos] = '5'
				outputPos++

			case '\u248C': // ⒌ [DIGIT FIVE FULL STOP]
				output = output[:(len(output) + 1)]
				output[outputPos] = '5'
				outputPos++
				output[outputPos] = '.'
				outputPos++

			case '\u2478': // ⑸ [PARENTHESIZED DIGIT FIVE]
				output = output[:(len(output) + 2)]
				output[outputPos] = '('
				outputPos++
				output[outputPos] = '5'
				outputPos++
				output[outputPos] = ')'
				outputPos++

			case '\u2076': // ⁶ [SUPERSCRIPT SIX]
				fallthrough
			case '\u2086': // ₆ [SUBSCRIPT SIX]
				fallthrough
			case '\u2465': // ⑥ [CIRCLED DIGIT SIX]
				fallthrough
			case '\u24FA': // ⓺ [DOUBLE CIRCLED DIGIT SIX]
				fallthrough
			case '\u277B': // ❻ [DINGBAT NEGATIVE CIRCLED DIGIT SIX]
				fallthrough
			case '\u2785': // ➅ [DINGBAT CIRCLED SANS-SERIF DIGIT SIX]
				fallthrough
			case '\u278F': // ➏ [DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT SIX]
				fallthrough
			case '\uFF16': // 6 [FULLWIDTH DIGIT SIX]
				output[outputPos] = '6'
				outputPos++

			case '\u248D': // ⒍ [DIGIT SIX FULL STOP]
				output = output[:(len(output) + 1)]
				output[outputPos] = '6'
				outputPos++
				output[outputPos] = '.'
				outputPos++

			case '\u2479': // ⑹ [PARENTHESIZED DIGIT SIX]
				output = output[:(len(output) + 2)]
				output[outputPos] = '('
				outputPos++
				output[outputPos] = '6'
				outputPos++
				output[outputPos] = ')'
				outputPos++

			case '\u2077': // ⁷ [SUPERSCRIPT SEVEN]
				fallthrough
			case '\u2087': // ₇ [SUBSCRIPT SEVEN]
				fallthrough
			case '\u2466': // ⑦ [CIRCLED DIGIT SEVEN]
				fallthrough
			case '\u24FB': // ⓻ [DOUBLE CIRCLED DIGIT SEVEN]
				fallthrough
			case '\u277C': // ❼ [DINGBAT NEGATIVE CIRCLED DIGIT SEVEN]
				fallthrough
			case '\u2786': // ➆ [DINGBAT CIRCLED SANS-SERIF DIGIT SEVEN]
				fallthrough
			case '\u2790': // ➐ [DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT SEVEN]
				fallthrough
			case '\uFF17': // 7 [FULLWIDTH DIGIT SEVEN]
				output[outputPos] = '7'
				outputPos++

			case '\u248E': // ⒎ [DIGIT SEVEN FULL STOP]
				output = output[:(len(output) + 1)]
				output[outputPos] = '7'
				outputPos++
				output[outputPos] = '.'
				outputPos++

			case '\u247A': // ⑺ [PARENTHESIZED DIGIT SEVEN]
				output = output[:(len(output) + 2)]
				output[outputPos] = '('
				outputPos++
				output[outputPos] = '7'
				outputPos++
				output[outputPos] = ')'
				outputPos++

			case '\u2078': // ⁸ [SUPERSCRIPT EIGHT]
				fallthrough
			case '\u2088': // ₈ [SUBSCRIPT EIGHT]
				fallthrough
			case '\u2467': // ⑧ [CIRCLED DIGIT EIGHT]
				fallthrough
			case '\u24FC': // ⓼ [DOUBLE CIRCLED DIGIT EIGHT]
				fallthrough
			case '\u277D': // ❽ [DINGBAT NEGATIVE CIRCLED DIGIT EIGHT]
				fallthrough
			case '\u2787': // ➇ [DINGBAT CIRCLED SANS-SERIF DIGIT EIGHT]
				fallthrough
			case '\u2791': // ➑ [DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT EIGHT]
				fallthrough
			case '\uFF18': // 8 [FULLWIDTH DIGIT EIGHT]
				output[outputPos] = '8'
				outputPos++

			case '\u248F': // ⒏ [DIGIT EIGHT FULL STOP]
				output = output[:(len(output) + 1)]
				output[outputPos] = '8'
				outputPos++
				output[outputPos] = '.'
				outputPos++

			case '\u247B': // ⑻ [PARENTHESIZED DIGIT EIGHT]
				output = output[:(len(output) + 2)]
				output[outputPos] = '('
				outputPos++
				output[outputPos] = '8'
				outputPos++
				output[outputPos] = ')'
				outputPos++

			case '\u2079': // ⁹ [SUPERSCRIPT NINE]
				fallthrough
			case '\u2089': // ₉ [SUBSCRIPT NINE]
				fallthrough
			case '\u2468': // ⑨ [CIRCLED DIGIT NINE]
				fallthrough
			case '\u24FD': // ⓽ [DOUBLE CIRCLED DIGIT NINE]
				fallthrough
			case '\u277E': // ❾ [DINGBAT NEGATIVE CIRCLED DIGIT NINE]
				fallthrough
			case '\u2788': // ➈ [DINGBAT CIRCLED SANS-SERIF DIGIT NINE]
				fallthrough
			case '\u2792': // ➒ [DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT NINE]
				fallthrough
			case '\uFF19': // 9 [FULLWIDTH DIGIT NINE]
				output[outputPos] = '9'
				outputPos++

			case '\u2490': // ⒐ [DIGIT NINE FULL STOP]
				output = output[:(len(output) + 1)]
				output[outputPos] = '9'
				outputPos++
				output[outputPos] = '.'
				outputPos++

			case '\u247C': // ⑼ [PARENTHESIZED DIGIT NINE]
				output = output[:(len(output) + 2)]
				output[outputPos] = '('
				outputPos++
				output[outputPos] = '9'
				outputPos++
				output[outputPos] = ')'
				outputPos++

			case '\u2469': // ⑩ [CIRCLED NUMBER TEN]
				fallthrough
			case '\u24FE': // ⓾ [DOUBLE CIRCLED NUMBER TEN]
				fallthrough
			case '\u277F': // ❿ [DINGBAT NEGATIVE CIRCLED NUMBER TEN]
				fallthrough
			case '\u2789': // ➉ [DINGBAT CIRCLED SANS-SERIF NUMBER TEN]
				fallthrough
			case '\u2793': // ➓ [DINGBAT NEGATIVE CIRCLED SANS-SERIF NUMBER TEN]
				output = output[:(len(output) + 1)]
				output[outputPos] = '1'
				outputPos++
				output[outputPos] = '0'
				outputPos++

			case '\u2491': // ⒑ [NUMBER TEN FULL STOP]
				output = output[:(len(output) + 2)]
				output[outputPos] = '1'
				outputPos++
				output[outputPos] = '0'
				outputPos++
				output[outputPos] = '.'
				outputPos++

			case '\u247D': // ⑽ [PARENTHESIZED NUMBER TEN]
				output = output[:(len(output) + 3)]
				output[outputPos] = '('
				outputPos++
				output[outputPos] = '1'
				outputPos++
				output[outputPos] = '0'
				outputPos++
				output[outputPos] = ')'
				outputPos++

			case '\u246A': // ⑪ [CIRCLED NUMBER ELEVEN]
				fallthrough
			case '\u24EB': // ⓫ [NEGATIVE CIRCLED NUMBER ELEVEN]
				output = output[:(len(output) + 1)]
				output[outputPos] = '1'
				outputPos++
				output[outputPos] = '1'
				outputPos++

			case '\u2492': // ⒒ [NUMBER ELEVEN FULL STOP]
				output = output[:(len(output) + 2)]
				output[outputPos] = '1'
				outputPos++
				output[outputPos] = '1'
				outputPos++
				output[outputPos] = '.'
				outputPos++

			case '\u247E': // ⑾ [PARENTHESIZED NUMBER ELEVEN]
				output = output[:(len(output) + 3)]
				output[outputPos] = '('
				outputPos++
				output[outputPos] = '1'
				outputPos++
				output[outputPos] = '1'
				outputPos++
				output[outputPos] = ')'
				outputPos++

			case '\u246B': // ⑫ [CIRCLED NUMBER TWELVE]
				fallthrough
			case '\u24EC': // ⓬ [NEGATIVE CIRCLED NUMBER TWELVE]
				output = output[:(len(output) + 1)]
				output[outputPos] = '1'
				outputPos++
				output[outputPos] = '2'
				outputPos++

			case '\u2493': // ⒓ [NUMBER TWELVE FULL STOP]
				output = output[:(len(output) + 2)]
				output[outputPos] = '1'
				outputPos++
				output[outputPos] = '2'
				outputPos++
				output[outputPos] = '.'
				outputPos++

			case '\u247F': // ⑿ [PARENTHESIZED NUMBER TWELVE]
				output = output[:(len(output) + 3)]
				output[outputPos] = '('
				outputPos++
				output[outputPos] = '1'
				outputPos++
				output[outputPos] = '2'
				outputPos++
				output[outputPos] = ')'
				outputPos++

			case '\u246C': // ⑬ [CIRCLED NUMBER THIRTEEN]
				fallthrough
			case '\u24ED': // ⓭ [NEGATIVE CIRCLED NUMBER THIRTEEN]
				output = output[:(len(output) + 1)]
				output[outputPos] = '1'
				outputPos++
				output[outputPos] = '3'
				outputPos++

			case '\u2494': // ⒔ [NUMBER THIRTEEN FULL STOP]
				output = output[:(len(output) + 2)]
				output[outputPos] = '1'
				outputPos++
				output[outputPos] = '3'
				outputPos++
				output[outputPos] = '.'
				outputPos++

			case '\u2480': // ⒀ [PARENTHESIZED NUMBER THIRTEEN]
				output = output[:(len(output) + 3)]
				output[outputPos] = '('
				outputPos++
				output[outputPos] = '1'
				outputPos++
				output[outputPos] = '3'
				outputPos++
				output[outputPos] = ')'
				outputPos++

			case '\u246D': // ⑭ [CIRCLED NUMBER FOURTEEN]
				fallthrough
			case '\u24EE': // ⓮ [NEGATIVE CIRCLED NUMBER FOURTEEN]
				output = output[:(len(output) + 1)]
				output[outputPos] = '1'
				outputPos++
				output[outputPos] = '4'
				outputPos++

			case '\u2495': // ⒕ [NUMBER FOURTEEN FULL STOP]
				output = output[:(len(output) + 2)]
				output[outputPos] = '1'
				outputPos++
				output[outputPos] = '4'
				outputPos++
				output[outputPos] = '.'
				outputPos++

			case '\u2481': // ⒁ [PARENTHESIZED NUMBER FOURTEEN]
				output = output[:(len(output) + 3)]
				output[outputPos] = '('
				outputPos++
				output[outputPos] = '1'
				outputPos++
				output[outputPos] = '4'
				outputPos++
				output[outputPos] = ')'
				outputPos++

			case '\u246E': // ⑮ [CIRCLED NUMBER FIFTEEN]
				fallthrough
			case '\u24EF': // ⓯ [NEGATIVE CIRCLED NUMBER FIFTEEN]
				output = output[:(len(output) + 1)]
				output[outputPos] = '1'
				outputPos++
				output[outputPos] = '5'
				outputPos++

			case '\u2496': // ⒖ [NUMBER FIFTEEN FULL STOP]
				output = output[:(len(output) + 2)]
				output[outputPos] = '1'
				outputPos++
				output[outputPos] = '5'
				outputPos++
				output[outputPos] = '.'
				outputPos++

			case '\u2482': // ⒂ [PARENTHESIZED NUMBER FIFTEEN]
				output = output[:(len(output) + 3)]
				output[outputPos] = '('
				outputPos++
				output[outputPos] = '1'
				outputPos++
				output[outputPos] = '5'
				outputPos++
				output[outputPos] = ')'
				outputPos++

			case '\u246F': // ⑯ [CIRCLED NUMBER SIXTEEN]
				fallthrough
			case '\u24F0': // ⓰ [NEGATIVE CIRCLED NUMBER SIXTEEN]
				output = output[:(len(output) + 1)]
				output[outputPos] = '1'
				outputPos++
				output[outputPos] = '6'
				outputPos++

			case '\u2497': // ⒗ [NUMBER SIXTEEN FULL STOP]
				output = output[:(len(output) + 2)]
				output[outputPos] = '1'
				outputPos++
				output[outputPos] = '6'
				outputPos++
				output[outputPos] = '.'
				outputPos++

			case '\u2483': // ⒃ [PARENTHESIZED NUMBER SIXTEEN]
				output = output[:(len(output) + 3)]
				output[outputPos] = '('
				outputPos++
				output[outputPos] = '1'
				outputPos++
				output[outputPos] = '6'
				outputPos++
				output[outputPos] = ')'
				outputPos++

			case '\u2470': // ⑰ [CIRCLED NUMBER SEVENTEEN]
				fallthrough
			case '\u24F1': // ⓱ [NEGATIVE CIRCLED NUMBER SEVENTEEN]
				output = output[:(len(output) + 1)]
				output[outputPos] = '1'
				outputPos++
				output[outputPos] = '7'
				outputPos++

			case '\u2498': // ⒘ [NUMBER SEVENTEEN FULL STOP]
				output = output[:(len(output) + 2)]
				output[outputPos] = '1'
				outputPos++
				output[outputPos] = '7'
				outputPos++
				output[outputPos] = '.'
				outputPos++

			case '\u2484': // ⒄ [PARENTHESIZED NUMBER SEVENTEEN]
				output = output[:(len(output) + 3)]
				output[outputPos] = '('
				outputPos++
				output[outputPos] = '1'
				outputPos++
				output[outputPos] = '7'
				outputPos++
				output[outputPos] = ')'
				outputPos++

			case '\u2471': // ⑱ [CIRCLED NUMBER EIGHTEEN]
				fallthrough
			case '\u24F2': // ⓲ [NEGATIVE CIRCLED NUMBER EIGHTEEN]
				output = output[:(len(output) + 1)]
				output[outputPos] = '1'
				outputPos++
				output[outputPos] = '8'
				outputPos++

			case '\u2499': // ⒙ [NUMBER EIGHTEEN FULL STOP]
				output = output[:(len(output) + 2)]
				output[outputPos] = '1'
				outputPos++
				output[outputPos] = '8'
				outputPos++
				output[outputPos] = '.'
				outputPos++

			case '\u2485': // ⒅ [PARENTHESIZED NUMBER EIGHTEEN]
				output = output[:(len(output) + 3)]
				output[outputPos] = '('
				outputPos++
				output[outputPos] = '1'
				outputPos++
				output[outputPos] = '8'
				outputPos++
				output[outputPos] = ')'
				outputPos++

			case '\u2472': // ⑲ [CIRCLED NUMBER NINETEEN]
				fallthrough
			case '\u24F3': // ⓳ [NEGATIVE CIRCLED NUMBER NINETEEN]
				output = output[:(len(output) + 1)]
				output[outputPos] = '1'
				outputPos++
				output[outputPos] = '9'
				outputPos++

			case '\u249A': // ⒚ [NUMBER NINETEEN FULL STOP]
				output = output[:(len(output) + 2)]
				output[outputPos] = '1'
				outputPos++
				output[outputPos] = '9'
				outputPos++
				output[outputPos] = '.'
				outputPos++

			case '\u2486': // ⒆ [PARENTHESIZED NUMBER NINETEEN]
				output = output[:(len(output) + 3)]
				output[outputPos] = '('
				outputPos++
				output[outputPos] = '1'
				outputPos++
				output[outputPos] = '9'
				outputPos++
				output[outputPos] = ')'
				outputPos++

			case '\u2473': // ⑳ [CIRCLED NUMBER TWENTY]
				fallthrough
			case '\u24F4': // ⓴ [NEGATIVE CIRCLED NUMBER TWENTY]
				output = output[:(len(output) + 1)]
				output[outputPos] = '2'
				outputPos++
				output[outputPos] = '0'
				outputPos++

			case '\u249B': // ⒛ [NUMBER TWENTY FULL STOP]
				output = output[:(len(output) + 2)]
				output[outputPos] = '2'
				outputPos++
				output[outputPos] = '0'
				outputPos++
				output[outputPos] = '.'
				outputPos++

			case '\u2487': // ⒇ [PARENTHESIZED NUMBER TWENTY]
				output = output[:(len(output) + 3)]
				output[outputPos] = '('
				outputPos++
				output[outputPos] = '2'
				outputPos++
				output[outputPos] = '0'
				outputPos++
				output[outputPos] = ')'
				outputPos++

			case '\u00AB': // « [LEFT-POINTING DOUBLE ANGLE QUOTATION MARK]
				fallthrough
			case '\u00BB': // » [RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK]
				fallthrough
			case '\u201C': // “ [LEFT DOUBLE QUOTATION MARK]
				fallthrough
			case '\u201D': // ” [RIGHT DOUBLE QUOTATION MARK]
				fallthrough
			case '\u201E': // „ [DOUBLE LOW-9 QUOTATION MARK]
				fallthrough
			case '\u2033': // ″ [DOUBLE PRIME]
				fallthrough
			case '\u2036': // ‶ [REVERSED DOUBLE PRIME]
				fallthrough
			case '\u275D': // ❝ [HEAVY DOUBLE TURNED COMMA QUOTATION MARK ORNAMENT]
				fallthrough
			case '\u275E': // ❞ [HEAVY DOUBLE COMMA QUOTATION MARK ORNAMENT]
				fallthrough
			case '\u276E': // ❮ [HEAVY LEFT-POINTING ANGLE QUOTATION MARK ORNAMENT]
				fallthrough
			case '\u276F': // ❯ [HEAVY RIGHT-POINTING ANGLE QUOTATION MARK ORNAMENT]
				fallthrough
			case '\uFF02': // " [FULLWIDTH QUOTATION MARK]
				output[outputPos] = '"'
				outputPos++

			case '\u2018': // ‘ [LEFT SINGLE QUOTATION MARK]
				fallthrough
			case '\u2019': // ’ [RIGHT SINGLE QUOTATION MARK]
				fallthrough
			case '\u201A': // ‚ [SINGLE LOW-9 QUOTATION MARK]
				fallthrough
			case '\u201B': // ‛ [SINGLE HIGH-REVERSED-9 QUOTATION MARK]
				fallthrough
			case '\u2032': // ′ [PRIME]
				fallthrough
			case '\u2035': // ‵ [REVERSED PRIME]
				fallthrough
			case '\u2039': // ‹ [SINGLE LEFT-POINTING ANGLE QUOTATION MARK]
				fallthrough
			case '\u203A': // › [SINGLE RIGHT-POINTING ANGLE QUOTATION MARK]
				fallthrough
			case '\u275B': // ❛ [HEAVY SINGLE TURNED COMMA QUOTATION MARK ORNAMENT]
				fallthrough
			case '\u275C': // ❜ [HEAVY SINGLE COMMA QUOTATION MARK ORNAMENT]
				fallthrough
			case '\uFF07': // ' [FULLWIDTH APOSTROPHE]
				output[outputPos] = '\''
				outputPos++

			case '\u2010': // ‐ [HYPHEN]
				fallthrough
			case '\u2011': // ‑ [NON-BREAKING HYPHEN]
				fallthrough
			case '\u2012': // ‒ [FIGURE DASH]
				fallthrough
			case '\u2013': // – [EN DASH]
				fallthrough
			case '\u2014': // — [EM DASH]
				fallthrough
			case '\u207B': // ⁻ [SUPERSCRIPT MINUS]
				fallthrough
			case '\u208B': // ₋ [SUBSCRIPT MINUS]
				fallthrough
			case '\uFF0D': // - [FULLWIDTH HYPHEN-MINUS]
				output[outputPos] = '-'
				outputPos++

			case '\u2045': // ⁅ [LEFT SQUARE BRACKET WITH QUILL]
				fallthrough
			case '\u2772': // ❲ [LIGHT LEFT TORTOISE SHELL BRACKET ORNAMENT]
				fallthrough
			case '\uFF3B': // [ [FULLWIDTH LEFT SQUARE BRACKET]
				output[outputPos] = '['
				outputPos++

			case '\u2046': // ⁆ [RIGHT SQUARE BRACKET WITH QUILL]
				fallthrough
			case '\u2773': // ❳ [LIGHT RIGHT TORTOISE SHELL BRACKET ORNAMENT]
				fallthrough
			case '\uFF3D': // ] [FULLWIDTH RIGHT SQUARE BRACKET]
				output[outputPos] = ']'
				outputPos++

			case '\u207D': // ⁽ [SUPERSCRIPT LEFT PARENTHESIS]
				fallthrough
			case '\u208D': // ₍ [SUBSCRIPT LEFT PARENTHESIS]
				fallthrough
			case '\u2768': // ❨ [MEDIUM LEFT PARENTHESIS ORNAMENT]
				fallthrough
			case '\u276A': // ❪ [MEDIUM FLATTENED LEFT PARENTHESIS ORNAMENT]
				fallthrough
			case '\uFF08': // ( [FULLWIDTH LEFT PARENTHESIS]
				output[outputPos] = '('
				outputPos++

			case '\u2E28': // ⸨ [LEFT DOUBLE PARENTHESIS]
				output = output[:(len(output) + 1)]
				output[outputPos] = '('
				outputPos++
				output[outputPos] = '('
				outputPos++

			case '\u207E': // ⁾ [SUPERSCRIPT RIGHT PARENTHESIS]
				fallthrough
			case '\u208E': // ₎ [SUBSCRIPT RIGHT PARENTHESIS]
				fallthrough
			case '\u2769': // ❩ [MEDIUM RIGHT PARENTHESIS ORNAMENT]
				fallthrough
			case '\u276B': // ❫ [MEDIUM FLATTENED RIGHT PARENTHESIS ORNAMENT]
				fallthrough
			case '\uFF09': // ) [FULLWIDTH RIGHT PARENTHESIS]
				output[outputPos] = ')'
				outputPos++

			case '\u2E29': // ⸩ [RIGHT DOUBLE PARENTHESIS]
				output = output[:(len(output) + 1)]
				output[outputPos] = ')'
				outputPos++
				output[outputPos] = ')'
				outputPos++

			case '\u276C': // ❬ [MEDIUM LEFT-POINTING ANGLE BRACKET ORNAMENT]
				fallthrough
			case '\u2770': // ❰ [HEAVY LEFT-POINTING ANGLE BRACKET ORNAMENT]
				fallthrough
			case '\uFF1C': // < [FULLWIDTH LESS-THAN SIGN]
				output[outputPos] = '<'
				outputPos++

			case '\u276D': // ❭ [MEDIUM RIGHT-POINTING ANGLE BRACKET ORNAMENT]
				fallthrough
			case '\u2771': // ❱ [HEAVY RIGHT-POINTING ANGLE BRACKET ORNAMENT]
				fallthrough
			case '\uFF1E': // > [FULLWIDTH GREATER-THAN SIGN]
				output[outputPos] = '>'
				outputPos++

			case '\u2774': // ❴ [MEDIUM LEFT CURLY BRACKET ORNAMENT]
				fallthrough
			case '\uFF5B': // { [FULLWIDTH LEFT CURLY BRACKET]
				output[outputPos] = '{'
				outputPos++

			case '\u2775': // ❵ [MEDIUM RIGHT CURLY BRACKET ORNAMENT]
				fallthrough
			case '\uFF5D': // } [FULLWIDTH RIGHT CURLY BRACKET]
				output[outputPos] = '}'
				outputPos++

			case '\u207A': // ⁺ [SUPERSCRIPT PLUS SIGN]
				fallthrough
			case '\u208A': // ₊ [SUBSCRIPT PLUS SIGN]
				fallthrough
			case '\uFF0B': // + [FULLWIDTH PLUS SIGN]
				output[outputPos] = '+'
				outputPos++

			case '\u207C': // ⁼ [SUPERSCRIPT EQUALS SIGN]
				fallthrough
			case '\u208C': // ₌ [SUBSCRIPT EQUALS SIGN]
				fallthrough
			case '\uFF1D': // = [FULLWIDTH EQUALS SIGN]
				output[outputPos] = '='
				outputPos++

			case '\uFF01': // ! [FULLWIDTH EXCLAMATION MARK]
				output[outputPos] = '!'
				outputPos++

			case '\u203C': // ‼ [DOUBLE EXCLAMATION MARK]
				output = output[:(len(output) + 1)]
				output[outputPos] = '!'
				outputPos++
				output[outputPos] = '!'
				outputPos++

			case '\u2049': // ⁉ [EXCLAMATION QUESTION MARK]
				output = output[:(len(output) + 1)]
				output[outputPos] = '!'
				outputPos++
				output[outputPos] = '?'
				outputPos++

			case '\uFF03': // # [FULLWIDTH NUMBER SIGN]
				output[outputPos] = '#'
				outputPos++

			case '\uFF04': // $ [FULLWIDTH DOLLAR SIGN]
				output[outputPos] = '$'
				outputPos++

			case '\u2052': // ⁒ [COMMERCIAL MINUS SIGN]
				fallthrough
			case '\uFF05': // % [FULLWIDTH PERCENT SIGN]
				output[outputPos] = '%'
				outputPos++

			case '\uFF06': // & [FULLWIDTH AMPERSAND]
				output[outputPos] = '&'
				outputPos++

			case '\u204E': // ⁎ [LOW ASTERISK]
				fallthrough
			case '\uFF0A': // * [FULLWIDTH ASTERISK]
				output[outputPos] = '*'
				outputPos++

			case '\uFF0C': // , [FULLWIDTH COMMA]
				output[outputPos] = ','
				outputPos++

			case '\uFF0E': // . [FULLWIDTH FULL STOP]
				output[outputPos] = '.'
				outputPos++

			case '\u2044': // ⁄ [FRACTION SLASH]
				fallthrough
			case '\uFF0F': // / [FULLWIDTH SOLIDUS]
				output[outputPos] = '/'
				outputPos++

			case '\uFF1A': // : [FULLWIDTH COLON]
				output[outputPos] = ':'
				outputPos++

			case '\u204F': // ⁏ [REVERSED SEMICOLON]
				fallthrough
			case '\uFF1B': // ; [FULLWIDTH SEMICOLON]
				output[outputPos] = ';'
				outputPos++

			case '\uFF1F': // ? [FULLWIDTH QUESTION MARK]
				output[outputPos] = '?'
				outputPos++

			case '\u2047': // ⁇ [DOUBLE QUESTION MARK]
				output = output[:(len(output) + 1)]
				output[outputPos] = '?'
				outputPos++
				output[outputPos] = '?'
				outputPos++

			case '\u2048': // ⁈ [QUESTION EXCLAMATION MARK]
				output = output[:(len(output) + 1)]
				output[outputPos] = '?'
				outputPos++
				output[outputPos] = '!'
				outputPos++

			case '\uFF20': // @ [FULLWIDTH COMMERCIAL AT]
				output[outputPos] = '@'
				outputPos++

			case '\uFF3C': // \ [FULLWIDTH REVERSE SOLIDUS]
				output[outputPos] = '\\'
				outputPos++

			case '\u2038': // ‸ [CARET]
				fallthrough
			case '\uFF3E': // ^ [FULLWIDTH CIRCUMFLEX ACCENT]
				output[outputPos] = '^'
				outputPos++

			case '\uFF3F': // _ [FULLWIDTH LOW LINE]
				output[outputPos] = '_'
				outputPos++

			case '\u2053': // ⁓ [SWUNG DASH]
				fallthrough
			case '\uFF5E': // ~ [FULLWIDTH TILDE]
				output[outputPos] = '~'
				outputPos++

			default:
				output[outputPos] = c
				outputPos++
			}
		}
	}
	return output
}


================================================
FILE: analysis/char/asciifolding/asciifolding_test.go
================================================
//  Copyright (c) 2018 Couchbase, Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// 		http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package asciifolding

import (
	"fmt"
	"reflect"
	"testing"
)

func TestAsciiFoldingFilter(t *testing.T) {
	tests := []struct {
		input  []byte
		output []byte
	}{
		{
			// empty input passes
			input:  []byte(``),
			output: []byte(``),
		},
		{
			// no modification for plain ASCII
			input:  []byte(`The quick brown fox jumps over the lazy dog`),
			output: []byte(`The quick brown fox jumps over the lazy dog`),
		},
		{
			// Umlauts are folded to plain ASCII
			input:  []byte(`The quick bröwn fox jümps over the läzy dog`),
			output: []byte(`The quick brown fox jumps over the lazy dog`),
		},
		{
			// composite unicode runes are folded to more than one ASCII rune
			input:  []byte(`ÆꜴ`),
			output: []byte(`AEAO`),
		},
		{
			// apples from https://issues.couchbase.com/browse/MB-33486
			input:  []byte(`Ápple Àpple Äpple Âpple Ãpple Åpple`),
			output: []byte(`Apple Apple Apple Apple Apple Apple`),
		},
		{
			// Fix ASCII folding of \u24A2
			input:  []byte(`⒢`),
			output: []byte(`(g)`),
		},
		{
			// Test folding of \u2053 (SWUNG DASH)
			input:  []byte(`a⁓b`),
			output: []byte(`a~b`),
		},
		{
			// Test folding of \uFF5E (FULLWIDTH TILDE)
			input:  []byte(`c~d`),
			output: []byte(`c~d`),
		},
		{
			// Test folding of \uFF3F (FULLWIDTH LOW LINE) - case before tilde
			input:  []byte(`e_f`),
			output: []byte(`e_f`),
		},
		{
			// Test mix including tilde and default fallthrough (using a character not explicitly folded)
			input:  []byte(`a⁓b✅c~d`),
			output: []byte(`a~b✅c~d`),
		},
		{
			// Test start of 'A' fallthrough block
			input:  []byte(`ÀBC`),
			output: []byte(`ABC`),
		},
		{
			// Test end of 'A' fallthrough block
			input:  []byte(`DEFẶ`),
			output: []byte(`DEFA`),
		},
		{
			// Test start of 'AE' fallthrough block
			input:  []byte(`Æ`),
			output: []byte(`AE`),
		},
		{
			// Test end of 'AE' fallthrough block
			input:  []byte(`ᴁ`),
			output: []byte(`AE`),
		},
		{
			// Test 'DZ' multi-rune output
			input:  []byte(`DŽebra`),
			output: []byte(`DZebra`),
		},
		{
			// Test start of 'a' fallthrough block
			input:  []byte(`àbc`),
			output: []byte(`abc`),
		},
		{
			// Test end of 'a' fallthrough block
			input:  []byte(`defa`),
			output: []byte(`defa`),
		},
	}

	for _, test := range tests {
		filter := New()
		t.Run(fmt.Sprintf("on %s", test.input), func(t *testing.T) {
			output := filter.Filter(test.input)
			if !reflect.DeepEqual(output, test.output) {
				t.Errorf("\nExpected:\n`%s`\ngot:\n`%s`\n", string(test.output), string(output))
			}
		})
	}
}


================================================
FILE: analysis/char/html/html.go
================================================
//  Copyright (c) 2014 Couchbase, Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// 		http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package html

import (
	"bytes"
	"regexp"

	"github.com/blevesearch/bleve/v2/analysis"
	"github.com/blevesearch/bleve/v2/registry"
)

const Name = "html"

var htmlCharFilterRegexp = regexp.MustCompile(`</?[!\w]+((\s+\w+(\s*=\s*(?:".*?"|'.*?'|[^'">\s]+))?)+\s*|\s*)/?>`)

type CharFilter struct {
	r           *regexp.Regexp
	replacement []byte
}

func New() *CharFilter {
	return &CharFilter{
		r:           htmlCharFilterRegexp,
		replacement: []byte(" "),
	}
}

func (s *CharFilter) Filter(input []byte) []byte {
	return s.r.ReplaceAllFunc(
		input, func(in []byte) []byte {
			return bytes.Repeat(s.replacement, len(in))
		})
}

func CharFilterConstructor(config map[string]interface{}, cache *registry.Cache) (analysis.CharFilter, error) {
	return New(), nil
}

func init() {
	err := registry.RegisterCharFilter(Name, CharFilterConstructor)
	if err != nil {
		panic(err)
	}
}


================================================
FILE: analysis/char/regexp/regexp.go
================================================
//  Copyright (c) 2014 Couchbase, Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// 		http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package regexp

import (
	"fmt"
	"regexp"

	"github.com/blevesearch/bleve/v2/analysis"
	"github.com/blevesearch/bleve/v2/registry"
)

const Name = "regexp"

type CharFilter struct {
	r           *regexp.Regexp
	replacement []byte
}

func New(r *regexp.Regexp, replacement []byte) *CharFilter {
	return &CharFilter{
		r:           r,
		replacement: replacement,
	}
}

func (s *CharFilter) Filter(input []byte) []byte {
	return s.r.ReplaceAll(input, s.replacement)
}

func CharFilterConstructor(config map[string]interface{}, cache *registry.Cache) (analysis.CharFilter, error) {
	regexpStr, ok := config["regexp"].(string)
	if !ok {
		return nil, fmt.Errorf("must specify regexp")
	}
	r, err := regexp.Compile(regexpStr)
	if err != nil {
		return nil, fmt.Errorf("unable to build regexp char filter: %v", err)
	}
	replaceBytes := []byte(" ")
	replaceStr, ok := config["replace"].(string)
	if ok {
		replaceBytes = []byte(replaceStr)
	}
	return New(r, replaceBytes), nil
}

func init() {
	err := registry.RegisterCharFilter(Name, CharFilterConstructor)
	if err != nil {
		panic(err)
	}
}


================================================
FILE: analysis/char/regexp/regexp_test.go
================================================
//  Copyright (c) 2014 Couchbase, Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// 		http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package regexp

import (
	"fmt"
	"reflect"
	"regexp"
	"testing"
)

func TestRegexpCharFilter(t *testing.T) {

	tests := []struct {
		regexStr string
		replace  []byte
		input    []byte
		output   []byte
	}{
		{
			regexStr: `</?[!\w]+((\s+\w+(\s*=\s*(?:".*?"|'.*?'|[^'">\s]+))?)+\s*|\s*)/?>`,
			replace:  []byte{' '},
			input:    []byte(`<html>test</html>`),
			output:   []byte(` test `),
		},
		{
			regexStr: `\x{200C}`,
			replace:  []byte{' '},
			input:    []byte("water\u200Cunder\u200Cthe\u200Cbridge"),
			output:   []byte("water under the bridge"),
		},
		{
			regexStr: `([a-z])\s+(\d)`,
			replace:  []byte(`$1-$2`),
			input:    []byte(`temp 1`),
			output:   []byte(`temp-1`),
		},
		{
			regexStr: `foo.?`,
			replace:  []byte(`X`),
			input:    []byte(`seafood, fool`),
			output:   []byte(`seaX, X`),
		},
		{
			regexStr: `def`,
			replace:  []byte(`_`),
			input:    []byte(`abcdefghi`),
			output:   []byte(`abc_ghi`),
		},
		{
			regexStr: `456`,
			replace:  []byte(`000000`),
			input:    []byte(`123456789`),
			output:   []byte(`123000000789`),
		},
		{
			regexStr: `“|”`,
			replace:  []byte(`"`),
			input:    []byte(`“hello”`),
			output:   []byte(`"hello"`),
		},
	}

	for _, test := range tests {
		t.Run(fmt.Sprintf("match %s replace %s", test.regexStr, string(test.replace)), func(t *testing.T) {
			regex := regexp.MustCompile(test.regexStr)
			filter := New(regex, test.replace)

			output := filter.Filter(test.input)
			if !reflect.DeepEqual(test.output, output) {
				t.Errorf("Expected: `%s`, Got: `%s`\n", string(test.output), string(output))
			}
		})

	}
}


================================================
FILE: analysis/char/zerowidthnonjoiner/zerowidthnonjoiner.go
================================================
//  Copyright (c) 2014 Couchbase, Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// 		http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package zerowidthnonjoiner

import (
	"regexp"

	"github.com/blevesearch/bleve/v2/analysis"
	regexpCharFilter "github.com/blevesearch/bleve/v2/analysis/char/regexp"
	"github.com/blevesearch/bleve/v2/registry"
)

const Name = "zero_width_spaces"

var zeroWidthNonJoinerRegexp = regexp.MustCompile(`\x{200C}`)

func CharFilterConstructor(config map[string]interface{}, cache *registry.Cache) (analysis.CharFilter, error) {
	replaceBytes := []byte(" ")
	return regexpCharFilter.New(zeroWidthNonJoinerRegexp, replaceBytes), nil
}

func init() {
	err := registry.RegisterCharFilter(Name, CharFilterConstructor)
	if err != nil {
		panic(err)
	}
}


================================================
FILE: analysis/datetime/flexible/flexible.go
================================================
//  Copyright (c) 2014 Couchbase, Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// 		http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package flexible

import (
	"fmt"
	"time"

	"github.com/blevesearch/bleve/v2/analysis"
	"github.com/blevesearch/bleve/v2/registry"
)

const Name = "flexiblego"

type DateTimeParser struct {
	layouts []string
}

func New(layouts []string) *DateTimeParser {
	return &DateTimeParser{
		layouts: layouts,
	}
}

func (p *DateTimeParser) ParseDateTime(input string) (time.Time, string, error) {
	for _, layout := range p.layouts {
		rv, err := time.Parse(layout, input)
		if err == nil {
			return rv, layout, nil
		}
	}
	return time.Time{}, "", analysis.ErrInvalidDateTime
}

func DateTimeParserConstructor(config map[string]interface{}, cache *registry.Cache) (analysis.DateTimeParser, error) {
	layouts, ok := config["layouts"].([]interface{})
	if !ok {
		return nil, fmt.Errorf("must specify layouts")
	}
	var layoutStrs []string
	for _, layout := range layouts {
		layoutStr, ok := layout.(string)
		if ok {
			layoutStrs = append(layoutStrs, layoutStr)
		}
	}
	return New(layoutStrs), nil
}

func init() {
	err := registry.RegisterDateTimeParser(Name, DateTimeParserConstructor)
	if err != nil {
		panic(err)
	}
}


================================================
FILE: analysis/datetime/flexible/flexible_test.go
================================================
//  Copyright (c) 2014 Couchbase, Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// 		http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package flexible

import (
	"reflect"
	"testing"
	"time"

	"github.com/blevesearch/bleve/v2/analysis"
)

func TestFlexibleDateTimeParser(t *testing.T) {
	testLocation := time.FixedZone("", -8*60*60)

	rfc3339NoTimezone := "2006-01-02T15:04:05"
	rfc3339NoTimezoneNoT := "2006-01-02 15:04:05"
	rfc3339NoTime := "2006-01-02"

	dateOptionalTimeParser := New(
		[]string{
			time.RFC3339Nano,
			time.RFC3339,
			rfc3339NoTimezone,
			rfc3339NoTimezoneNoT,
			rfc3339NoTime,
		})

	tests := []struct {
		input          string
		expectedTime   time.Time
		expectedLayout string
		expectedError  error
	}{
		{
			input:          "2014-08-03",
			expectedTime:   time.Date(2014, 8, 3, 0, 0, 0, 0, time.UTC),
			expectedLayout: rfc3339NoTime,
			expectedError:  nil,
		},
		{
			input:          "2014-08-03T15:59:30",
			expectedTime:   time.Date(2014, 8, 3, 15, 59, 30, 0, time.UTC),
			expectedLayout: rfc3339NoTimezone,
			expectedError:  nil,
		},
		{
			input:          "2014-08-03 15:59:30",
			expectedTime:   time.Date(2014, 8, 3, 15, 59, 30, 0, time.UTC),
			expectedLayout: rfc3339NoTimezoneNoT,
			expectedError:  nil,
		},
		{
			input:          "2014-08-03T15:59:30-08:00",
			expectedTime:   time.Date(2014, 8, 3, 15, 59, 30, 0, testLocation),
			expectedLayout: time.RFC3339Nano,
			expectedError:  nil,
		},
		{

			input:          "2014-08-03T15:59:30.999999999-08:00",
			expectedTime:   time.Date(2014, 8, 3, 15, 59, 30, 999999999, testLocation),
			expectedLayout: time.RFC3339Nano,
			expectedError:  nil,
		},
		{
			input:          "not a date time",
			expectedTime:   time.Time{},
			expectedLayout: "",
			expectedError:  analysis.ErrInvalidDateTime,
		},
	}

	for _, test := range tests {
		t.Run(test.input, func(t *testing.T) {
			actualTime, actualLayout, actualErr := dateOptionalTimeParser.ParseDateTime(test.input)
			if actualErr != test.expectedError {
				t.Fatalf("expected error %#v, got %#v", test.expectedError, actualErr)
			}
			if !reflect.DeepEqual(actualTime, test.expectedTime) {
				t.Errorf("expected time %v, got %v", test.expectedTime, actualTime)
			}
			if !reflect.DeepEqual(actualLayout, test.expectedLayout) {
				t.Errorf("expected layout %v, got %v", test.expectedLayout, actualLayout)
			}
		})
	}
}


================================================
FILE: analysis/datetime/iso/iso.go
================================================
//  Copyright (c) 2023 Couchbase, Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// 		http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package iso

import (
	"fmt"
	"strings"
	"time"

	"github.com/blevesearch/bleve/v2/analysis"
	"github.com/blevesearch/bleve/v2/registry"
)

const Name = "isostyle"

var textLiteralDelimiter byte = '\'' // single quote

// ISO style date strings are represented in
// https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html
//
// Some format specifiers are not specified in go time package, such as:
// - 'V' for timezone name, like 'Europe/Berlin' or 'America/New_York'.
// - 'Q' for quarter of year, like Q3 or 3rd Quarter.
// - 'zzzz' for full name of timezone like "Japan Standard Time" or "Eastern Standard Time".
// - 'O' for localized zone-offset, like GMT+8 or GMT+08:00.
// - '[]' for optional section of the format.
// - 'G' for era, like AD or BC.
// - 'W' for week of month.
// - 'D' for day of year.
// So date strings with these date elements cannot be parsed.
var timeElementToLayout = map[byte]map[int]string{
	'M': {
		4: "January", // MMMM = full month name
		3: "Jan",     // MMM = short month name
		2: "01",      // MM = month of year (2 digits) (01-12)
		1: "1",       // M = month of year (1 digit) (1-12)
	},
	'd': {
		2: "02", // dd = day of month (2 digits) (01-31)
		1: "2",  // d = day of month (1 digit) (1-31)
	},
	'a': {
		2: "pm", // aa = pm/am
		1: "PM", // a = PM/AM
	},
	'H': {
		2: "15", // HH = hour (24 hour clock) (2 digits)
		1: "15", // H = hour (24 hour clock) (1 digit)
	},
	'm': {
		2: "04", // mm = minute (2 digits)
		1: "4",  // m = minute (1 digit)
	},
	's': {
		2: "05", // ss = seconds (2 digits)
		1: "5",  // s = seconds (1 digit)
	},

	// timezone offsets from UTC below
	'X': {
		5: "Z07:00:00", // XXXXX = timezone offset (+-hh:mm:ss)
		4: "Z070000",   // XXXX = timezone offset (+-hhmmss)
		3: "Z07:00",    // XXX = timezone offset (+-hh:mm)
		2: "Z0700",     // XX = timezone offset (+-hhmm)
		1: "Z07",       // X = timezone offset (+-hh)
	},
	'x': {
		5: "-07:00:00", // xxxxx = timezone offset (+-hh:mm:ss)
		4: "-070000",   // xxxx = timezone offset (+-hhmmss)
		3: "-07:00",    // xxx = timezone offset (+-hh:mm)
		2: "-0700",     // xx = timezone offset (+-hhmm)
		1: "-07",       // x = timezone offset (+-hh)
	},
}

type DateTimeParser struct {
	layouts []string
}

func New(layouts []string) *DateTimeParser {
	return &DateTimeParser{
		layouts: layouts,
	}
}

func (p *DateTimeParser) ParseDateTime(input string) (time.Time, string, error) {
	for _, layout := range p.layouts {
		rv, err := time.Parse(layout, input)
		if err == nil {
			return rv, layout, nil
		}
	}
	return time.Time{}, "", analysis.ErrInvalidDateTime
}

func letterCounter(layout string, idx int) int {
	count := 1
	for idx+count < len(layout) {
		if layout[idx+count] == layout[idx] {
			count++
		} else {
			break
		}
	}
	return count
}

func invalidFormatError(character byte, count int) error {
	return fmt.Errorf("invalid format string, unknown format specifier: %s", strings.Repeat(string(character), count))
}

func parseISOString(layout string) (string, error) {
	var dateTimeLayout strings.Builder

	for idx := 0; idx < len(layout); {
		// check if the character is a text literal delimiter (')
		if layout[idx] == textLiteralDelimiter {
			if idx+1 < len(layout) && layout[idx+1] == textLiteralDelimiter {
				// if the next character is also a text literal delimiter, then
				// copy the character as is
				dateTimeLayout.WriteByte(textLiteralDelimiter)
				idx += 2
				continue
			}
			// find the next text literal delimiter
			for idx++; idx < len(layout); idx++ {
				if layout[idx] == textLiteralDelimiter {
					break
				}
				dateTimeLayout.WriteByte(layout[idx])
			}
			// idx can either be equal to len(layout) if the text literal delimiter is not found
			// after the first text literal delimiter or it will be equal to the index of the
			// second text literal delimiter
			if idx == len(layout) {
				// text literal delimiter not found error
				return "", fmt.Errorf("invalid format string, expected text literal delimiter: %s", string(textLiteralDelimiter))
			}
			// increment idx to skip the second text literal delimiter
			idx++
			continue
		}
		// check if character is a letter in english alphabet - a-zA-Z which are reserved
		// for format specifiers
		if (layout[idx] >= 'a' && layout[idx] <= 'z') || (layout[idx] >= 'A' && layout[idx] <= 'Z') {
			// find the number of times the character occurs consecutively
			count := letterCounter(layout, idx)
			character := layout[idx]
			// first check the table
			if layout, ok := timeElementToLayout[character][count]; ok {
				dateTimeLayout.WriteString(layout)
			} else {
				switch character {
				case 'y', 'u', 'Y':
					// year
					if count == 2 {
						dateTimeLayout.WriteString("06")
					} else {
						format := fmt.Sprintf("%%0%ds", count)
						dateTimeLayout.WriteString(fmt.Sprintf(format, "2006"))
					}
				case 'h', 'K':
					// hour (1-12)
					switch count {
					case 2:
						// hh, KK -> 03
						dateTimeLayout.WriteString("03")
					case 1:
						// h, K -> 3
						dateTimeLayout.WriteString("3")
					default:
						// e.g., hhh
						return "", invalidFormatError(character, count)
					}
				case 'E':
					// day of week
					if count == 4 {
						dateTimeLayout.WriteString("Monday") // EEEE -> Monday
					} else if count <= 3 {
						dateTimeLayout.WriteString("Mon") // E, EE, EEE -> Mon
					} else {
						return "", invalidFormatError(character, count) // e.g., EEEEE
					}
				case 'S':
					// fraction of second
					// .SSS = millisecond
					// .SSSSSS = microsecond
					// .SSSSSSSSS = nanosecond
					if count > 9 {
						return "", invalidFormatError(character, count)
					}
					dateTimeLayout.WriteString(strings.Repeat(string('0'), count))
				case 'z':
					// timezone id
					if count < 5 {
						dateTimeLayout.WriteString("MST")
					} else {
						return "", invalidFormatError(character, count)
					}
				default:
					return "", invalidFormatError(character, count)
				}
			}
			idx += count
		} else {
			// copy the character as is
			dateTimeLayout.WriteByte(layout[idx])
			idx++
		}
	}
	return dateTimeLayout.String(), nil
}

func DateTimeParserConstructor(config map[string]interface{}, cache *registry.Cache) (analysis.DateTimeParser, error) {
	layouts, ok := config["layouts"].([]interface{})
	if !ok {
		return nil, fmt.Errorf("must specify layouts")
	}
	var layoutStrs []string
	for _, layout := range layouts {
		layoutStr, ok := layout.(string)
		if ok {
			layout, err := parseISOString(layoutStr)
			if err != nil {
				return nil, err
			}
			layoutStrs = append(layoutStrs, layout)
		}
	}
	return New(layoutStrs), nil
}

func init() {
	err := registry.RegisterDateTimeParser(Name, DateTimeParserConstructor)
	if err != nil {
		panic(err)
	}
}


================================================
FILE: analysis/datetime/iso/iso_test.go
================================================
//  Copyright (c) 2023 Couchbase, Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//	http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package iso

import (
	"fmt"
	"testing"
)

func TestConversionFromISOStyle(t *testing.T) {
	tests := []struct {
		input  string
		output string
		err    error
	}{
		{
			input:  "yyyy-MM-dd",
			output: "2006-01-02",
			err:    nil,
		},
		{
			input:  "uuu/M''''dd'T'HH:m:ss.SSS",
			output: "2006/1''02T15:4:05.000",
			err:    nil,
		},
		{
			input:  "YYYY-MM-dd'T'H:mm:ss zzz",
			output: "2006-01-02T15:04:05 MST",
			err:    nil,
		},
		{
			input:  "MMMM dd yyyy', 'HH:mm:ss.SSS",
			output: "January 02 2006, 15:04:05.000",
			err:    nil,
		},
		{
			input:  "h 'o'''' clock' a, XXX",
			output: "3 o' clock PM, Z07:00",
			err:    nil,
		},
		{
			input:  "YYYY-MM-dd'T'HH:mm:ss'Z'",
			output: "2006-01-02T15:04:05Z",
			err:    nil,
		},
		{
			input:  "E MMM d H:mm:ss z Y",
			output: "Mon Jan 2 15:04:05 MST 2006",
			err:    nil,
		},
		{
			input:  "E MMM DD H:m:s z Y",
			output: "",
			err:    fmt.Errorf("invalid format string, unknown format specifier: DD"),
		},
		{
			input:  "E MMM''''' H:m:s z Y",
			output: "",
			err:    fmt.Errorf("invalid format string, expected text literal delimiter: '"),
		},
		{
			input:  "MMMMM dd yyyy', 'HH:mm:ss.SSS",
			output: "",
			err:    fmt.Errorf("invalid format string, unknown format specifier: MMMMM"),
		},
		{
			input:  "yy", // year (2 digits)
			output: "06",
			err:    nil,
		},
		{
			input:  "yyyyy", // year (5 digits, padded)
			output: "02006",
			err:    nil,
		},
		{
			input:  "h", // hour 1-12 (1 digit)
			output: "3",
			err:    nil,
		},
		{
			input:  "hh", // hour 1-12 (2 digits)
			output: "03",
			err:    nil,
		},
		{
			input:  "KK", // hour 1-12 (2 digits, alt)
			output: "03",
			err:    nil,
		},
		{
			input:  "hhh", // invalid hour count
			output: "",
			err:    fmt.Errorf("invalid format string, unknown format specifier: hhh"),
		},
		{
			input:  "E", // Day of week (short)
			output: "Mon",
			err:    nil,
		},
		{
			input:  "EEE", // Day of week (short)
			output: "Mon",
			err:    nil,
		},
		{
			input:  "EEEE", // Day of week (long)
			output: "Monday",
			err:    nil,
		},
		{
			input:  "EEEEE", // Day of week (long)
			output: "",
			err:    fmt.Errorf("invalid format string, unknown format specifier: EEEEE"),
		},
		{
			input:  "S", // Fraction of second (1 digit)
			output: "0",
			err:    nil,
		},
		{
			input:  "SSSSSSSSS", // Fraction of second (9 digits)
			output: "000000000",
			err:    nil,
		},
		{
			input:  "SSSSSSSSSS", // Invalid fraction of second count
			output: "",
			err:    fmt.Errorf("invalid format string, unknown format specifier: SSSSSSSSSS"),
		},
		{
			input:  "z", // Timezone name (short)
			output: "MST",
			err:    nil,
		},
		{
			input:  "zzz", // Timezone name (short) - Corrected expectation
			output: "MST", // Should output MST
			err:    nil,   // Should not produce an error
		},
		{
			input:  "zzzz", // Timezone name (long) - Corrected expectation
			output: "MST",  // Should output MST
			err:    nil,    // Should not produce an error
		},
		{
			input:  "G", // Era designator (unsupported)
			output: "",
			err:    fmt.Errorf("invalid format string, unknown format specifier: G"),
		},
		{
			input:  "W", // Week of month (unsupported)
			output: "",
			err:    fmt.Errorf("invalid format string, unknown format specifier: W"),
		},
	}
	for i, test := range tests {
		t.Run(fmt.Sprintf("test %d: %s", i, test.input), func(t *testing.T) {
			out, err := parseISOString(test.input)
			// Check error matching
			if (err != nil && test.err == nil) || (err == nil && test.err != nil) || (err != nil && test.err != nil && err.Error() != test.err.Error()) {
				t.Fatalf("expected error %v, got error %v", test.err, err)
			}
			// Check output matching only if no error was expected/occurred
			if err == nil && test.err == nil && out != test.output {
				t.Fatalf("expected output '%v', got '%v'", test.output, out)
			}
		})
	}
}


================================================
FILE: analysis/datetime/optional/optional.go
================================================
//  Copyright (c) 2014 Couchbase, Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// 		http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package optional

import (
	"time"

	"github.com/blevesearch/bleve/v2/analysis"
	"github.com/blevesearch/bleve/v2/analysis/datetime/flexible"
	"github.com/blevesearch/bleve/v2/registry"
)

const Name = "dateTimeOptional"

const rfc3339NoTimezone = "2006-01-02T15:04:05"
const rfc3339NoTimezoneNoT = "2006-01-02 15:04:05"
const rfc3339Offset = "2006-01-02 15:04:05 -0700"
const rfc3339NoTime = "2006-01-02"

var layouts = []string{
	time.RFC3339Nano,
	time.RFC3339,
	rfc3339NoTimezone,
	rfc3339NoTimezoneNoT,
	rfc3339Offset,
	rfc3339NoTime,
}

func DateTimeParserConstructor(config map[string]interface{}, cache *registry.Cache) (analysis.DateTimeParser, error) {
	return flexible.New(layouts), nil
}

func init() {
	err := registry.RegisterDateTimeParser(Name, DateTimeParserConstructor)
	if err != nil {
		panic(err)
	}
}


================================================
FILE: analysis/datetime/percent/percent.go
================================================
//  Copyright (c) 2023 Couchbase, Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// 		http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package percent

import (
	"fmt"
	"strings"
	"time"

	"github.com/blevesearch/bleve/v2/analysis"
	"github.com/blevesearch/bleve/v2/registry"
)

const Name = "percentstyle"

var formatDelimiter byte = '%'

// format specifiers as per strftime in the C standard library
// https://man7.org/linux/man-pages/man3/strftime.3.html
var formatSpecifierToLayout = map[byte]string{
	formatDelimiter: string(formatDelimiter), // %% = % (literal %)
	'a':             "Mon",                   // %a = short weekday name
	'A':             "Monday",                // %A = full weekday name
	'd':             "02",                    // %d = day of month (2 digits) (01-31)
	'e':             "2",                     // %e = day of month (1 digit) (1-31)
	'b':             "Jan",                   // %b = short month name
	'B':             "January",               // %B = full month name
	'm':             "01",                    // %m = month of year (2 digits) (01-12)
	'y':             "06",                    // %y = year without century
	'Y':             "2006",                  // %Y = year with century
	'H':             "15",                    // %H = hour (24 hour clock) (2 digits)
	'I':             "03",                    // %I = hour (12 hour clock) (2 digits)
	'l':             "3",                     // %l = hour (12 hour clock) (1 digit)
	'p':             "PM",                    // %p = PM/AM
	'P':             "pm",                    // %P = pm/am (lowercase)
	'M':             "04",                    // %M = minute (2 digits)
	'S':             "05",                    // %S = seconds (2 digits)
	'f':             "999999",                // .%f = fraction of seconds - up to microseconds (6 digits) - deci/milli/micro
	'Z':             "MST",                   // %Z = timezone name (GMT, JST, UTC etc)
	// %z is present in timezone options

	// some additional options not in strftime to support additional options such as
	// disallow 0 padding in minute and seconds, nanosecond precision, etc
	'o': "1",         // %o = month of year (1 digit) (1-12)
	'i': "4",         // %i = minute (1 digit)
	's': "5",         // %s = seconds (1 digit)
	'N': "999999999", // .%N = fraction of seconds - up to microseconds (9 digits) - milli/micro/nano
}

// some additional options for timezone
// such as allowing colon in timezone offset and specifying the seconds
// timezone offsets are from UTC
var timezoneOptions = map[string]string{
	"z":   "Z0700",     // %z = timezone offset in +-hhmm / +-(2 digit hour)(2 digit minute) +0500, -0600 etc
	"z:M": "Z07:00",    // %z:M = timezone offset(+-hh:mm) / +-(2 digit hour):(2 digit minute) +05:00, -06:00 etc
	"z:S": "Z07:00:00", // %z:M = timezone offset(+-hh:mm:ss) / +-(2 digit hour):(2 digit minute):(2 digit second) +05:20:00, -06:30:00 etc
	"zH":  "Z07",       // %zH = timezone offset(+-hh) / +-(2 digit hour) +05, -06 etc
	"zS":  "Z070000",   // %zS = timezone offset(+-hhmmss) / +-(2 digit hour)(2 digit minute)(2 digit second) +052000, -063000 etc
}

type DateTimeParser struct {
	layouts []string
}

func New(layouts []string) *DateTimeParser {
	return &DateTimeParser{
		layouts: layouts,
	}
}

func checkTZOptions(formatString string, idx int) (string, int) {
	// idx points to '%'
	// We know formatString[idx+1] == 'z'
	nextIdx := idx + 2 // Index of the character immediately after 'z'

	// Default values assume only '%z' is present
	layout := timezoneOptions["z"]
	finalIdx := nextIdx // Index after '%z'

	if nextIdx < len(formatString) {
		switch formatString[nextIdx] {
		case ':':
			// Check for modifier after the colon ':'
			colonModifierIdx := nextIdx + 1
			if colonModifierIdx < len(formatString) {
				switch formatString[colonModifierIdx] {
				case 'M':
					// Found %z:M
					layout = timezoneOptions["z:M"]
					finalIdx = colonModifierIdx + 1 // Index after %z:M
				case 'S':
					// Found %z:S
					layout = timezoneOptions["z:S"]
					finalIdx = colonModifierIdx + 1 // Index after %z:S
					// default: If %z: is followed by something else, or just %z: at the end.
					// Keep the default layout ("z") and finalIdx (idx + 2).
					// The ':' will be treated as a literal by the main loop.
				}
			}
			// else: %z: is at the very end of the string.
			// Keep the default layout ("z") and finalIdx (idx + 2).
			// The ':' will be treated as a literal by the main loop.

		case 'H':
			// Found %zH
			layout = timezoneOptions["zH"]
			finalIdx = nextIdx + 1 // Index after %zH
		case 'S':
			// Found %zS
			layout = timezoneOptions["zS"]
			finalIdx = nextIdx + 1 // Index after %zS

			// default: If %z is followed by something other than ':', 'H', or 'S'.
			// Keep the default layout ("z") and finalIdx (idx + 2).
			// The character formatString[nextIdx] will be handled by the main loop.
		}
	}
	// else: %z is at the very end of the string.
	// Keep the default layout ("z") and finalIdx (idx + 2).

	return layout, finalIdx
}

func parseFormatString(formatString string) (string, error) {
	var dateTimeLayout strings.Builder
	// iterate over the format string and replace the format specifiers with
	// the corresponding golang constants
	for idx := 0; idx < len(formatString); {
		// check if the character is a format delimiter (%)
		if formatString[idx] == formatDelimiter {
			// check if there is a character after the format delimiter (%)
			if idx+1 >= len(formatString) {
				return "", fmt.Errorf("invalid format string, expected character after %s", string(formatDelimiter))
			}
			formatSpecifier := formatString[idx+1]
			if layout, ok := formatSpecifierToLayout[formatSpecifier]; ok {
				dateTimeLayout.WriteString(layout)
				idx += 2
			} else if formatSpecifier == 'z' {
				// did not find a valid specifier
				// check if it is for timezone
				var tzLayout string
				tzLayout, idx = checkTZOptions(formatString, idx)
				dateTimeLayout.WriteString(tzLayout)
			} else {
				return "", fmt.Errorf("invalid format string, unknown format specifier: %s", string(formatSpecifier))
			}
			continue
		}
		// copy the character as is
		dateTimeLayout.WriteByte(formatString[idx])
		idx++
	}
	return dateTimeLayout.String(), nil
}

func (p *DateTimeParser) ParseDateTime(input string) (time.Time, string, error) {
	for _, layout := range p.layouts {
		rv, err := time.Parse(layout, input)
		if err == nil {
			return rv, layout, nil
		}
	}
	return time.Time{}, "", analysis.ErrInvalidDateTime
}

func DateTimeParserConstructor(config map[string]interface{}, cache *registry.Cache) (analysis.DateTimeParser, error) {
	layouts, ok := config["layouts"].([]interface{})
	if !ok {
		return nil, fmt.Errorf("must specify layouts")
	}

	layoutStrs := make([]string, 0, len(layouts))
	for _, layout := range layouts {
		layoutStr, ok := layout.(string)
		if ok {
			layout, err := parseFormatString(layoutStr)
			if err != nil {
				return nil, err
			}
			layoutStrs = append(layoutStrs, layout)
		}
	}

	return New(layoutStrs), nil
}

func init() {
	err := registry.RegisterDateTimeParser(Name, DateTimeParserConstructor)
	if err != nil {
		panic(err)
	}
}


================================================
FILE: analysis/datetime/percent/percent_test.go
================================================
//  Copyright (c) 2023 Couchbase, Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//	http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package percent

import (
	"fmt"
	"reflect"
	"testing"
	"time"

	"github.com/blevesearch/bleve/v2/analysis"
)

func TestConversionFromPercentStyle(t *testing.T) {
	tests := []struct {
		name   string // Added name field
		input  string
		output string
		err    error
	}{
		{
			name:   "basic YMD",
			input:  "%Y-%m-%d",
			output: "2006-01-02",
			err:    nil,
		},
		{
			name:   "YMD with double percent and literal T",
			input:  "%Y/%m%%%%%dT%H%M:%S",
			output: "2006/01%%02T1504:05",
			err:    nil,
		},
		{
			name:   "YMD T HMS Z z",
			input:  "%Y-%m-%dT%H:%M:%S %Z%z",
			output: "2006-01-02T15:04:05 MSTZ0700",
			err:    nil,
		},
		{
			name:   "Full month, padded day/hour, am/pm, z:M",
			input:  "%B %e, %Y %l:%i %P %z:M",
			output: "January 2, 2006 3:4 pm Z07:00",
			err:    nil,
		},
		{
			name:   "Long format with literals and timezone literal :S",
			input:  "Hour %H Minute %Mseconds %S.%N Timezone:%Z:S, Weekday %a; Day %d Month %b, Year %y",
			output: "Hour 15 Minute 04seconds 05.999999999 Timezone:MST:S, Weekday Mon; Day 02 Month Jan, Year 06",
			err:    nil,
		},
		{
			name:   "YMD T HMS with nanoseconds",
			input:  "%Y-%m-%dT%H:%M:%S.%N",
			output: "2006-01-02T15:04:05.999999999",
			err:    nil,
		},
		{
			name:   "HMS Z z",
			input:  "%H:%M:%S %Z %z",
			output: "15:04:05 MST Z0700",
			err:    nil,
		},
		{
			name:   "HMS Z z literal colon",
			input:  "%H:%M:%S %Z %z:",
			output: "15:04:05 MST Z0700:",
			err:    nil,
		},
		{
			name:   "HMS Z z:M",
			input:  "%H:%M:%S %Z %z:M",
			output: "15:04:05 MST Z07:00",
			err:    nil,
		},
		{
			name:   "HMS Z z:S",
			input:  "%H:%M:%S %Z %z:S",
			output: "15:04:05 MST Z07:00:00",
			err:    nil,
		},
		{
			name:   "HMS Z z: literal A",
			input:  "%H:%M:%S %Z %z:A",
			output: "15:04:05 MST Z0700:A",
			err:    nil,
		},
		{
			name:   "HMS Z z literal M",
			input:  "%H:%M:%S %Z %zM",
			output: "15:04:05 MST Z0700M",
			err:    nil,
		},
		{
			name:   "HMS Z zH",
			input:  "%H:%M:%S %Z %zH",
			output: "15:04:05 MST Z07",
			err:    nil,
		},
		{
			name:   "HMS Z zS",
			input:  "%H:%M:%S %Z %zS",
			output: "15:04:05 MST Z070000",
			err:    nil,
		},
		{
			name:   "Complex combination z zS z: zH",
			input:  "%H:%M:%S %Z %z%Z %zS%z:%zH",
			output: "15:04:05 MST Z0700MST Z070000Z0700:Z07",
			err:    nil,
		},
		{
			name:   "z at end",
			input:  "%Y-%m-%d %z",
			output: "2006-01-02 Z0700",
			err:    nil,
		},
		{
			name:   "z: at end",
			input:  "%Y-%m-%d %z:",
			output: "2006-01-02 Z0700:",
			err:    nil,
		},
		{
			name:   "zH at end",
			input:  "%Y-%m-%d %zH",
			output: "2006-01-02 Z07",
			err:    nil,
		},
		{
			name:   "zS at end",
			input:  "%Y-%m-%d %zS",
			output: "2006-01-02 Z070000",
			err:    nil,
		},
		{
			name:   "z:
Download .txt
gitextract_lgtz3phf/

├── .github/
│   └── workflows/
│       ├── cover.yml
│       └── tests.yml
├── .gitignore
├── CONTRIBUTING.md
├── LICENSE
├── README.md
├── SECURITY.md
├── analysis/
│   ├── analyzer/
│   │   ├── custom/
│   │   │   └── custom.go
│   │   ├── keyword/
│   │   │   └── keyword.go
│   │   ├── simple/
│   │   │   └── simple.go
│   │   ├── standard/
│   │   │   └── standard.go
│   │   └── web/
│   │       └── web.go
│   ├── benchmark_test.go
│   ├── char/
│   │   ├── asciifolding/
│   │   │   ├── asciifolding.go
│   │   │   └── asciifolding_test.go
│   │   ├── html/
│   │   │   └── html.go
│   │   ├── regexp/
│   │   │   ├── regexp.go
│   │   │   └── regexp_test.go
│   │   └── zerowidthnonjoiner/
│   │       └── zerowidthnonjoiner.go
│   ├── datetime/
│   │   ├── flexible/
│   │   │   ├── flexible.go
│   │   │   └── flexible_test.go
│   │   ├── iso/
│   │   │   ├── iso.go
│   │   │   └── iso_test.go
│   │   ├── optional/
│   │   │   └── optional.go
│   │   ├── percent/
│   │   │   ├── percent.go
│   │   │   └── percent_test.go
│   │   ├── sanitized/
│   │   │   ├── sanitized.go
│   │   │   └── sanitized_test.go
│   │   └── timestamp/
│   │       ├── microseconds/
│   │       │   └── microseconds.go
│   │       ├── milliseconds/
│   │       │   └── milliseconds.go
│   │       ├── nanoseconds/
│   │       │   └── nanoseconds.go
│   │       └── seconds/
│   │           └── seconds.go
│   ├── freq.go
│   ├── freq_test.go
│   ├── lang/
│   │   ├── ar/
│   │   │   ├── analyzer_ar.go
│   │   │   ├── analyzer_ar_test.go
│   │   │   ├── arabic_normalize.go
│   │   │   ├── arabic_normalize_test.go
│   │   │   ├── stemmer_ar.go
│   │   │   ├── stemmer_ar_test.go
│   │   │   ├── stop_filter_ar.go
│   │   │   └── stop_words_ar.go
│   │   ├── bg/
│   │   │   ├── stop_filter_bg.go
│   │   │   └── stop_words_bg.go
│   │   ├── ca/
│   │   │   ├── articles_ca.go
│   │   │   ├── elision_ca.go
│   │   │   ├── elision_ca_test.go
│   │   │   ├── stop_filter_ca.go
│   │   │   └── stop_words_ca.go
│   │   ├── cjk/
│   │   │   ├── analyzer_cjk.go
│   │   │   ├── analyzer_cjk_test.go
│   │   │   ├── cjk_bigram.go
│   │   │   ├── cjk_bigram_test.go
│   │   │   ├── cjk_width.go
│   │   │   └── cjk_width_test.go
│   │   ├── ckb/
│   │   │   ├── analyzer_ckb.go
│   │   │   ├── analyzer_ckb_test.go
│   │   │   ├── sorani_normalize.go
│   │   │   ├── sorani_normalize_test.go
│   │   │   ├── sorani_stemmer_filter.go
│   │   │   ├── sorani_stemmer_filter_test.go
│   │   │   ├── stop_filter_ckb.go
│   │   │   └── stop_words_ckb.go
│   │   ├── cs/
│   │   │   ├── stop_filter_cs.go
│   │   │   └── stop_words_cs.go
│   │   ├── da/
│   │   │   ├── analyzer_da.go
│   │   │   ├── analyzer_da_test.go
│   │   │   ├── stemmer_da.go
│   │   │   ├── stop_filter_da.go
│   │   │   └── stop_words_da.go
│   │   ├── de/
│   │   │   ├── analyzer_de.go
│   │   │   ├── analyzer_de_test.go
│   │   │   ├── german_normalize.go
│   │   │   ├── german_normalize_test.go
│   │   │   ├── light_stemmer_de.go
│   │   │   ├── stemmer_de_snowball.go
│   │   │   ├── stemmer_de_test.go
│   │   │   ├── stop_filter_de.go
│   │   │   └── stop_words_de.go
│   │   ├── el/
│   │   │   ├── stop_filter_el.go
│   │   │   └── stop_words_el.go
│   │   ├── en/
│   │   │   ├── analyzer_en.go
│   │   │   ├── analyzer_en_test.go
│   │   │   ├── plural_stemmer.go
│   │   │   ├── plural_stemmer_test.go
│   │   │   ├── possessive_filter_en.go
│   │   │   ├── possessive_filter_en_test.go
│   │   │   ├── stemmer_en_snowball.go
│   │   │   ├── stemmer_en_test.go
│   │   │   ├── stop_filter_en.go
│   │   │   └── stop_words_en.go
│   │   ├── es/
│   │   │   ├── analyzer_es.go
│   │   │   ├── analyzer_es_test.go
│   │   │   ├── light_stemmer_es.go
│   │   │   ├── spanish_normalize.go
│   │   │   ├── spanish_normalize_test.go
│   │   │   ├── stemmer_es_snowball.go
│   │   │   ├── stemmer_es_snowball_test.go
│   │   │   ├── stop_filter_es.go
│   │   │   └── stop_words_es.go
│   │   ├── eu/
│   │   │   ├── stop_filter_eu.go
│   │   │   └── stop_words_eu.go
│   │   ├── fa/
│   │   │   ├── analyzer_fa.go
│   │   │   ├── analyzer_fa_test.go
│   │   │   ├── persian_normalize.go
│   │   │   ├── persian_normalize_test.go
│   │   │   ├── stop_filter_fa.go
│   │   │   └── stop_words_fa.go
│   │   ├── fi/
│   │   │   ├── analyzer_fi.go
│   │   │   ├── analyzer_fi_test.go
│   │   │   ├── stemmer_fi.go
│   │   │   ├── stop_filter_fi.go
│   │   │   └── stop_words_fi.go
│   │   ├── fr/
│   │   │   ├── analyzer_fr.go
│   │   │   ├── analyzer_fr_test.go
│   │   │   ├── articles_fr.go
│   │   │   ├── elision_fr.go
│   │   │   ├── elision_fr_test.go
│   │   │   ├── light_stemmer_fr.go
│   │   │   ├── light_stemmer_fr_test.go
│   │   │   ├── minimal_stemmer_fr.go
│   │   │   ├── minimal_stemmer_fr_test.go
│   │   │   ├── stemmer_fr_snowball.go
│   │   │   ├── stemmer_fr_snowball_test.go
│   │   │   ├── stop_filter_fr.go
│   │   │   └── stop_words_fr.go
│   │   ├── ga/
│   │   │   ├── articles_ga.go
│   │   │   ├── elision_ga.go
│   │   │   ├── elision_ga_test.go
│   │   │   ├── stop_filter_ga.go
│   │   │   └── stop_words_ga.go
│   │   ├── gl/
│   │   │   ├── stop_filter_gl.go
│   │   │   └── stop_words_gl.go
│   │   ├── hi/
│   │   │   ├── analyzer_hi.go
│   │   │   ├── analyzer_hi_test.go
│   │   │   ├── hindi_normalize.go
│   │   │   ├── hindi_normalize_test.go
│   │   │   ├── hindi_stemmer_filter.go
│   │   │   ├── hindi_stemmer_filter_test.go
│   │   │   ├── stop_filter_hi.go
│   │   │   └── stop_words_hi.go
│   │   ├── hr/
│   │   │   ├── analyzer_hr.go
│   │   │   ├── analyzer_hr_test.go
│   │   │   ├── stemmer_hr.go
│   │   │   ├── stop_filter_hr.go
│   │   │   ├── stop_words_hr.go
│   │   │   └── suffix_transformation_hr.go
│   │   ├── hu/
│   │   │   ├── analyzer_hu.go
│   │   │   ├── analyzer_hu_test.go
│   │   │   ├── stemmer_hu.go
│   │   │   ├── stop_filter_hu.go
│   │   │   └── stop_words_hu.go
│   │   ├── hy/
│   │   │   ├── stop_filter_hy.go
│   │   │   └── stop_words_hy.go
│   │   ├── id/
│   │   │   ├── stop_filter_id.go
│   │   │   └── stop_words_id.go
│   │   ├── in/
│   │   │   ├── indic_normalize.go
│   │   │   ├── indic_normalize_test.go
│   │   │   └── scripts.go
│   │   ├── it/
│   │   │   ├── analyzer_it.go
│   │   │   ├── analyzer_it_test.go
│   │   │   ├── articles_it.go
│   │   │   ├── elision_it.go
│   │   │   ├── elision_it_test.go
│   │   │   ├── light_stemmer_it.go
│   │   │   ├── light_stemmer_it_test.go
│   │   │   ├── stemmer_it_snowball.go
│   │   │   ├── stemmer_it_snowball_test.go
│   │   │   ├── stop_filter_it.go
│   │   │   └── stop_words_it.go
│   │   ├── nl/
│   │   │   ├── analyzer_nl.go
│   │   │   ├── analyzer_nl_test.go
│   │   │   ├── stemmer_nl.go
│   │   │   ├── stop_filter_nl.go
│   │   │   └── stop_words_nl.go
│   │   ├── no/
│   │   │   ├── analyzer_no.go
│   │   │   ├── analyzer_no_test.go
│   │   │   ├── stemmer_no.go
│   │   │   ├── stop_filter_no.go
│   │   │   └── stop_words_no.go
│   │   ├── pl/
│   │   │   ├── analyzer_pl.go
│   │   │   ├── analyzer_pl_test.go
│   │   │   ├── stemmer_pl.go
│   │   │   ├── stemmer_pl_test.go
│   │   │   ├── stempel/
│   │   │   │   ├── LICENSE
│   │   │   │   ├── cell.go
│   │   │   │   ├── diff.go
│   │   │   │   ├── diff_test.go
│   │   │   │   ├── file.go
│   │   │   │   ├── file_test.go
│   │   │   │   ├── fuzz.go
│   │   │   │   ├── javadata/
│   │   │   │   │   ├── README.md
│   │   │   │   │   ├── fuzz.go
│   │   │   │   │   ├── input.go
│   │   │   │   │   └── input_test.go
│   │   │   │   ├── multi_trie.go
│   │   │   │   ├── pl/
│   │   │   │   │   └── stemmer_20000.tbl
│   │   │   │   ├── row.go
│   │   │   │   ├── strenum.go
│   │   │   │   ├── strenum_test.go
│   │   │   │   └── trie.go
│   │   │   ├── stop_filter_pl.go
│   │   │   └── stop_words_pl.go
│   │   ├── pt/
│   │   │   ├── analyzer_pt.go
│   │   │   ├── analyzer_pt_test.go
│   │   │   ├── light_stemmer_pt.go
│   │   │   ├── light_stemmer_pt_test.go
│   │   │   ├── stop_filter_pt.go
│   │   │   └── stop_words_pt.go
│   │   ├── ro/
│   │   │   ├── analyzer_ro.go
│   │   │   ├── analyzer_ro_test.go
│   │   │   ├── stemmer_ro.go
│   │   │   ├── stop_filter_ro.go
│   │   │   └── stop_words_ro.go
│   │   ├── ru/
│   │   │   ├── analyzer_ru.go
│   │   │   ├── analyzer_ru_test.go
│   │   │   ├── stemmer_ru.go
│   │   │   ├── stemmer_ru_test.go
│   │   │   ├── stop_filter_ru.go
│   │   │   └── stop_words_ru.go
│   │   ├── sv/
│   │   │   ├── analyzer_sv.go
│   │   │   ├── analyzer_sv_test.go
│   │   │   ├── stemmer_sv.go
│   │   │   ├── stop_filter_sv.go
│   │   │   └── stop_words_sv.go
│   │   └── tr/
│   │       ├── analyzer_tr.go
│   │       ├── analyzer_tr_test.go
│   │       ├── stemmer_tr.go
│   │       ├── stemmer_tr_test.go
│   │       ├── stop_filter_tr.go
│   │       └── stop_words_tr.go
│   ├── test_words.txt
│   ├── token/
│   │   ├── apostrophe/
│   │   │   ├── apostrophe.go
│   │   │   └── apostrophe_test.go
│   │   ├── camelcase/
│   │   │   ├── camelcase.go
│   │   │   ├── camelcase_test.go
│   │   │   ├── parser.go
│   │   │   └── states.go
│   │   ├── compound/
│   │   │   ├── dict.go
│   │   │   └── dict_test.go
│   │   ├── edgengram/
│   │   │   ├── edgengram.go
│   │   │   └── edgengram_test.go
│   │   ├── elision/
│   │   │   ├── elision.go
│   │   │   └── elision_test.go
│   │   ├── hierarchy/
│   │   │   ├── hierarchy.go
│   │   │   └── hierarchy_test.go
│   │   ├── keyword/
│   │   │   ├── keyword.go
│   │   │   └── keyword_test.go
│   │   ├── length/
│   │   │   ├── length.go
│   │   │   └── length_test.go
│   │   ├── lowercase/
│   │   │   ├── lowercase.go
│   │   │   └── lowercase_test.go
│   │   ├── ngram/
│   │   │   ├── ngram.go
│   │   │   └── ngram_test.go
│   │   ├── porter/
│   │   │   ├── porter.go
│   │   │   └── porter_test.go
│   │   ├── reverse/
│   │   │   ├── reverse.go
│   │   │   └── reverse_test.go
│   │   ├── shingle/
│   │   │   ├── shingle.go
│   │   │   └── shingle_test.go
│   │   ├── snowball/
│   │   │   ├── snowball.go
│   │   │   └── snowball_test.go
│   │   ├── stop/
│   │   │   ├── stop.go
│   │   │   └── stop_test.go
│   │   ├── truncate/
│   │   │   ├── truncate.go
│   │   │   └── truncate_test.go
│   │   ├── unicodenorm/
│   │   │   ├── unicodenorm.go
│   │   │   └── unicodenorm_test.go
│   │   └── unique/
│   │       ├── unique.go
│   │       └── unique_test.go
│   ├── tokenizer/
│   │   ├── character/
│   │   │   ├── character.go
│   │   │   └── character_test.go
│   │   ├── exception/
│   │   │   ├── exception.go
│   │   │   └── exception_test.go
│   │   ├── letter/
│   │   │   └── letter.go
│   │   ├── regexp/
│   │   │   ├── regexp.go
│   │   │   └── regexp_test.go
│   │   ├── single/
│   │   │   ├── single.go
│   │   │   └── single_test.go
│   │   ├── unicode/
│   │   │   ├── unicode.go
│   │   │   └── unicode_test.go
│   │   ├── web/
│   │   │   ├── web.go
│   │   │   └── web_test.go
│   │   └── whitespace/
│   │       ├── whitespace.go
│   │       └── whitespace_test.go
│   ├── tokenmap/
│   │   └── custom.go
│   ├── tokenmap.go
│   ├── tokenmap_test.go
│   ├── type.go
│   ├── util.go
│   └── util_test.go
├── builder.go
├── builder_test.go
├── cmd/
│   └── bleve/
│       ├── cmd/
│       │   ├── bulk.go
│       │   ├── check.go
│       │   ├── count.go
│       │   ├── create.go
│       │   ├── dictionary.go
│       │   ├── dump.go
│       │   ├── dumpDoc.go
│       │   ├── dumpFields.go
│       │   ├── fields.go
│       │   ├── index.go
│       │   ├── mapping.go
│       │   ├── query.go
│       │   ├── registry.go
│       │   ├── root.go
│       │   ├── scorch/
│       │   │   ├── ascii.go
│       │   │   ├── deleted.go
│       │   │   ├── info.go
│       │   │   ├── internal.go
│       │   │   ├── root.go
│       │   │   └── snapshot.go
│       │   └── scorch.go
│       ├── gendocs.go
│       └── main.go
├── config/
│   ├── README.md
│   └── config.go
├── config.go
├── config_app.go
├── config_disk.go
├── data/
│   └── test/
│       └── sample-data.json
├── doc.go
├── docs/
│   ├── create_and_search_your_first_index.md
│   ├── geo.md
│   ├── hierarchy.md
│   ├── index_update.md
│   ├── pagination.md
│   ├── persister.md
│   ├── query-openapi-spec.yaml
│   ├── score_fusion.md
│   ├── scoring.md
│   ├── search_autocomplete.md
│   ├── sort_facet.md
│   ├── synonyms.md
│   └── vectors.md
├── document/
│   ├── document.go
│   ├── document_test.go
│   ├── field.go
│   ├── field_boolean.go
│   ├── field_composite.go
│   ├── field_datetime.go
│   ├── field_geopoint.go
│   ├── field_geopoint_test.go
│   ├── field_geoshape.go
│   ├── field_ip.go
│   ├── field_ip_test.go
│   ├── field_numeric.go
│   ├── field_numeric_test.go
│   ├── field_synonym.go
│   ├── field_text.go
│   ├── field_vector.go
│   ├── field_vector_base64.go
│   └── field_vector_base64_test.go
├── error.go
├── examples_test.go
├── fusion/
│   ├── fusion.go
│   ├── rrf.go
│   ├── rrf_test.go
│   ├── rsf.go
│   ├── rsf_test.go
│   └── util.go
├── geo/
│   ├── README.md
│   ├── benchmark_geohash_test.go
│   ├── geo.go
│   ├── geo_dist.go
│   ├── geo_dist_test.go
│   ├── geo_s2plugin_impl.go
│   ├── geo_test.go
│   ├── geohash.go
│   ├── geohash_test.go
│   ├── parse.go
│   ├── parse_test.go
│   ├── sloppy.go
│   └── versus_test.go
├── go.mod
├── index/
│   ├── scorch/
│   │   ├── README.md
│   │   ├── builder.go
│   │   ├── builder_test.go
│   │   ├── empty.go
│   │   ├── event.go
│   │   ├── event_test.go
│   │   ├── field_dict_test.go
│   │   ├── int.go
│   │   ├── int_test.go
│   │   ├── introducer.go
│   │   ├── merge.go
│   │   ├── merge_test.go
│   │   ├── mergeplan/
│   │   │   ├── merge_plan.go
│   │   │   ├── merge_plan_test.go
│   │   │   └── sort.go
│   │   ├── optimize.go
│   │   ├── optimize_knn.go
│   │   ├── persister.go
│   │   ├── reader_test.go
│   │   ├── regexp.go
│   │   ├── regexp_test.go
│   │   ├── rollback.go
│   │   ├── rollback_test.go
│   │   ├── scorch.go
│   │   ├── scorch_test.go
│   │   ├── segment_plugin.go
│   │   ├── snapshot_index.go
│   │   ├── snapshot_index_dict.go
│   │   ├── snapshot_index_doc.go
│   │   ├── snapshot_index_str.go
│   │   ├── snapshot_index_test.go
│   │   ├── snapshot_index_tfr.go
│   │   ├── snapshot_index_thes.go
│   │   ├── snapshot_index_vr.go
│   │   ├── snapshot_segment.go
│   │   ├── snapshot_vector_index.go
│   │   ├── stats.go
│   │   └── unadorned.go
│   └── upsidedown/
│       ├── analysis.go
│       ├── analysis_test.go
│       ├── benchmark_all.sh
│       ├── benchmark_boltdb_test.go
│       ├── benchmark_common_test.go
│       ├── benchmark_gtreap_test.go
│       ├── benchmark_null_test.go
│       ├── dump.go
│       ├── dump_test.go
│       ├── field_cache.go
│       ├── field_dict.go
│       ├── field_dict_test.go
│       ├── index_reader.go
│       ├── protoc-README.md
│       ├── reader.go
│       ├── reader_test.go
│       ├── row.go
│       ├── row_merge.go
│       ├── row_merge_test.go
│       ├── row_test.go
│       ├── stats.go
│       ├── store/
│       │   ├── boltdb/
│       │   │   ├── iterator.go
│       │   │   ├── reader.go
│       │   │   ├── stats.go
│       │   │   ├── store.go
│       │   │   ├── store_test.go
│       │   │   └── writer.go
│       │   ├── goleveldb/
│       │   │   ├── batch.go
│       │   │   ├── config.go
│       │   │   ├── iterator.go
│       │   │   ├── reader.go
│       │   │   ├── store.go
│       │   │   ├── store_test.go
│       │   │   └── writer.go
│       │   ├── gtreap/
│       │   │   ├── iterator.go
│       │   │   ├── reader.go
│       │   │   ├── store.go
│       │   │   ├── store_test.go
│       │   │   └── writer.go
│       │   ├── metrics/
│       │   │   ├── batch.go
│       │   │   ├── iterator.go
│       │   │   ├── metrics_test.go
│       │   │   ├── reader.go
│       │   │   ├── stats.go
│       │   │   ├── store.go
│       │   │   ├── store_test.go
│       │   │   ├── util.go
│       │   │   └── writer.go
│       │   ├── moss/
│       │   │   ├── batch.go
│       │   │   ├── iterator.go
│       │   │   ├── lower.go
│       │   │   ├── lower_test.go
│       │   │   ├── reader.go
│       │   │   ├── stats.go
│       │   │   ├── store.go
│       │   │   ├── store_test.go
│       │   │   └── writer.go
│       │   └── null/
│       │       ├── null.go
│       │       └── null_test.go
│       ├── upsidedown.go
│       ├── upsidedown.pb.go
│       ├── upsidedown.proto
│       └── upsidedown_test.go
├── index.go
├── index_alias.go
├── index_alias_impl.go
├── index_alias_impl_test.go
├── index_impl.go
├── index_meta.go
├── index_meta_test.go
├── index_stats.go
├── index_test.go
├── index_update.go
├── index_update_test.go
├── mapping/
│   ├── analysis.go
│   ├── document.go
│   ├── examples_test.go
│   ├── field.go
│   ├── index.go
│   ├── mapping.go
│   ├── mapping_no_vectors.go
│   ├── mapping_test.go
│   ├── mapping_vectors.go
│   ├── mapping_vectors_test.go
│   ├── reflect.go
│   ├── reflect_test.go
│   └── synonym.go
├── mapping.go
├── mapping_vector.go
├── numeric/
│   ├── bin.go
│   ├── bin_test.go
│   ├── float.go
│   ├── float_test.go
│   ├── prefix_coded.go
│   └── prefix_coded_test.go
├── pre_search.go
├── query.go
├── query_bench_test.go
├── registry/
│   ├── analyzer.go
│   ├── cache.go
│   ├── char_filter.go
│   ├── datetime_parser.go
│   ├── fragment_formatter.go
│   ├── fragmenter.go
│   ├── highlighter.go
│   ├── index_type.go
│   ├── nested.go
│   ├── registry.go
│   ├── store.go
│   ├── synonym_source.go
│   ├── token_filter.go
│   ├── token_maps.go
│   └── tokenizer.go
├── rescorer.go
├── rescorer_knn_test.go
├── rescorer_test.go
├── search/
│   ├── collector/
│   │   ├── bench_test.go
│   │   ├── eligible.go
│   │   ├── heap.go
│   │   ├── knn.go
│   │   ├── list.go
│   │   ├── nested.go
│   │   ├── search_test.go
│   │   ├── slice.go
│   │   ├── topn.go
│   │   └── topn_test.go
│   ├── collector.go
│   ├── explanation.go
│   ├── facet/
│   │   ├── benchmark_data.txt
│   │   ├── facet_builder_datetime.go
│   │   ├── facet_builder_numeric.go
│   │   ├── facet_builder_numeric_test.go
│   │   ├── facet_builder_terms.go
│   │   └── facet_builder_terms_test.go
│   ├── facets_builder.go
│   ├── facets_builder_test.go
│   ├── highlight/
│   │   ├── format/
│   │   │   ├── ansi/
│   │   │   │   └── ansi.go
│   │   │   ├── html/
│   │   │   │   ├── html.go
│   │   │   │   └── html_test.go
│   │   │   └── plain/
│   │   │       ├── plain.go
│   │   │       └── plain_test.go
│   │   ├── fragmenter/
│   │   │   └── simple/
│   │   │       ├── simple.go
│   │   │       └── simple_test.go
│   │   ├── highlighter/
│   │   │   ├── ansi/
│   │   │   │   └── ansi.go
│   │   │   ├── html/
│   │   │   │   └── html.go
│   │   │   └── simple/
│   │   │       ├── fragment_scorer_simple.go
│   │   │       ├── fragment_scorer_simple_test.go
│   │   │       ├── highlighter_simple.go
│   │   │       └── highlighter_simple_test.go
│   │   ├── highlighter.go
│   │   ├── term_locations.go
│   │   └── term_locations_test.go
│   ├── levenshtein.go
│   ├── levenshtein_test.go
│   ├── pool.go
│   ├── pool_test.go
│   ├── query/
│   │   ├── bool_field.go
│   │   ├── boolean.go
│   │   ├── boost.go
│   │   ├── conjunction.go
│   │   ├── date_range.go
│   │   ├── date_range_string.go
│   │   ├── date_range_test.go
│   │   ├── disjunction.go
│   │   ├── docid.go
│   │   ├── fuzzy.go
│   │   ├── geo_boundingbox.go
│   │   ├── geo_boundingpolygon.go
│   │   ├── geo_distance.go
│   │   ├── geo_shape.go
│   │   ├── ip_range.go
│   │   ├── knn.go
│   │   ├── match.go
│   │   ├── match_all.go
│   │   ├── match_none.go
│   │   ├── match_phrase.go
│   │   ├── match_phrase_test.go
│   │   ├── multi_phrase.go
│   │   ├── numeric_range.go
│   │   ├── phrase.go
│   │   ├── prefix.go
│   │   ├── query.go
│   │   ├── query_string.go
│   │   ├── query_string.y
│   │   ├── query_string.y.go
│   │   ├── query_string_lex.go
│   │   ├── query_string_lex_test.go
│   │   ├── query_string_parser.go
│   │   ├── query_string_parser_test.go
│   │   ├── query_test.go
│   │   ├── regexp.go
│   │   ├── term.go
│   │   ├── term_range.go
│   │   └── wildcard.go
│   ├── scorer/
│   │   ├── scorer_conjunction.go
│   │   ├── scorer_constant.go
│   │   ├── scorer_constant_test.go
│   │   ├── scorer_disjunction.go
│   │   ├── scorer_knn.go
│   │   ├── scorer_knn_test.go
│   │   ├── scorer_term.go
│   │   ├── scorer_term_test.go
│   │   └── sqrt_cache.go
│   ├── search.go
│   ├── search_test.go
│   ├── searcher/
│   │   ├── base_test.go
│   │   ├── geoshape_contains_test.go
│   │   ├── geoshape_intersects_test.go
│   │   ├── geoshape_within_test.go
│   │   ├── optimize_knn.go
│   │   ├── optimize_no_knn.go
│   │   ├── ordered_searchers_list.go
│   │   ├── search_boolean.go
│   │   ├── search_boolean_test.go
│   │   ├── search_conjunction.go
│   │   ├── search_conjunction_nested.go
│   │   ├── search_conjunction_test.go
│   │   ├── search_disjunction.go
│   │   ├── search_disjunction_heap.go
│   │   ├── search_disjunction_slice.go
│   │   ├── search_disjunction_test.go
│   │   ├── search_docid.go
│   │   ├── search_docid_test.go
│   │   ├── search_filter.go
│   │   ├── search_fuzzy.go
│   │   ├── search_fuzzy_test.go
│   │   ├── search_geoboundingbox.go
│   │   ├── search_geoboundingbox_test.go
│   │   ├── search_geopointdistance.go
│   │   ├── search_geopointdistance_test.go
│   │   ├── search_geopolygon.go
│   │   ├── search_geopolygon_test.go
│   │   ├── search_geoshape.go
│   │   ├── search_geoshape_circle_test.go
│   │   ├── search_geoshape_envelope_test.go
│   │   ├── search_geoshape_geometrycollection_test.go
│   │   ├── search_geoshape_linestring_test.go
│   │   ├── search_geoshape_points_test.go
│   │   ├── search_geoshape_polygon_test.go
│   │   ├── search_ip_range.go
│   │   ├── search_ip_range_test.go
│   │   ├── search_knn.go
│   │   ├── search_match_all.go
│   │   ├── search_match_all_test.go
│   │   ├── search_match_none.go
│   │   ├── search_match_none_test.go
│   │   ├── search_multi_term.go
│   │   ├── search_numeric_range.go
│   │   ├── search_numeric_range_test.go
│   │   ├── search_phrase.go
│   │   ├── search_phrase_test.go
│   │   ├── search_regexp.go
│   │   ├── search_regexp_test.go
│   │   ├── search_term.go
│   │   ├── search_term_prefix.go
│   │   ├── search_term_range.go
│   │   ├── search_term_range_test.go
│   │   └── search_term_test.go
│   ├── sort.go
│   ├── sort_test.go
│   ├── util.go
│   └── util_test.go
├── search.go
├── search_knn.go
├── search_knn_test.go
├── search_nested_test.go
├── search_no_knn.go
├── search_test.go
├── size/
│   └── sizes.go
├── test/
│   ├── integration.go
│   ├── integration_test.go
│   ├── ip_field_test.go
│   ├── tests/
│   │   ├── alias/
│   │   │   ├── datasets/
│   │   │   │   ├── shard0/
│   │   │   │   │   ├── a.json
│   │   │   │   │   └── c.json
│   │   │   │   └── shard1/
│   │   │   │       ├── b.json
│   │   │   │       └── d.json
│   │   │   ├── mapping.json
│   │   │   └── searches.json
│   │   ├── basic/
│   │   │   ├── data/
│   │   │   │   ├── a.json
│   │   │   │   ├── b.json
│   │   │   │   ├── c.json
│   │   │   │   └── d.json
│   │   │   ├── mapping.json
│   │   │   └── searches.json
│   │   ├── employee/
│   │   │   ├── data/
│   │   │   │   └── emp10508560.json
│   │   │   ├── mapping.json
│   │   │   └── searches.json
│   │   ├── facet/
│   │   │   ├── data/
│   │   │   │   ├── a.json
│   │   │   │   ├── b.json
│   │   │   │   ├── c.json
│   │   │   │   ├── d.json
│   │   │   │   ├── e.json
│   │   │   │   ├── f.json
│   │   │   │   ├── g.json
│   │   │   │   ├── h.json
│   │   │   │   ├── i.json
│   │   │   │   └── j.json
│   │   │   ├── mapping.json
│   │   │   └── searches.json
│   │   ├── fosdem/
│   │   │   ├── data/
│   │   │   │   ├── 3311@FOSDEM15@fosdem.org.json
│   │   │   │   ├── 3492@FOSDEM15@fosdem.org.json
│   │   │   │   ├── 3496@FOSDEM15@fosdem.org.json
│   │   │   │   ├── 3505@FOSDEM15@fosdem.org.json
│   │   │   │   └── 3507@FOSDEM15@fosdem.org.json
│   │   │   ├── mapping.json
│   │   │   └── searches.json
│   │   ├── geo/
│   │   │   ├── data/
│   │   │   │   ├── amoeba_brewery.json
│   │   │   │   ├── brewpub_on_the_green.json
│   │   │   │   ├── capital_city_brewing_company.json
│   │   │   │   ├── communiti_brewery.json
│   │   │   │   ├── firehouse_grill_brewery.json
│   │   │   │   ├── hook_ladder_brewing_company.json
│   │   │   │   ├── jack_s_brewing.json
│   │   │   │   ├── social_brewery.json
│   │   │   │   └── sweet_water_tavern_and_brewery.json
│   │   │   ├── mapping.json
│   │   │   └── searches.json
│   │   ├── geoshapes/
│   │   │   ├── data/
│   │   │   │   ├── circle_halairport.json
│   │   │   │   ├── envelope_brockwell_park.json
│   │   │   │   ├── geometrycollection_tvm.json
│   │   │   │   ├── linestring_putney_bridge.json
│   │   │   │   ├── multilinestring_old_airport_road.json
│   │   │   │   ├── multipoint_blr_stadiums.json
│   │   │   │   ├── multipolygon_london_parks.json
│   │   │   │   ├── point_museum_of_london.json
│   │   │   │   └── polygon_cubbonpark.json
│   │   │   ├── mapping.json
│   │   │   └── searches.json
│   │   ├── phrase/
│   │   │   ├── data/
│   │   │   │   ├── a.json
│   │   │   │   └── b.json
│   │   │   ├── mapping.json
│   │   │   └── searches.json
│   │   └── sort/
│   │       ├── data/
│   │       │   ├── a.json
│   │       │   ├── b.json
│   │       │   ├── c.json
│   │       │   ├── d.json
│   │       │   ├── e.json
│   │       │   └── f.json
│   │       ├── mapping.json
│   │       └── searches.json
│   ├── versus_score_test.go
│   └── versus_test.go
└── util/
    ├── extract.go
    ├── json.go
    └── keys.go
Download .txt
Showing preview only (460K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (5003 symbols across 653 files)

FILE: analysis/analyzer/custom/custom.go
  constant Name (line 24) | Name = "custom"
  function AnalyzerConstructor (line 26) | func AnalyzerConstructor(config map[string]interface{}, cache *registry....
  function init (line 103) | func init() {
  function getCharFilters (line 110) | func getCharFilters(charFilterNames []string, cache *registry.Cache) ([]...
  function getTokenFilters (line 123) | func getTokenFilters(tokenFilterNames []string, cache *registry.Cache) (...
  function convertInterfaceSliceToStringSlice (line 136) | func convertInterfaceSliceToStringSlice(interfaceSlice []interface{}, ob...

FILE: analysis/analyzer/keyword/keyword.go
  constant Name (line 23) | Name = "keyword"
  function AnalyzerConstructor (line 25) | func AnalyzerConstructor(config map[string]interface{}, cache *registry....
  function init (line 36) | func init() {

FILE: analysis/analyzer/simple/simple.go
  constant Name (line 24) | Name = "simple"
  function AnalyzerConstructor (line 26) | func AnalyzerConstructor(config map[string]interface{}, cache *registry....
  function init (line 44) | func init() {

FILE: analysis/analyzer/standard/standard.go
  constant Name (line 25) | Name = "standard"
  function AnalyzerConstructor (line 27) | func AnalyzerConstructor(config map[string]interface{}, cache *registry....
  function init (line 50) | func init() {

FILE: analysis/analyzer/web/web.go
  constant Name (line 25) | Name = "web"
  function AnalyzerConstructor (line 27) | func AnalyzerConstructor(config map[string]interface{}, cache *registry....
  function init (line 50) | func init() {

FILE: analysis/benchmark_test.go
  function BenchmarkAnalysis (line 26) | func BenchmarkAnalysis(b *testing.B) {

FILE: analysis/char/asciifolding/asciifolding.go
  constant Name (line 25) | Name = "asciifolding"
  type AsciiFoldingFilter (line 27) | type AsciiFoldingFilter struct
    method Filter (line 33) | func (s *AsciiFoldingFilter) Filter(input []byte) []byte {
  function New (line 29) | func New() *AsciiFoldingFilter {
  function AsciiFoldingFilterConstructor (line 48) | func AsciiFoldingFilterConstructor(config map[string]interface{}, cache ...
  function init (line 52) | func init() {
  function foldToASCII (line 61) | func foldToASCII(input []rune, inputPos int, output []rune, outputPos in...

FILE: analysis/char/asciifolding/asciifolding_test.go
  function TestAsciiFoldingFilter (line 23) | func TestAsciiFoldingFilter(t *testing.T) {

FILE: analysis/char/html/html.go
  constant Name (line 25) | Name = "html"
  type CharFilter (line 29) | type CharFilter struct
    method Filter (line 41) | func (s *CharFilter) Filter(input []byte) []byte {
  function New (line 34) | func New() *CharFilter {
  function CharFilterConstructor (line 48) | func CharFilterConstructor(config map[string]interface{}, cache *registr...
  function init (line 52) | func init() {

FILE: analysis/char/regexp/regexp.go
  constant Name (line 25) | Name = "regexp"
  type CharFilter (line 27) | type CharFilter struct
    method Filter (line 39) | func (s *CharFilter) Filter(input []byte) []byte {
  function New (line 32) | func New(r *regexp.Regexp, replacement []byte) *CharFilter {
  function CharFilterConstructor (line 43) | func CharFilterConstructor(config map[string]interface{}, cache *registr...
  function init (line 60) | func init() {

FILE: analysis/char/regexp/regexp_test.go
  function TestRegexpCharFilter (line 24) | func TestRegexpCharFilter(t *testing.T) {

FILE: analysis/char/zerowidthnonjoiner/zerowidthnonjoiner.go
  constant Name (line 25) | Name = "zero_width_spaces"
  function CharFilterConstructor (line 29) | func CharFilterConstructor(config map[string]interface{}, cache *registr...
  function init (line 34) | func init() {

FILE: analysis/datetime/flexible/flexible.go
  constant Name (line 25) | Name = "flexiblego"
  type DateTimeParser (line 27) | type DateTimeParser struct
    method ParseDateTime (line 37) | func (p *DateTimeParser) ParseDateTime(input string) (time.Time, strin...
  function New (line 31) | func New(layouts []string) *DateTimeParser {
  function DateTimeParserConstructor (line 47) | func DateTimeParserConstructor(config map[string]interface{}, cache *reg...
  function init (line 62) | func init() {

FILE: analysis/datetime/flexible/flexible_test.go
  function TestFlexibleDateTimeParser (line 25) | func TestFlexibleDateTimeParser(t *testing.T) {

FILE: analysis/datetime/iso/iso.go
  constant Name (line 26) | Name = "isostyle"
  type DateTimeParser (line 88) | type DateTimeParser struct
    method ParseDateTime (line 98) | func (p *DateTimeParser) ParseDateTime(input string) (time.Time, strin...
  function New (line 92) | func New(layouts []string) *DateTimeParser {
  function letterCounter (line 108) | func letterCounter(layout string, idx int) int {
  function invalidFormatError (line 120) | func invalidFormatError(character byte, count int) error {
  function parseISOString (line 124) | func parseISOString(layout string) (string, error) {
  function DateTimeParserConstructor (line 226) | func DateTimeParserConstructor(config map[string]interface{}, cache *reg...
  function init (line 245) | func init() {

FILE: analysis/datetime/iso/iso_test.go
  function TestConversionFromISOStyle (line 22) | func TestConversionFromISOStyle(t *testing.T) {

FILE: analysis/datetime/optional/optional.go
  constant Name (line 25) | Name = "dateTimeOptional"
  constant rfc3339NoTimezone (line 27) | rfc3339NoTimezone = "2006-01-02T15:04:05"
  constant rfc3339NoTimezoneNoT (line 28) | rfc3339NoTimezoneNoT = "2006-01-02 15:04:05"
  constant rfc3339Offset (line 29) | rfc3339Offset = "2006-01-02 15:04:05 -0700"
  constant rfc3339NoTime (line 30) | rfc3339NoTime = "2006-01-02"
  function DateTimeParserConstructor (line 41) | func DateTimeParserConstructor(config map[string]interface{}, cache *reg...
  function init (line 45) | func init() {

FILE: analysis/datetime/percent/percent.go
  constant Name (line 26) | Name = "percentstyle"
  type DateTimeParser (line 73) | type DateTimeParser struct
    method ParseDateTime (line 169) | func (p *DateTimeParser) ParseDateTime(input string) (time.Time, strin...
  function New (line 77) | func New(layouts []string) *DateTimeParser {
  function checkTZOptions (line 83) | func checkTZOptions(formatString string, idx int) (string, int) {
  function parseFormatString (line 136) | func parseFormatString(formatString string) (string, error) {
  function DateTimeParserConstructor (line 179) | func DateTimeParserConstructor(config map[string]interface{}, cache *reg...
  function init (line 200) | func init() {

FILE: analysis/datetime/percent/percent_test.go
  function TestConversionFromPercentStyle (line 26) | func TestConversionFromPercentStyle(t *testing.T) {
  function TestDateTimeParser_ParseDateTime (line 246) | func TestDateTimeParser_ParseDateTime(t *testing.T) {
  function TestDateTimeParserConstructor (line 353) | func TestDateTimeParserConstructor(t *testing.T) {

FILE: analysis/datetime/sanitized/sanitized.go
  constant Name (line 26) | Name = "sanitizedgo"
  type DateTimeParser (line 61) | type DateTimeParser struct
    method ParseDateTime (line 71) | func (p *DateTimeParser) ParseDateTime(input string) (time.Time, strin...
  function New (line 65) | func New(layouts []string) *DateTimeParser {
  function validateLayout (line 85) | func validateLayout(layout string) bool {
  function DateTimeParserConstructor (line 105) | func DateTimeParserConstructor(config map[string]interface{}, cache *reg...
  function init (line 125) | func init() {

FILE: analysis/datetime/sanitized/sanitized_test.go
  function TestLayoutValidatorRegex (line 22) | func TestLayoutValidatorRegex(t *testing.T) {

FILE: analysis/datetime/timestamp/microseconds/microseconds.go
  constant Name (line 26) | Name = "unix_micro"
  type DateTimeParser (line 28) | type DateTimeParser struct
    method ParseDateTime (line 34) | func (p *DateTimeParser) ParseDateTime(input string) (time.Time, strin...
  function DateTimeParserConstructor (line 46) | func DateTimeParserConstructor(config map[string]interface{}, cache *reg...
  function init (line 50) | func init() {

FILE: analysis/datetime/timestamp/milliseconds/milliseconds.go
  constant Name (line 26) | Name = "unix_milli"
  type DateTimeParser (line 28) | type DateTimeParser struct
    method ParseDateTime (line 34) | func (p *DateTimeParser) ParseDateTime(input string) (time.Time, strin...
  function DateTimeParserConstructor (line 46) | func DateTimeParserConstructor(config map[string]interface{}, cache *reg...
  function init (line 50) | func init() {

FILE: analysis/datetime/timestamp/nanoseconds/nanoseconds.go
  constant Name (line 26) | Name = "unix_nano"
  type DateTimeParser (line 28) | type DateTimeParser struct
    method ParseDateTime (line 34) | func (p *DateTimeParser) ParseDateTime(input string) (time.Time, strin...
  function DateTimeParserConstructor (line 46) | func DateTimeParserConstructor(config map[string]interface{}, cache *reg...
  function init (line 50) | func init() {

FILE: analysis/datetime/timestamp/seconds/seconds.go
  constant Name (line 26) | Name = "unix_sec"
  type DateTimeParser (line 28) | type DateTimeParser struct
    method ParseDateTime (line 34) | func (p *DateTimeParser) ParseDateTime(input string) (time.Time, strin...
  function DateTimeParserConstructor (line 46) | func DateTimeParserConstructor(config map[string]interface{}, cache *reg...
  function init (line 50) | func init() {

FILE: analysis/freq.go
  function TokenFrequency (line 21) | func TokenFrequency(tokens TokenStream, arrayPositions []uint64, options...

FILE: analysis/freq_test.go
  function TestTokenFrequency (line 23) | func TestTokenFrequency(t *testing.T) {

FILE: analysis/lang/ar/analyzer_ar.go
  constant AnalyzerName (line 26) | AnalyzerName = "ar"
  function AnalyzerConstructor (line 28) | func AnalyzerConstructor(config map[string]interface{}, cache *registry....
  function init (line 63) | func init() {

FILE: analysis/lang/ar/analyzer_ar_test.go
  function TestArabicAnalyzer (line 25) | func TestArabicAnalyzer(t *testing.T) {

FILE: analysis/lang/ar/arabic_normalize.go
  constant NormalizeName (line 24) | NormalizeName = "normalize_ar"
  constant Alef (line 27) | Alef           = '\u0627'
  constant AlefMadda (line 28) | AlefMadda      = '\u0622'
  constant AlefHamzaAbove (line 29) | AlefHamzaAbove = '\u0623'
  constant AlefHamzaBelow (line 30) | AlefHamzaBelow = '\u0625'
  constant Yeh (line 31) | Yeh            = '\u064A'
  constant DotlessYeh (line 32) | DotlessYeh     = '\u0649'
  constant TehMarbuta (line 33) | TehMarbuta     = '\u0629'
  constant Heh (line 34) | Heh            = '\u0647'
  constant Tatweel (line 35) | Tatweel        = '\u0640'
  constant Fathatan (line 36) | Fathatan       = '\u064B'
  constant Dammatan (line 37) | Dammatan       = '\u064C'
  constant Kasratan (line 38) | Kasratan       = '\u064D'
  constant Fatha (line 39) | Fatha          = '\u064E'
  constant Damma (line 40) | Damma          = '\u064F'
  constant Kasra (line 41) | Kasra          = '\u0650'
  constant Shadda (line 42) | Shadda         = '\u0651'
  constant Sukun (line 43) | Sukun          = '\u0652'
  type ArabicNormalizeFilter (line 46) | type ArabicNormalizeFilter struct
    method Filter (line 53) | func (s *ArabicNormalizeFilter) Filter(input analysis.TokenStream) ana...
  function NewArabicNormalizeFilter (line 49) | func NewArabicNormalizeFilter() *ArabicNormalizeFilter {
  function normalize (line 61) | func normalize(input []byte) []byte {
  function NormalizerFilterConstructor (line 79) | func NormalizerFilterConstructor(config map[string]interface{}, cache *r...
  function init (line 83) | func init() {

FILE: analysis/lang/ar/arabic_normalize_test.go
  function TestArabicNormalizeFilter (line 24) | func TestArabicNormalizeFilter(t *testing.T) {

FILE: analysis/lang/ar/stemmer_ar.go
  constant StemmerName (line 24) | StemmerName = "stemmer_ar"
  type ArabicStemmerFilter (line 49) | type ArabicStemmerFilter struct
    method Filter (line 55) | func (s *ArabicStemmerFilter) Filter(input analysis.TokenStream) analy...
  function NewArabicStemmerFilter (line 51) | func NewArabicStemmerFilter() *ArabicStemmerFilter {
  function canStemPrefix (line 63) | func canStemPrefix(input, prefix []rune) bool {
  function canStemSuffix (line 80) | func canStemSuffix(input, suffix []rune) bool {
  function stem (line 94) | func stem(input []byte) []byte {
  function StemmerFilterConstructor (line 112) | func StemmerFilterConstructor(config map[string]interface{}, cache *regi...
  function init (line 116) | func init() {

FILE: analysis/lang/ar/stemmer_ar_test.go
  function TestArabicStemmerFilter (line 24) | func TestArabicStemmerFilter(t *testing.T) {

FILE: analysis/lang/ar/stop_filter_ar.go
  function StopTokenFilterConstructor (line 23) | func StopTokenFilterConstructor(config map[string]interface{}, cache *re...
  function init (line 31) | func init() {

FILE: analysis/lang/ar/stop_words_ar.go
  constant StopName (line 8) | StopName = "stop_ar"
  function TokenMapConstructor (line 141) | func TokenMapConstructor(config map[string]interface{}, cache *registry....
  function init (line 147) | func init() {

FILE: analysis/lang/bg/stop_filter_bg.go
  function StopTokenFilterConstructor (line 23) | func StopTokenFilterConstructor(config map[string]interface{}, cache *re...
  function init (line 31) | func init() {

FILE: analysis/lang/bg/stop_words_bg.go
  constant StopName (line 8) | StopName = "stop_bg"
  function TokenMapConstructor (line 209) | func TokenMapConstructor(config map[string]interface{}, cache *registry....
  function init (line 215) | func init() {

FILE: analysis/lang/ca/articles_ca.go
  constant ArticlesName (line 8) | ArticlesName = "articles_ca"
  function ArticlesTokenMapConstructor (line 22) | func ArticlesTokenMapConstructor(config map[string]interface{}, cache *r...
  function init (line 28) | func init() {

FILE: analysis/lang/ca/elision_ca.go
  constant ElisionName (line 25) | ElisionName = "elision_ca"
  function ElisionFilterConstructor (line 27) | func ElisionFilterConstructor(config map[string]interface{}, cache *regi...
  function init (line 35) | func init() {

FILE: analysis/lang/ca/elision_ca_test.go
  function TestFrenchElision (line 25) | func TestFrenchElision(t *testing.T) {

FILE: analysis/lang/ca/stop_filter_ca.go
  function StopTokenFilterConstructor (line 23) | func StopTokenFilterConstructor(config map[string]interface{}, cache *re...
  function init (line 31) | func init() {

FILE: analysis/lang/ca/stop_words_ca.go
  constant StopName (line 8) | StopName = "stop_ca"
  function TokenMapConstructor (line 236) | func TokenMapConstructor(config map[string]interface{}, cache *registry....
  function init (line 242) | func init() {

FILE: analysis/lang/cjk/analyzer_cjk.go
  constant AnalyzerName (line 25) | AnalyzerName = "cjk"
  function AnalyzerConstructor (line 27) | func AnalyzerConstructor(config map[string]interface{}, cache *registry....
  function init (line 55) | func init() {

FILE: analysis/lang/cjk/analyzer_cjk_test.go
  function TestCJKAnalyzer (line 25) | func TestCJKAnalyzer(t *testing.T) {
  function BenchmarkCJKAnalyzer (line 627) | func BenchmarkCJKAnalyzer(b *testing.B) {

FILE: analysis/lang/cjk/cjk_bigram.go
  constant BigramName (line 26) | BigramName = "cjk_bigram"
  type CJKBigramFilter (line 28) | type CJKBigramFilter struct
    method Filter (line 38) | func (s *CJKBigramFilter) Filter(input analysis.TokenStream) analysis....
    method flush (line 128) | func (s *CJKBigramFilter) flush(r *ring.Ring, itemsInRing *int, pos in...
    method outputBigram (line 139) | func (s *CJKBigramFilter) outputBigram(r *ring.Ring, itemsInRing *int,...
    method buildUnigram (line 166) | func (s *CJKBigramFilter) buildUnigram(r *ring.Ring, itemsInRing *int,...
  function NewCJKBigramFilter (line 32) | func NewCJKBigramFilter(outputUnigram bool) *CJKBigramFilter {
  function CJKBigramFilterConstructor (line 196) | func CJKBigramFilterConstructor(config map[string]interface{}, cache *re...
  function init (line 205) | func init() {

FILE: analysis/lang/cjk/cjk_bigram_test.go
  function makeToken (line 26) | func makeToken(term string, start, end, pos int) *analysis.Token {
  function TestCJKBigramFilter_buildUnigram (line 36) | func TestCJKBigramFilter_buildUnigram(t *testing.T) {
  function TestCJKBigramFilter_outputBigram (line 149) | func TestCJKBigramFilter_outputBigram(t *testing.T) {
  function TestCJKBigramFilter (line 257) | func TestCJKBigramFilter(t *testing.T) {

FILE: analysis/lang/cjk/cjk_width.go
  constant WidthName (line 25) | WidthName = "cjk_width"
  type CJKWidthFilter (line 27) | type CJKWidthFilter struct
    method Filter (line 33) | func (s *CJKWidthFilter) Filter(input analysis.TokenStream) analysis.T...
  function NewCJKWidthFilter (line 29) | func NewCJKWidthFilter() *CJKWidthFilter {
  function combine (line 82) | func combine(text []rune, pos int, r rune) bool {
  function CJKWidthFilterConstructor (line 95) | func CJKWidthFilterConstructor(config map[string]interface{}, cache *reg...
  function init (line 99) | func init() {

FILE: analysis/lang/cjk/cjk_width_test.go
  function TestCJKWidthFilter (line 24) | func TestCJKWidthFilter(t *testing.T) {

FILE: analysis/lang/ckb/analyzer_ckb.go
  constant AnalyzerName (line 24) | AnalyzerName = "ckb"
  function AnalyzerConstructor (line 26) | func AnalyzerConstructor(config map[string]interface{}, cache *registry....
  function init (line 59) | func init() {

FILE: analysis/lang/ckb/analyzer_ckb_test.go
  function TestSoraniAnalyzer (line 25) | func TestSoraniAnalyzer(t *testing.T) {

FILE: analysis/lang/ckb/sorani_normalize.go
  constant NormalizeName (line 25) | NormalizeName = "normalize_ckb"
  constant Yeh (line 28) | Yeh        = '\u064A'
  constant DotlessYeh (line 29) | DotlessYeh = '\u0649'
  constant FarsiYeh (line 30) | FarsiYeh   = '\u06CC'
  constant Kaf (line 32) | Kaf   = '\u0643'
  constant Keheh (line 33) | Keheh = '\u06A9'
  constant Heh (line 35) | Heh            = '\u0647'
  constant Ae (line 36) | Ae             = '\u06D5'
  constant Zwnj (line 37) | Zwnj           = '\u200C'
  constant HehDoachashmee (line 38) | HehDoachashmee = '\u06BE'
  constant TehMarbuta (line 39) | TehMarbuta     = '\u0629'
  constant Reh (line 41) | Reh       = '\u0631'
  constant Rreh (line 42) | Rreh      = '\u0695'
  constant RrehAbove (line 43) | RrehAbove = '\u0692'
  constant Tatweel (line 45) | Tatweel  = '\u0640'
  constant Fathatan (line 46) | Fathatan = '\u064B'
  constant Dammatan (line 47) | Dammatan = '\u064C'
  constant Kasratan (line 48) | Kasratan = '\u064D'
  constant Fatha (line 49) | Fatha    = '\u064E'
  constant Damma (line 50) | Damma    = '\u064F'
  constant Kasra (line 51) | Kasra    = '\u0650'
  constant Shadda (line 52) | Shadda   = '\u0651'
  constant Sukun (line 53) | Sukun    = '\u0652'
  type SoraniNormalizeFilter (line 56) | type SoraniNormalizeFilter struct
    method Filter (line 63) | func (s *SoraniNormalizeFilter) Filter(input analysis.TokenStream) ana...
  function NewSoraniNormalizeFilter (line 59) | func NewSoraniNormalizeFilter() *SoraniNormalizeFilter {
  function normalize (line 71) | func normalize(input []byte) []byte {
  function NormalizerFilterConstructor (line 112) | func NormalizerFilterConstructor(config map[string]interface{}, cache *r...
  function init (line 116) | func init() {

FILE: analysis/lang/ckb/sorani_normalize_test.go
  function TestSoraniNormalizeFilter (line 24) | func TestSoraniNormalizeFilter(t *testing.T) {

FILE: analysis/lang/ckb/sorani_stemmer_filter.go
  constant StemmerName (line 25) | StemmerName = "stemmer_ckb"
  type SoraniStemmerFilter (line 27) | type SoraniStemmerFilter struct
    method Filter (line 34) | func (s *SoraniStemmerFilter) Filter(input analysis.TokenStream) analy...
  function NewSoraniStemmerFilter (line 30) | func NewSoraniStemmerFilter() *SoraniStemmerFilter {
  function stem (line 45) | func stem(input []byte) []byte {
  function truncateRunes (line 125) | func truncateRunes(input []byte, num int) []byte {
  function buildTermFromRunes (line 132) | func buildTermFromRunes(runes []rune) []byte {
  function StemmerFilterConstructor (line 142) | func StemmerFilterConstructor(config map[string]interface{}, cache *regi...
  function init (line 146) | func init() {

FILE: analysis/lang/ckb/sorani_stemmer_filter_test.go
  function TestSoraniStemmerFilter (line 25) | func TestSoraniStemmerFilter(t *testing.T) {

FILE: analysis/lang/ckb/stop_filter_ckb.go
  function StopTokenFilterConstructor (line 23) | func StopTokenFilterConstructor(config map[string]interface{}, cache *re...
  function init (line 31) | func init() {

FILE: analysis/lang/ckb/stop_words_ckb.go
  constant StopName (line 8) | StopName = "stop_ckb"
  function TokenMapConstructor (line 152) | func TokenMapConstructor(config map[string]interface{}, cache *registry....
  function init (line 158) | func init() {

FILE: analysis/lang/cs/stop_filter_cs.go
  function StopTokenFilterConstructor (line 23) | func StopTokenFilterConstructor(config map[string]interface{}, cache *re...
  function init (line 31) | func init() {

FILE: analysis/lang/cs/stop_words_cs.go
  constant StopName (line 8) | StopName = "stop_cs"
  function TokenMapConstructor (line 188) | func TokenMapConstructor(config map[string]interface{}, cache *registry....
  function init (line 194) | func init() {

FILE: analysis/lang/da/analyzer_da.go
  constant AnalyzerName (line 24) | AnalyzerName = "da"
  function AnalyzerConstructor (line 26) | func AnalyzerConstructor(config map[string]interface{}, cache *registry....
  function init (line 54) | func init() {

FILE: analysis/lang/da/analyzer_da_test.go
  function TestDanishAnalyzer (line 25) | func TestDanishAnalyzer(t *testing.T) {

FILE: analysis/lang/da/stemmer_da.go
  constant SnowballStemmerName (line 25) | SnowballStemmerName = "stemmer_da_snowball"
  type DanishStemmerFilter (line 27) | type DanishStemmerFilter struct
    method Filter (line 34) | func (s *DanishStemmerFilter) Filter(input analysis.TokenStream) analy...
  function NewDanishStemmerFilter (line 30) | func NewDanishStemmerFilter() *DanishStemmerFilter {
  function DanishStemmerFilterConstructor (line 43) | func DanishStemmerFilterConstructor(config map[string]interface{}, cache...
  function init (line 47) | func init() {

FILE: analysis/lang/da/stop_filter_da.go
  function StopTokenFilterConstructor (line 23) | func StopTokenFilterConstructor(config map[string]interface{}, cache *re...
  function init (line 31) | func init() {

FILE: analysis/lang/da/stop_words_da.go
  constant StopName (line 8) | StopName = "stop_da"
  function TokenMapConstructor (line 126) | func TokenMapConstructor(config map[string]interface{}, cache *registry....
  function init (line 132) | func init() {

FILE: analysis/lang/de/analyzer_de.go
  constant AnalyzerName (line 24) | AnalyzerName = "de"
  function AnalyzerConstructor (line 26) | func AnalyzerConstructor(config map[string]interface{}, cache *registry....
  function init (line 59) | func init() {

FILE: analysis/lang/de/analyzer_de_test.go
  function TestGermanAnalyzer (line 25) | func TestGermanAnalyzer(t *testing.T) {

FILE: analysis/lang/de/german_normalize.go
  constant NormalizeName (line 24) | NormalizeName = "normalize_de"
  constant N (line 27) | N = 0
  constant V (line 28) | V = 1
  constant U (line 29) | U = 2
  type GermanNormalizeFilter (line 32) | type GermanNormalizeFilter struct
    method Filter (line 39) | func (s *GermanNormalizeFilter) Filter(input analysis.TokenStream) ana...
  function NewGermanNormalizeFilter (line 35) | func NewGermanNormalizeFilter() *GermanNormalizeFilter {
  function normalize (line 47) | func normalize(input []byte) []byte {
  function NormalizerFilterConstructor (line 89) | func NormalizerFilterConstructor(config map[string]interface{}, cache *r...
  function init (line 93) | func init() {

FILE: analysis/lang/de/german_normalize_test.go
  function TestGermanNormalizeFilter (line 24) | func TestGermanNormalizeFilter(t *testing.T) {

FILE: analysis/lang/de/light_stemmer_de.go
  constant LightStemmerName (line 24) | LightStemmerName = "stemmer_de_light"
  type GermanLightStemmerFilter (line 26) | type GermanLightStemmerFilter struct
    method Filter (line 33) | func (s *GermanLightStemmerFilter) Filter(input analysis.TokenStream) ...
  function NewGermanLightStemmerFilter (line 29) | func NewGermanLightStemmerFilter() *GermanLightStemmerFilter {
  function stem (line 42) | func stem(input []rune) []rune {
  function stEnding (line 61) | func stEnding(ch rune) bool {
  function step1 (line 69) | func step1(s []rune) []rune {
  function step2 (line 93) | func step2(s []rune) []rune {
  function GermanLightStemmerFilterConstructor (line 110) | func GermanLightStemmerFilterConstructor(config map[string]interface{}, ...
  function init (line 114) | func init() {

FILE: analysis/lang/de/stemmer_de_snowball.go
  constant SnowballStemmerName (line 25) | SnowballStemmerName = "stemmer_de_snowball"
  type GermanStemmerFilter (line 27) | type GermanStemmerFilter struct
    method Filter (line 34) | func (s *GermanStemmerFilter) Filter(input analysis.TokenStream) analy...
  function NewGermanStemmerFilter (line 30) | func NewGermanStemmerFilter() *GermanStemmerFilter {
  function GermanStemmerFilterConstructor (line 43) | func GermanStemmerFilterConstructor(config map[string]interface{}, cache...
  function init (line 47) | func init() {

FILE: analysis/lang/de/stemmer_de_test.go
  function TestSnowballGermanStemmer (line 25) | func TestSnowballGermanStemmer(t *testing.T) {

FILE: analysis/lang/de/stop_filter_de.go
  function StopTokenFilterConstructor (line 23) | func StopTokenFilterConstructor(config map[string]interface{}, cache *re...
  function init (line 31) | func init() {

FILE: analysis/lang/de/stop_words_de.go
  constant StopName (line 8) | StopName = "stop_de"
  function TokenMapConstructor (line 310) | func TokenMapConstructor(config map[string]interface{}, cache *registry....
  function init (line 316) | func init() {

FILE: analysis/lang/el/stop_filter_el.go
  function StopTokenFilterConstructor (line 23) | func StopTokenFilterConstructor(config map[string]interface{}, cache *re...
  function init (line 31) | func init() {

FILE: analysis/lang/el/stop_words_el.go
  constant StopName (line 8) | StopName = "stop_el"
  function TokenMapConstructor (line 94) | func TokenMapConstructor(config map[string]interface{}, cache *registry....
  function init (line 100) | func init() {

FILE: analysis/lang/en/analyzer_en.go
  constant AnalyzerName (line 33) | AnalyzerName = "en"
  function AnalyzerConstructor (line 35) | func AnalyzerConstructor(config map[string]interface{}, cache *registry....
  function init (line 68) | func init() {

FILE: analysis/lang/en/analyzer_en_test.go
  function TestEnglishAnalyzer (line 25) | func TestEnglishAnalyzer(t *testing.T) {

FILE: analysis/lang/en/plural_stemmer.go
  constant PluralStemmerName (line 44) | PluralStemmerName = "stemmer_en_plural"
  type EnglishPluralStemmerFilter (line 46) | type EnglishPluralStemmerFilter struct
    method Filter (line 53) | func (s *EnglishPluralStemmerFilter) Filter(input analysis.TokenStream...
  function NewEnglishPluralStemmerFilter (line 49) | func NewEnglishPluralStemmerFilter() *EnglishPluralStemmerFilter {
  function EnglishPluralStemmerFilterConstructor (line 61) | func EnglishPluralStemmerFilterConstructor(config map[string]interface{}...
  function init (line 65) | func init() {
  function stem (line 91) | func stem(word string) string {
  function isException (line 155) | func isException(word []rune, exceptions []string) bool {

FILE: analysis/lang/en/plural_stemmer_test.go
  function TestEnglishPluralStemmer (line 5) | func TestEnglishPluralStemmer(t *testing.T) {

FILE: analysis/lang/en/possessive_filter_en.go
  constant PossessiveName (line 26) | PossessiveName = "possessive_en"
  constant rightSingleQuotationMark (line 28) | rightSingleQuotationMark = '’'
  constant apostrophe (line 29) | apostrophe = '\''
  constant fullWidthApostrophe (line 30) | fullWidthApostrophe = '''
  constant apostropheChars (line 32) | apostropheChars = rightSingleQuotationMark + apostrophe + fullWidthApost...
  type PossessiveFilter (line 39) | type PossessiveFilter struct
    method Filter (line 46) | func (s *PossessiveFilter) Filter(input analysis.TokenStream) analysis...
  function NewPossessiveFilter (line 42) | func NewPossessiveFilter() *PossessiveFilter {
  function PossessiveFilterConstructor (line 61) | func PossessiveFilterConstructor(config map[string]interface{}, cache *r...
  function init (line 65) | func init() {

FILE: analysis/lang/en/possessive_filter_en_test.go
  function TestEnglishPossessiveFilter (line 25) | func TestEnglishPossessiveFilter(t *testing.T) {
  function BenchmarkEnglishPossessiveFilter (line 105) | func BenchmarkEnglishPossessiveFilter(b *testing.B) {

FILE: analysis/lang/en/stemmer_en_snowball.go
  constant SnowballStemmerName (line 25) | SnowballStemmerName = "stemmer_en_snowball"
  type EnglishStemmerFilter (line 27) | type EnglishStemmerFilter struct
    method Filter (line 34) | func (s *EnglishStemmerFilter) Filter(input analysis.TokenStream) anal...
  function NewEnglishStemmerFilter (line 30) | func NewEnglishStemmerFilter() *EnglishStemmerFilter {
  function EnglishStemmerFilterConstructor (line 43) | func EnglishStemmerFilterConstructor(config map[string]interface{}, cach...
  function init (line 47) | func init() {

FILE: analysis/lang/en/stemmer_en_test.go
  function TestSnowballEnglishStemmer (line 25) | func TestSnowballEnglishStemmer(t *testing.T) {

FILE: analysis/lang/en/stop_filter_en.go
  function StopTokenFilterConstructor (line 23) | func StopTokenFilterConstructor(config map[string]interface{}, cache *re...
  function init (line 31) | func init() {

FILE: analysis/lang/en/stop_words_en.go
  constant StopName (line 8) | StopName = "stop_en"
  function TokenMapConstructor (line 336) | func TokenMapConstructor(config map[string]interface{}, cache *registry....
  function init (line 342) | func init() {

FILE: analysis/lang/es/analyzer_es.go
  constant AnalyzerName (line 25) | AnalyzerName = "es"
  function AnalyzerConstructor (line 27) | func AnalyzerConstructor(config map[string]interface{},
  function init (line 61) | func init() {

FILE: analysis/lang/es/analyzer_es_test.go
  function TestSpanishAnalyzer (line 25) | func TestSpanishAnalyzer(t *testing.T) {

FILE: analysis/lang/es/light_stemmer_es.go
  constant LightStemmerName (line 24) | LightStemmerName = "stemmer_es_light"
  type SpanishLightStemmerFilter (line 26) | type SpanishLightStemmerFilter struct
    method Filter (line 33) | func (s *SpanishLightStemmerFilter) Filter(
  function NewSpanishLightStemmerFilter (line 29) | func NewSpanishLightStemmerFilter() *SpanishLightStemmerFilter {
  function stem (line 43) | func stem(input []rune) []rune {
  function SpanishLightStemmerFilterConstructor (line 68) | func SpanishLightStemmerFilterConstructor(config map[string]interface{},
  function init (line 73) | func init() {

FILE: analysis/lang/es/spanish_normalize.go
  constant NormalizeName (line 24) | NormalizeName = "normalize_es"
  type SpanishNormalizeFilter (line 26) | type SpanishNormalizeFilter struct
    method Filter (line 33) | func (s *SpanishNormalizeFilter) Filter(input analysis.TokenStream) an...
  function NewSpanishNormalizeFilter (line 29) | func NewSpanishNormalizeFilter() *SpanishNormalizeFilter {
  function normalize (line 41) | func normalize(input []byte) []byte {
  function NormalizerFilterConstructor (line 61) | func NormalizerFilterConstructor(config map[string]interface{}, cache *r...
  function init (line 65) | func init() {

FILE: analysis/lang/es/spanish_normalize_test.go
  function TestSpanishNormalizeFilter (line 24) | func TestSpanishNormalizeFilter(t *testing.T) {

FILE: analysis/lang/es/stemmer_es_snowball.go
  constant SnowballStemmerName (line 25) | SnowballStemmerName = "stemmer_es_snowball"
  type SpanishStemmerFilter (line 27) | type SpanishStemmerFilter struct
    method Filter (line 34) | func (s *SpanishStemmerFilter) Filter(input analysis.TokenStream) anal...
  function NewSpanishStemmerFilter (line 30) | func NewSpanishStemmerFilter() *SpanishStemmerFilter {
  function SpanishStemmerFilterConstructor (line 43) | func SpanishStemmerFilterConstructor(config map[string]interface{}, cach...
  function init (line 47) | func init() {

FILE: analysis/lang/es/stemmer_es_snowball_test.go
  function TestSnowballSpanishStemmer (line 25) | func TestSnowballSpanishStemmer(t *testing.T) {

FILE: analysis/lang/es/stop_filter_es.go
  function StopTokenFilterConstructor (line 22) | func StopTokenFilterConstructor(config map[string]interface{},
  function init (line 31) | func init() {

FILE: analysis/lang/es/stop_words_es.go
  constant StopName (line 8) | StopName = "stop_es"
  function TokenMapConstructor (line 372) | func TokenMapConstructor(config map[string]interface{}, cache *registry....
  function init (line 378) | func init() {

FILE: analysis/lang/eu/stop_filter_eu.go
  function StopTokenFilterConstructor (line 23) | func StopTokenFilterConstructor(config map[string]interface{}, cache *re...
  function init (line 31) | func init() {

FILE: analysis/lang/eu/stop_words_eu.go
  constant StopName (line 8) | StopName = "stop_eu"
  function TokenMapConstructor (line 115) | func TokenMapConstructor(config map[string]interface{}, cache *registry....
  function init (line 121) | func init() {

FILE: analysis/lang/fa/analyzer_fa.go
  constant AnalyzerName (line 27) | AnalyzerName = "fa"
  function AnalyzerConstructor (line 29) | func AnalyzerConstructor(config map[string]interface{}, cache *registry....
  function init (line 69) | func init() {

FILE: analysis/lang/fa/analyzer_fa_test.go
  function TestPersianAnalyzerVerbs (line 25) | func TestPersianAnalyzerVerbs(t *testing.T) {
  function TestPersianAnalyzerVerbsDefective (line 320) | func TestPersianAnalyzerVerbsDefective(t *testing.T) {
  function TestPersianAnalyzerOthers (line 615) | func TestPersianAnalyzerOthers(t *testing.T) {

FILE: analysis/lang/fa/persian_normalize.go
  constant NormalizeName (line 24) | NormalizeName = "normalize_fa"
  constant Yeh (line 27) | Yeh        = '\u064A'
  constant FarsiYeh (line 28) | FarsiYeh   = '\u06CC'
  constant YehBarree (line 29) | YehBarree  = '\u06D2'
  constant Keheh (line 30) | Keheh      = '\u06A9'
  constant Kaf (line 31) | Kaf        = '\u0643'
  constant HamzaAbove (line 32) | HamzaAbove = '\u0654'
  constant HehYeh (line 33) | HehYeh     = '\u06C0'
  constant HehGoal (line 34) | HehGoal    = '\u06C1'
  constant Heh (line 35) | Heh        = '\u0647'
  type PersianNormalizeFilter (line 38) | type PersianNormalizeFilter struct
    method Filter (line 45) | func (s *PersianNormalizeFilter) Filter(input analysis.TokenStream) an...
  function NewPersianNormalizeFilter (line 41) | func NewPersianNormalizeFilter() *PersianNormalizeFilter {
  function normalize (line 53) | func normalize(input []byte) []byte {
  function NormalizerFilterConstructor (line 71) | func NormalizerFilterConstructor(config map[string]interface{}, cache *r...
  function init (line 75) | func init() {

FILE: analysis/lang/fa/persian_normalize_test.go
  function TestPersianNormalizeFilter (line 24) | func TestPersianNormalizeFilter(t *testing.T) {

FILE: analysis/lang/fa/stop_filter_fa.go
  function StopTokenFilterConstructor (line 23) | func StopTokenFilterConstructor(config map[string]interface{}, cache *re...
  function init (line 31) | func init() {

FILE: analysis/lang/fa/stop_words_fa.go
  constant StopName (line 8) | StopName = "stop_fa"
  function TokenMapConstructor (line 329) | func TokenMapConstructor(config map[string]interface{}, cache *registry....
  function init (line 335) | func init() {

FILE: analysis/lang/fi/analyzer_fi.go
  constant AnalyzerName (line 25) | AnalyzerName = "fi"
  function AnalyzerConstructor (line 27) | func AnalyzerConstructor(config map[string]interface{}, cache *registry....
  function init (line 55) | func init() {

FILE: analysis/lang/fi/analyzer_fi_test.go
  function TestFinishAnalyzer (line 25) | func TestFinishAnalyzer(t *testing.T) {

FILE: analysis/lang/fi/stemmer_fi.go
  constant SnowballStemmerName (line 25) | SnowballStemmerName = "stemmer_fi_snowball"
  type FinnishStemmerFilter (line 27) | type FinnishStemmerFilter struct
    method Filter (line 34) | func (s *FinnishStemmerFilter) Filter(input analysis.TokenStream) anal...
  function NewFinnishStemmerFilter (line 30) | func NewFinnishStemmerFilter() *FinnishStemmerFilter {
  function FinnishStemmerFilterConstructor (line 43) | func FinnishStemmerFilterConstructor(config map[string]interface{}, cach...
  function init (line 47) | func init() {

FILE: analysis/lang/fi/stop_filter_fi.go
  function StopTokenFilterConstructor (line 23) | func StopTokenFilterConstructor(config map[string]interface{}, cache *re...
  function init (line 31) | func init() {

FILE: analysis/lang/fi/stop_words_fi.go
  constant StopName (line 8) | StopName = "stop_fi"
  function TokenMapConstructor (line 113) | func TokenMapConstructor(config map[string]interface{}, cache *registry....
  function init (line 119) | func init() {

FILE: analysis/lang/fr/analyzer_fr.go
  constant AnalyzerName (line 25) | AnalyzerName = "fr"
  function AnalyzerConstructor (line 27) | func AnalyzerConstructor(config map[string]interface{}, cache *registry....
  function init (line 60) | func init() {

FILE: analysis/lang/fr/analyzer_fr_test.go
  function TestFrenchAnalyzer (line 25) | func TestFrenchAnalyzer(t *testing.T) {

FILE: analysis/lang/fr/articles_fr.go
  constant ArticlesName (line 8) | ArticlesName = "articles_fr"
  function ArticlesTokenMapConstructor (line 29) | func ArticlesTokenMapConstructor(config map[string]interface{}, cache *r...
  function init (line 35) | func init() {

FILE: analysis/lang/fr/elision_fr.go
  constant ElisionName (line 25) | ElisionName = "elision_fr"
  function ElisionFilterConstructor (line 27) | func ElisionFilterConstructor(config map[string]interface{}, cache *regi...
  function init (line 35) | func init() {

FILE: analysis/lang/fr/elision_fr_test.go
  function TestFrenchElision (line 25) | func TestFrenchElision(t *testing.T) {

FILE: analysis/lang/fr/light_stemmer_fr.go
  constant LightStemmerName (line 25) | LightStemmerName = "stemmer_fr_light"
  type FrenchLightStemmerFilter (line 27) | type FrenchLightStemmerFilter struct
    method Filter (line 34) | func (s *FrenchLightStemmerFilter) Filter(input analysis.TokenStream) ...
  function NewFrenchLightStemmerFilter (line 30) | func NewFrenchLightStemmerFilter() *FrenchLightStemmerFilter {
  function stem (line 43) | func stem(input []rune) []rune {
  function norm (line 247) | func norm(input []rune) []rune {
  function FrenchLightStemmerFilterConstructor (line 300) | func FrenchLightStemmerFilterConstructor(config map[string]interface{}, ...
  function init (line 304) | func init() {

FILE: analysis/lang/fr/light_stemmer_fr_test.go
  function TestFrenchLightStemmer (line 25) | func TestFrenchLightStemmer(t *testing.T) {

FILE: analysis/lang/fr/minimal_stemmer_fr.go
  constant MinimalStemmerName (line 24) | MinimalStemmerName = "stemmer_fr_min"
  type FrenchMinimalStemmerFilter (line 26) | type FrenchMinimalStemmerFilter struct
    method Filter (line 33) | func (s *FrenchMinimalStemmerFilter) Filter(input analysis.TokenStream...
  function NewFrenchMinimalStemmerFilter (line 29) | func NewFrenchMinimalStemmerFilter() *FrenchMinimalStemmerFilter {
  function minstem (line 42) | func minstem(input []rune) []rune {
  function FrenchMinimalStemmerFilterConstructor (line 73) | func FrenchMinimalStemmerFilterConstructor(config map[string]interface{}...
  function init (line 77) | func init() {

FILE: analysis/lang/fr/minimal_stemmer_fr_test.go
  function TestFrenchMinimalStemmer (line 25) | func TestFrenchMinimalStemmer(t *testing.T) {

FILE: analysis/lang/fr/stemmer_fr_snowball.go
  constant SnowballStemmerName (line 25) | SnowballStemmerName = "stemmer_fr_snowball"
  type FrenchStemmerFilter (line 27) | type FrenchStemmerFilter struct
    method Filter (line 34) | func (s *FrenchStemmerFilter) Filter(input analysis.TokenStream) analy...
  function NewFrenchStemmerFilter (line 30) | func NewFrenchStemmerFilter() *FrenchStemmerFilter {
  function FrenchStemmerFilterConstructor (line 43) | func FrenchStemmerFilterConstructor(config map[string]interface{}, cache...
  function init (line 47) | func init() {

FILE: analysis/lang/fr/stemmer_fr_snowball_test.go
  function TestSnowballFrenchStemmer (line 25) | func TestSnowballFrenchStemmer(t *testing.T) {

FILE: analysis/lang/fr/stop_filter_fr.go
  function StopTokenFilterConstructor (line 23) | func StopTokenFilterConstructor(config map[string]interface{}, cache *re...
  function init (line 31) | func init() {

FILE: analysis/lang/fr/stop_words_fr.go
  constant StopName (line 8) | StopName = "stop_fr"
  function TokenMapConstructor (line 202) | func TokenMapConstructor(config map[string]interface{}, cache *registry....
  function init (line 208) | func init() {

FILE: analysis/lang/ga/articles_ga.go
  constant ArticlesName (line 8) | ArticlesName = "articles_ga"
  function ArticlesTokenMapConstructor (line 19) | func ArticlesTokenMapConstructor(config map[string]interface{}, cache *r...
  function init (line 25) | func init() {

FILE: analysis/lang/ga/elision_ga.go
  constant ElisionName (line 25) | ElisionName = "elision_ga"
  function ElisionFilterConstructor (line 27) | func ElisionFilterConstructor(config map[string]interface{}, cache *regi...
  function init (line 35) | func init() {

FILE: analysis/lang/ga/elision_ga_test.go
  function TestFrenchElision (line 25) | func TestFrenchElision(t *testing.T) {

FILE: analysis/lang/ga/stop_filter_ga.go
  function StopTokenFilterConstructor (line 23) | func StopTokenFilterConstructor(config map[string]interface{}, cache *re...
  function init (line 31) | func init() {

FILE: analysis/lang/ga/stop_words_ga.go
  constant StopName (line 8) | StopName = "stop_ga"
  function TokenMapConstructor (line 126) | func TokenMapConstructor(config map[string]interface{}, cache *registry....
  function init (line 132) | func init() {

FILE: analysis/lang/gl/stop_filter_gl.go
  function StopTokenFilterConstructor (line 23) | func StopTokenFilterConstructor(config map[string]interface{}, cache *re...
  function init (line 31) | func init() {

FILE: analysis/lang/gl/stop_words_gl.go
  constant StopName (line 8) | StopName = "stop_gl"
  function TokenMapConstructor (line 177) | func TokenMapConstructor(config map[string]interface{}, cache *registry....
  function init (line 183) | func init() {

FILE: analysis/lang/hi/analyzer_hi.go
  constant AnalyzerName (line 26) | AnalyzerName = "hi"
  function AnalyzerConstructor (line 28) | func AnalyzerConstructor(config map[string]interface{}, cache *registry....
  function init (line 66) | func init() {

FILE: analysis/lang/hi/analyzer_hi_test.go
  function TestHindiAnalyzer (line 25) | func TestHindiAnalyzer(t *testing.T) {

FILE: analysis/lang/hi/hindi_normalize.go
  constant NormalizeName (line 24) | NormalizeName = "normalize_hi"
  type HindiNormalizeFilter (line 26) | type HindiNormalizeFilter struct
    method Filter (line 33) | func (s *HindiNormalizeFilter) Filter(input analysis.TokenStream) anal...
  function NewHindiNormalizeFilter (line 29) | func NewHindiNormalizeFilter() *HindiNormalizeFilter {
  function normalize (line 41) | func normalize(input []byte) []byte {
  function NormalizerFilterConstructor (line 132) | func NormalizerFilterConstructor(config map[string]interface{}, cache *r...
  function init (line 136) | func init() {

FILE: analysis/lang/hi/hindi_normalize_test.go
  function TestHindiNormalizeFilter (line 24) | func TestHindiNormalizeFilter(t *testing.T) {

FILE: analysis/lang/hi/hindi_stemmer_filter.go
  constant StemmerName (line 25) | StemmerName = "stemmer_hi"
  type HindiStemmerFilter (line 27) | type HindiStemmerFilter struct
    method Filter (line 34) | func (s *HindiStemmerFilter) Filter(input analysis.TokenStream) analys...
  function NewHindiStemmerFilter (line 30) | func NewHindiStemmerFilter() *HindiStemmerFilter {
  function stem (line 45) | func stem(input []byte) []byte {
  function StemmerFilterConstructor (line 143) | func StemmerFilterConstructor(config map[string]interface{}, cache *regi...
  function init (line 147) | func init() {

FILE: analysis/lang/hi/hindi_stemmer_filter_test.go
  function TestHindiStemmerFilter (line 24) | func TestHindiStemmerFilter(t *testing.T) {

FILE: analysis/lang/hi/stop_filter_hi.go
  function StopTokenFilterConstructor (line 23) | func StopTokenFilterConstructor(config map[string]interface{}, cache *re...
  function init (line 31) | func init() {

FILE: analysis/lang/hi/stop_words_hi.go
  constant StopName (line 8) | StopName = "stop_hi"
  function TokenMapConstructor (line 251) | func TokenMapConstructor(config map[string]interface{}, cache *registry....
  function init (line 257) | func init() {

FILE: analysis/lang/hr/analyzer_hr.go
  constant AnalyzerName (line 27) | AnalyzerName = "hr"
  function AnalyzerConstructor (line 29) | func AnalyzerConstructor(config map[string]interface{}, cache *registry....
  function init (line 62) | func init() {

FILE: analysis/lang/hr/analyzer_hr_test.go
  function TestCroatianAnalyzer (line 25) | func TestCroatianAnalyzer(t *testing.T) {

FILE: analysis/lang/hr/stemmer_hr.go
  constant StemmerName (line 25) | StemmerName = "stemmer_hr"
  function highlightVowelR (line 108) | func highlightVowelR(term string) string {
  function hasVowel (line 112) | func hasVowel(term string) bool {
  function stem (line 117) | func stem(term string) string {
  type CroatianStemmerFilter (line 133) | type CroatianStemmerFilter struct
    method Filter (line 139) | func (s *CroatianStemmerFilter) Filter(input analysis.TokenStream) ana...
  function NewCroatianStemmerFilter (line 135) | func NewCroatianStemmerFilter() *CroatianStemmerFilter {
  function CroatianStemmerFilterConstructor (line 147) | func CroatianStemmerFilterConstructor(config map[string]interface{}, cac...
  function init (line 151) | func init() {

FILE: analysis/lang/hr/stop_filter_hr.go
  function StopTokenFilterConstructor (line 23) | func StopTokenFilterConstructor(config map[string]interface{}, cache *re...
  function init (line 31) | func init() {

FILE: analysis/lang/hr/stop_words_hr.go
  constant StopName (line 22) | StopName = "stop_hr"
  function TokenMapConstructor (line 99) | func TokenMapConstructor(config map[string]interface{}, cache *registry....
  function init (line 106) | func init() {

FILE: analysis/lang/hr/suffix_transformation_hr.go
  constant SuffixTransformationFilterName (line 24) | SuffixTransformationFilterName = "hr_suffix_transformation_filter"
  type SuffixTransformationFilter (line 157) | type SuffixTransformationFilter struct
    method Filter (line 163) | func (s *SuffixTransformationFilter) Filter(input analysis.TokenStream...
  function NewSuffixTransformationFilter (line 159) | func NewSuffixTransformationFilter() *SuffixTransformationFilter {
  function SuffixTransformationFilterConstructor (line 180) | func SuffixTransformationFilterConstructor(config map[string]interface{}...
  function init (line 184) | func init() {

FILE: analysis/lang/hu/analyzer_hu.go
  constant AnalyzerName (line 25) | AnalyzerName = "hu"
  function AnalyzerConstructor (line 27) | func AnalyzerConstructor(config map[string]interface{}, cache *registry....
  function init (line 55) | func init() {

FILE: analysis/lang/hu/analyzer_hu_test.go
  function TestHungarianAnalyzer (line 25) | func TestHungarianAnalyzer(t *testing.T) {

FILE: analysis/lang/hu/stemmer_hu.go
  constant SnowballStemmerName (line 25) | SnowballStemmerName = "stemmer_hu_snowball"
  type HungarianStemmerFilter (line 27) | type HungarianStemmerFilter struct
    method Filter (line 34) | func (s *HungarianStemmerFilter) Filter(input analysis.TokenStream) an...
  function NewHungarianStemmerFilter (line 30) | func NewHungarianStemmerFilter() *HungarianStemmerFilter {
  function HungarianStemmerFilterConstructor (line 43) | func HungarianStemmerFilterConstructor(config map[string]interface{}, ca...
  function init (line 47) | func init() {

FILE: analysis/lang/hu/stop_filter_hu.go
  function StopTokenFilterConstructor (line 23) | func StopTokenFilterConstructor(config map[string]interface{}, cache *re...
  function init (line 31) | func init() {

FILE: analysis/lang/hu/stop_words_hu.go
  constant StopName (line 8) | StopName = "stop_hu"
  function TokenMapConstructor (line 227) | func TokenMapConstructor(config map[string]interface{}, cache *registry....
  function init (line 233) | func init() {

FILE: analysis/lang/hy/stop_filter_hy.go
  function StopTokenFilterConstructor (line 23) | func StopTokenFilterConstructor(config map[string]interface{}, cache *re...
  function init (line 31) | func init() {

FILE: analysis/lang/hy/stop_words_hy.go
  constant StopName (line 8) | StopName = "stop_hy"
  function TokenMapConstructor (line 62) | func TokenMapConstructor(config map[string]interface{}, cache *registry....
  function init (line 68) | func init() {

FILE: analysis/lang/id/stop_filter_id.go
  function StopTokenFilterConstructor (line 23) | func StopTokenFilterConstructor(config map[string]interface{}, cache *re...
  function init (line 31) | func init() {

FILE: analysis/lang/id/stop_words_id.go
  constant StopName (line 8) | StopName = "stop_id"
  function TokenMapConstructor (line 375) | func TokenMapConstructor(config map[string]interface{}, cache *registry....
  function init (line 381) | func init() {

FILE: analysis/lang/in/indic_normalize.go
  constant NormalizeName (line 24) | NormalizeName = "normalize_in"
  type IndicNormalizeFilter (line 26) | type IndicNormalizeFilter struct
    method Filter (line 33) | func (s *IndicNormalizeFilter) Filter(input analysis.TokenStream) anal...
  function NewIndicNormalizeFilter (line 29) | func NewIndicNormalizeFilter() *IndicNormalizeFilter {
  function NormalizerFilterConstructor (line 42) | func NormalizerFilterConstructor(config map[string]interface{}, cache *r...
  function init (line 46) | func init() {

FILE: analysis/lang/in/indic_normalize_test.go
  function TestIndicNormalizeFilter (line 24) | func TestIndicNormalizeFilter(t *testing.T) {

FILE: analysis/lang/in/scripts.go
  type ScriptData (line 24) | type ScriptData struct
  function flag (line 69) | func flag(ub *unicode.RangeTable) rune {
  function init (line 220) | func init() {
  function lookupScript (line 233) | func lookupScript(r rune) *unicode.RangeTable {
  function normalize (line 242) | func normalize(input []rune) []rune {
  function compose (line 259) | func compose(ch0 rune, script0 *unicode.RangeTable, scriptData *ScriptDa...

FILE: analysis/lang/it/analyzer_it.go
  constant AnalyzerName (line 25) | AnalyzerName = "it"
  function AnalyzerConstructor (line 27) | func AnalyzerConstructor(config map[string]interface{}, cache *registry....
  function init (line 60) | func init() {

FILE: analysis/lang/it/analyzer_it_test.go
  function TestItalianAnalyzer (line 25) | func TestItalianAnalyzer(t *testing.T) {

FILE: analysis/lang/it/articles_it.go
  constant ArticlesName (line 8) | ArticlesName = "articles_it"
  function ArticlesTokenMapConstructor (line 37) | func ArticlesTokenMapConstructor(config map[string]interface{}, cache *r...
  function init (line 43) | func init() {

FILE: analysis/lang/it/elision_it.go
  constant ElisionName (line 25) | ElisionName = "elision_it"
  function ElisionFilterConstructor (line 27) | func ElisionFilterConstructor(config map[string]interface{}, cache *regi...
  function init (line 35) | func init() {

FILE: analysis/lang/it/elision_it_test.go
  function TestItalianElision (line 25) | func TestItalianElision(t *testing.T) {

FILE: analysis/lang/it/light_stemmer_it.go
  constant LightStemmerName (line 24) | LightStemmerName = "stemmer_it_light"
  type ItalianLightStemmerFilter (line 26) | type ItalianLightStemmerFilter struct
    method Filter (line 33) | func (s *ItalianLightStemmerFilter) Filter(input analysis.TokenStream)...
  function NewItalianLightStemmerFilterFilter (line 29) | func NewItalianLightStemmerFilterFilter() *ItalianLightStemmerFilter {
  function stem (line 42) | func stem(input []rune) []rune {
  function ItalianLightStemmerFilterConstructor (line 95) | func ItalianLightStemmerFilterConstructor(config map[string]interface{},...
  function init (line 99) | func init() {

FILE: analysis/lang/it/light_stemmer_it_test.go
  function TestItalianLightStemmer (line 25) | func TestItalianLightStemmer(t *testing.T) {

FILE: analysis/lang/it/stemmer_it_snowball.go
  constant SnowballStemmerName (line 25) | SnowballStemmerName = "stemmer_it_snowball"
  type ItalianStemmerFilter (line 27) | type ItalianStemmerFilter struct
    method Filter (line 34) | func (s *ItalianStemmerFilter) Filter(input analysis.TokenStream) anal...
  function NewItalianStemmerFilter (line 30) | func NewItalianStemmerFilter() *ItalianStemmerFilter {
  function ItalianStemmerFilterConstructor (line 43) | func ItalianStemmerFilterConstructor(config map[string]interface{}, cach...
  function init (line 47) | func init() {

FILE: analysis/lang/it/stemmer_it_snowball_test.go
  function TestSnowballItalianStemmer (line 25) | func TestSnowballItalianStemmer(t *testing.T) {

FILE: analysis/lang/it/stop_filter_it.go
  function StopTokenFilterConstructor (line 23) | func StopTokenFilterConstructor(config map[string]interface{}, cache *re...
  function init (line 31) | func init() {

FILE: analysis/lang/it/stop_words_it.go
  constant StopName (line 8) | StopName = "stop_it"
  function TokenMapConstructor (line 319) | func TokenMapConstructor(config map[string]interface{}, cache *registry....
  function init (line 325) | func init() {

FILE: analysis/lang/nl/analyzer_nl.go
  constant AnalyzerName (line 25) | AnalyzerName = "nl"
  function AnalyzerConstructor (line 27) | func AnalyzerConstructor(config map[string]interface{}, cache *registry....
  function init (line 55) | func init() {

FILE: analysis/lang/nl/analyzer_nl_test.go
  function TestDutchAnalyzer (line 25) | func TestDutchAnalyzer(t *testing.T) {

FILE: analysis/lang/nl/stemmer_nl.go
  constant SnowballStemmerName (line 25) | SnowballStemmerName = "stemmer_nl_snowball"
  type DutchStemmerFilter (line 27) | type DutchStemmerFilter struct
    method Filter (line 34) | func (s *DutchStemmerFilter) Filter(input analysis.TokenStream) analys...
  function NewDutchStemmerFilter (line 30) | func NewDutchStemmerFilter() *DutchStemmerFilter {
  function DutchStemmerFilterConstructor (line 43) | func DutchStemmerFilterConstructor(config map[string]interface{}, cache ...
  function init (line 47) | func init() {

FILE: analysis/lang/nl/stop_filter_nl.go
  function StopTokenFilterConstructor (line 23) | func StopTokenFilterConstructor(config map[string]interface{}, cache *re...
  function init (line 31) | func init() {

FILE: analysis/lang/nl/stop_words_nl.go
  constant StopName (line 8) | StopName = "stop_nl"
  function TokenMapConstructor (line 135) | func TokenMapConstructor(config map[string]interface{}, cache *registry....
  function init (line 141) | func init() {

FILE: analysis/lang/no/analyzer_no.go
  constant AnalyzerName (line 25) | AnalyzerName = "no"
  function AnalyzerConstructor (line 27) | func AnalyzerConstructor(config map[string]interface{}, cache *registry....
  function init (line 55) | func init() {

FILE: analysis/lang/no/analyzer_no_test.go
  function TestNorwegianAnalyzer (line 25) | func TestNorwegianAnalyzer(t *testing.T) {

FILE: analysis/lang/no/stemmer_no.go
  constant SnowballStemmerName (line 25) | SnowballStemmerName = "stemmer_no_snowball"
  type NorwegianStemmerFilter (line 27) | type NorwegianStemmerFilter struct
    method Filter (line 34) | func (s *NorwegianStemmerFilter) Filter(input analysis.TokenStream) an...
  function NewNorwegianStemmerFilter (line 30) | func NewNorwegianStemmerFilter() *NorwegianStemmerFilter {
  function NorwegianStemmerFilterConstructor (line 43) | func NorwegianStemmerFilterConstructor(config map[string]interface{}, ca...
  function init (line 47) | func init() {

FILE: analysis/lang/no/stop_filter_no.go
  function StopTokenFilterConstructor (line 23) | func StopTokenFilterConstructor(config map[string]interface{}, cache *re...
  function init (line 31) | func init() {

FILE: analysis/lang/no/stop_words_no.go
  constant StopName (line 8) | StopName = "stop_no"
  function TokenMapConstructor (line 210) | func TokenMapConstructor(config map[string]interface{}, cache *registry....
  function init (line 216) | func init() {

FILE: analysis/lang/pl/analyzer_pl.go
  constant AnalyzerName (line 25) | AnalyzerName = "pl"
  function AnalyzerConstructor (line 27) | func AnalyzerConstructor(config map[string]interface{}, cache *registry....
  function init (line 55) | func init() {

FILE: analysis/lang/pl/analyzer_pl_test.go
  function TestPolishAnalyzer (line 25) | func TestPolishAnalyzer(t *testing.T) {

FILE: analysis/lang/pl/stemmer_pl.go
  constant SnowballStemmerName (line 23) | SnowballStemmerName = "stemmer_pl"
  type PolishStemmerFilter (line 25) | type PolishStemmerFilter struct
    method Filter (line 39) | func (s *PolishStemmerFilter) Filter(input analysis.TokenStream) analy...
  function NewPolishStemmerFilter (line 29) | func NewPolishStemmerFilter() (*PolishStemmerFilter, error) {
  function PolishStemmerFilterConstructor (line 49) | func PolishStemmerFilterConstructor(config map[string]interface{}, cache...
  function init (line 53) | func init() {

FILE: analysis/lang/pl/stemmer_pl_test.go
  function TestPolishStemmer (line 25) | func TestPolishStemmer(t *testing.T) {

FILE: analysis/lang/pl/stempel/cell.go
  type cell (line 23) | type cell struct
    method String (line 28) | func (c *cell) String() string {
  function newCell (line 32) | func newCell(r *javadata.Reader) (*cell, error) {

FILE: analysis/lang/pl/stempel/diff.go
  function Diff (line 19) | func Diff(dest, diff []rune) []rune {

FILE: analysis/lang/pl/stempel/diff_test.go
  function TestDiff (line 23) | func TestDiff(t *testing.T) {

FILE: analysis/lang/pl/stempel/file.go
  type Trie (line 30) | type Trie interface
  function Open (line 36) | func Open(path string) (Trie, error) {
  function LoadTrie (line 46) | func LoadTrie() (Trie, error) {
  function buildTrieFromReader (line 51) | func buildTrieFromReader(f io.Reader) (Trie, error) {

FILE: analysis/lang/pl/stempel/file_test.go
  function TestEmpty (line 27) | func TestEmpty(t *testing.T) {
  function TestStem (line 46) | func TestStem(t *testing.T) {

FILE: analysis/lang/pl/stempel/fuzz.go
  function init (line 22) | func init() {
  function Fuzz (line 30) | func Fuzz(data []byte) int {

FILE: analysis/lang/pl/stempel/javadata/fuzz.go
  function Fuzz (line 22) | func Fuzz(data []byte) int {

FILE: analysis/lang/pl/stempel/javadata/input.go
  type Reader (line 28) | type Reader struct
    method ReadBool (line 38) | func (r *Reader) ReadBool() (bool, error) {
    method ReadInt32 (line 47) | func (r *Reader) ReadInt32() (rv int32, err error) {
    method ReadUint16 (line 53) | func (r *Reader) ReadUint16() (rv uint16, err error) {
    method ReadCharAsRune (line 59) | func (r *Reader) ReadCharAsRune() (rv rune, err error) {
    method ReadUTF (line 69) | func (r *Reader) ReadUTF() (string, error) {
  function NewReader (line 33) | func NewReader(r io.Reader) *Reader {

FILE: analysis/lang/pl/stempel/javadata/input_test.go
  function TestReadBool (line 23) | func TestReadBool(t *testing.T) {
  function TestReadUint16 (line 63) | func TestReadUint16(t *testing.T) {
  function TestReadInt32 (line 103) | func TestReadInt32(t *testing.T) {
  function TestReadUTF (line 147) | func TestReadUTF(t *testing.T) {

FILE: analysis/lang/pl/stempel/multi_trie.go
  type multiTrie (line 27) | type multiTrie struct
    method GetLastOnPath (line 60) | func (t *multiTrie) GetLastOnPath(key []rune) []rune {
    method skip (line 107) | func (t *multiTrie) skip(in []rune, count int) ([]rune, error) {
    method String (line 134) | func (t *multiTrie) String() string {
  function newMultiTrie (line 33) | func newMultiTrie(r *javadata.Reader) (rv *multiTrie, err error) {
  constant eom (line 58) | eom = rune('*')
  function cannotFollow (line 97) | func cannotFollow(after, goes rune) bool {
  function lengthPP (line 117) | func lengthPP(cmd []rune) int {

FILE: analysis/lang/pl/stempel/row.go
  type row (line 23) | type row struct
    method String (line 27) | func (r *row) String() string {
    method getCmd (line 62) | func (r *row) getCmd(way rune) int32 {
    method getRef (line 70) | func (r *row) getRef(way rune) int32 {
    method at (line 78) | func (r *row) at(c rune) *cell {
  function newRow (line 35) | func newRow(r *javadata.Reader) (*row, error) {

FILE: analysis/lang/pl/stempel/strenum.go
  type strEnum (line 21) | type strEnum struct
    method next (line 41) | func (s *strEnum) next() (rune, error) {
  function newStrEnum (line 27) | func newStrEnum(s []rune, up bool) *strEnum {

FILE: analysis/lang/pl/stempel/strenum_test.go
  function TestStrenumNext (line 24) | func TestStrenumNext(t *testing.T) {

FILE: analysis/lang/pl/stempel/trie.go
  type trie (line 24) | type trie struct
    method getRow (line 73) | func (t *trie) getRow(i int) *row {
    method GetLastOnPath (line 80) | func (t *trie) GetLastOnPath(key []rune) []rune {
    method String (line 123) | func (t *trie) String() string {
  function newTrie (line 31) | func newTrie(r *javadata.Reader) (rv *trie, err error) {

FILE: analysis/lang/pl/stop_filter_pl.go
  function StopTokenFilterConstructor (line 23) | func StopTokenFilterConstructor(config map[string]interface{}, cache *re...
  function init (line 31) | func init() {

FILE: analysis/lang/pl/stop_words_pl.go
  constant StopName (line 8) | StopName = "stop_pl"
  function TokenMapConstructor (line 357) | func TokenMapConstructor(config map[string]interface{}, cache *registry....
  function init (line 363) | func init() {

FILE: analysis/lang/pt/analyzer_pt.go
  constant AnalyzerName (line 25) | AnalyzerName = "pt"
  function AnalyzerConstructor (line 27) | func AnalyzerConstructor(config map[string]interface{}, cache *registry....
  function init (line 55) | func init() {

FILE: analysis/lang/pt/analyzer_pt_test.go
  function TestPortugueseAnalyzer (line 25) | func TestPortugueseAnalyzer(t *testing.T) {

FILE: analysis/lang/pt/light_stemmer_pt.go
  constant LightStemmerName (line 24) | LightStemmerName = "stemmer_pt_light"
  type PortugueseLightStemmerFilter (line 26) | type PortugueseLightStemmerFilter struct
    method Filter (line 33) | func (s *PortugueseLightStemmerFilter) Filter(input analysis.TokenStre...
  function NewPortugueseLightStemmerFilter (line 29) | func NewPortugueseLightStemmerFilter() *PortugueseLightStemmerFilter {
  function stem (line 42) | func stem(input []rune) []rune {
  function removeSuffix (line 86) | func removeSuffix(input []rune) []rune {
  function normFeminine (line 144) | func normFeminine(input []rune) []rune {
  function PortugueseLightStemmerFilterConstructor (line 189) | func PortugueseLightStemmerFilterConstructor(config map[string]interface...
  function init (line 193) | func init() {

FILE: analysis/lang/pt/light_stemmer_pt_test.go
  function TestPortugueseLightStemmer (line 25) | func TestPortugueseLightStemmer(t *testing.T) {

FILE: analysis/lang/pt/stop_filter_pt.go
  function StopTokenFilterConstructor (line 23) | func StopTokenFilterConstructor(config map[string]interface{}, cache *re...
  function init (line 31) | func init() {

FILE: analysis/lang/pt/stop_words_pt.go
  constant StopName (line 8) | StopName = "stop_pt"
  function TokenMapConstructor (line 269) | func TokenMapConstructor(config map[string]interface{}, cache *registry....
  function init (line 275) | func init() {

FILE: analysis/lang/ro/analyzer_ro.go
  constant AnalyzerName (line 25) | AnalyzerName = "ro"
  function AnalyzerConstructor (line 27) | func AnalyzerConstructor(config map[string]interface{}, cache *registry....
  function init (line 55) | func init() {

FILE: analysis/lang/ro/analyzer_ro_test.go
  function TestRomanianAnalyzer (line 25) | func TestRomanianAnalyzer(t *testing.T) {

FILE: analysis/lang/ro/stemmer_ro.go
  constant SnowballStemmerName (line 25) | SnowballStemmerName = "stemmer_ro_snowball"
  type RomanianStemmerFilter (line 27) | type RomanianStemmerFilter struct
    method Filter (line 34) | func (s *RomanianStemmerFilter) Filter(input analysis.TokenStream) ana...
  function NewRomanianStemmerFilter (line 30) | func NewRomanianStemmerFilter() *RomanianStemmerFilter {
  function RomanianStemmerFilterConstructor (line 43) | func RomanianStemmerFilterConstructor(config map[string]interface{}, cac...
  function init (line 47) | func init() {

FILE: analysis/lang/ro/stop_filter_ro.go
  function StopTokenFilterConstructor (line 23) | func StopTokenFilterConstructor(config map[string]interface{}, cache *re...
  function init (line 31) | func init() {

FILE: analysis/lang/ro/stop_words_ro.go
  constant StopName (line 8) | StopName = "stop_ro"
  function TokenMapConstructor (line 249) | func TokenMapConstructor(config map[string]interface{}, cache *registry....
  function init (line 255) | func init() {

FILE: analysis/lang/ru/analyzer_ru.go
  constant AnalyzerName (line 25) | AnalyzerName = "ru"
  function AnalyzerConstructor (line 27) | func AnalyzerConstructor(config map[string]interface{}, cache *registry....
  function init (line 55) | func init() {

FILE: analysis/lang/ru/analyzer_ru_test.go
  function TestRussianAnalyzer (line 25) | func TestRussianAnalyzer(t *testing.T) {

FILE: analysis/lang/ru/stemmer_ru.go
  constant SnowballStemmerName (line 25) | SnowballStemmerName = "stemmer_ru_snowball"
  type RussianStemmerFilter (line 27) | type RussianStemmerFilter struct
    method Filter (line 34) | func (s *RussianStemmerFilter) Filter(input analysis.TokenStream) anal...
  function NewRussianStemmerFilter (line 30) | func NewRussianStemmerFilter() *RussianStemmerFilter {
  function RussianStemmerFilterConstructor (line 43) | func RussianStemmerFilterConstructor(config map[string]interface{}, cach...
  function init (line 47) | func init() {

FILE: analysis/lang/ru/stemmer_ru_test.go
  function TestSnowballRussianStemmer (line 25) | func TestSnowballRussianStemmer(t *testing.T) {

FILE: analysis/lang/ru/stop_filter_ru.go
  function StopTokenFilterConstructor (line 23) | func StopTokenFilterConstructor(config map[string]interface{}, cache *re...
  function init (line 31) | func init() {

FILE: analysis/lang/ru/stop_words_ru.go
  constant StopName (line 8) | StopName = "stop_ru"
  function TokenMapConstructor (line 259) | func TokenMapConstructor(config map[string]interface{}, cache *registry....
  function init (line 265) | func init() {

FILE: analysis/lang/sv/analyzer_sv.go
  constant AnalyzerName (line 25) | AnalyzerName = "sv"
  function AnalyzerConstructor (line 27) | func AnalyzerConstructor(config map[string]interface{}, cache *registry....
  function init (line 55) | func init() {

FILE: analysis/lang/sv/analyzer_sv_test.go
  function TestSwedishAnalyzer (line 25) | func TestSwedishAnalyzer(t *testing.T) {

FILE: analysis/lang/sv/stemmer_sv.go
  constant SnowballStemmerName (line 25) | SnowballStemmerName = "stemmer_sv_snowball"
  type SwedishStemmerFilter (line 27) | type SwedishStemmerFilter struct
    method Filter (line 34) | func (s *SwedishStemmerFilter) Filter(input analysis.TokenStream) anal...
  function NewSwedishStemmerFilter (line 30) | func NewSwedishStemmerFilter() *SwedishStemmerFilter {
  function SwedishStemmerFilterConstructor (line 43) | func SwedishStemmerFilterConstructor(config map[string]interface{}, cach...
  function init (line 47) | func init() {

FILE: analysis/lang/sv/stop_filter_sv.go
  function StopTokenFilterConstructor (line 23) | func StopTokenFilterConstructor(config map[string]interface{}, cache *re...
  function init (line 31) | func init() {

FILE: analysis/lang/sv/stop_words_sv.go
  constant StopName (line 8) | StopName = "stop_sv"
  function TokenMapConstructor (line 149) | func TokenMapConstructor(config map[string]interface{}, cache *registry....
  function init (line 155) | func init() {

FILE: analysis/lang/tr/analyzer_tr.go
  constant AnalyzerName (line 26) | AnalyzerName = "tr"
  function AnalyzerConstructor (line 28) | func AnalyzerConstructor(config map[string]interface{}, cache *registry....
  function init (line 61) | func init() {

FILE: analysis/lang/tr/analyzer_tr_test.go
  function TestTurkishAnalyzer (line 25) | func TestTurkishAnalyzer(t *testing.T) {

FILE: analysis/lang/tr/stemmer_tr.go
  constant SnowballStemmerName (line 25) | SnowballStemmerName = "stemmer_tr_snowball"
  type TurkishStemmerFilter (line 27) | type TurkishStemmerFilter struct
    method Filter (line 34) | func (s *TurkishStemmerFilter) Filter(input analysis.TokenStream) anal...
  function NewTurkishStemmerFilter (line 30) | func NewTurkishStemmerFilter() *TurkishStemmerFilter {
  function TurkishStemmerFilterConstructor (line 43) | func TurkishStemmerFilterConstructor(config map[string]interface{}, cach...
  function init (line 47) | func init() {

FILE: analysis/lang/tr/stemmer_tr_test.go
  function TestSnowballTurkishStemmer (line 25) | func TestSnowballTurkishStemmer(t *testing.T) {

FILE: analysis/lang/tr/stop_filter_tr.go
  function StopTokenFilterConstructor (line 23) | func StopTokenFilterConstructor(config map[string]interface{}, cache *re...
  function init (line 31) | func init() {

FILE: analysis/lang/tr/stop_words_tr.go
  constant StopName (line 8) | StopName = "stop_tr"
  function TokenMapConstructor (line 228) | func TokenMapConstructor(config map[string]interface{}, cache *registry....
  function init (line 234) | func init() {

FILE: analysis/token/apostrophe/apostrophe.go
  constant Name (line 24) | Name = "apostrophe"
  constant RightSingleQuotationMark (line 26) | RightSingleQuotationMark = "’"
  constant Apostrophe (line 27) | Apostrophe = "'"
  constant Apostrophes (line 28) | Apostrophes = Apostrophe + RightSingleQuotationMark
  type ApostropheFilter (line 30) | type ApostropheFilter struct
    method Filter (line 36) | func (s *ApostropheFilter) Filter(input analysis.TokenStream) analysis...
  function NewApostropheFilter (line 32) | func NewApostropheFilter() *ApostropheFilter {
  function ApostropheFilterConstructor (line 48) | func ApostropheFilterConstructor(config map[string]interface{}, cache *r...
  function init (line 52) | func init() {

FILE: analysis/token/apostrophe/apostrophe_test.go
  function TestApostropheFilter (line 24) | func TestApostropheFilter(t *testing.T) {

FILE: analysis/token/camelcase/camelcase.go
  constant Name (line 25) | Name = "camelCase"
  type CamelCaseFilter (line 44) | type CamelCaseFilter struct
    method Filter (line 50) | func (f *CamelCaseFilter) Filter(input analysis.TokenStream) analysis....
  function NewCamelCaseFilter (line 46) | func NewCamelCaseFilter() *CamelCaseFilter {
  function CamelCaseFilterConstructor (line 72) | func CamelCaseFilterConstructor(config map[string]interface{}, cache *re...
  function init (line 76) | func init() {

FILE: analysis/token/camelcase/camelcase_test.go
  function TestCamelCaseFilter (line 24) | func TestCamelCaseFilter(t *testing.T) {
  function tokenStream (line 82) | func tokenStream(termStrs ...string) analysis.TokenStream {

FILE: analysis/token/camelcase/parser.go
  type Parser (line 40) | type Parser struct
    method buildTokenFromTerm (line 21) | func (p *Parser) buildTokenFromTerm(buffer []rune) *analysis.Token {
    method Push (line 59) | func (p *Parser) Push(sym rune, peek *rune) {
    method NewState (line 81) | func (p *Parser) NewState(sym rune) State {
    method FlushTokens (line 102) | func (p *Parser) FlushTokens() []*analysis.Token {
    method NextPosition (line 107) | func (p *Parser) NextPosition() int {
  function NewParser (line 49) | func NewParser(length, position, index int) *Parser {

FILE: analysis/token/camelcase/states.go
  type State (line 22) | type State interface
  type LowerCaseState (line 31) | type LowerCaseState struct
    method Member (line 33) | func (s *LowerCaseState) Member(sym rune, peek *rune) bool {
    method StartSym (line 37) | func (s *LowerCaseState) StartSym(sym rune) bool {
  type UpperCaseState (line 41) | type UpperCaseState struct
    method Member (line 46) | func (s *UpperCaseState) Member(sym rune, peek *rune) bool {
    method StartSym (line 65) | func (s *UpperCaseState) StartSym(sym rune) bool {
  type NumberCaseState (line 69) | type NumberCaseState struct
    method Member (line 71) | func (s *NumberCaseState) Member(sym rune, peek *rune) bool {
    method StartSym (line 75) | func (s *NumberCaseState) StartSym(sym rune) bool {
  type NonAlphaNumericCaseState (line 79) | type NonAlphaNumericCaseState struct
    method Member (line 81) | func (s *NonAlphaNumericCaseState) Member(sym rune, peek *rune) bool {
    method StartSym (line 85) | func (s *NonAlphaNumericCaseState) StartSym(sym rune) bool {

FILE: analysis/token/compound/dict.go
  constant Name (line 26) | Name = "dict_compound"
  constant defaultMinWordSize (line 28) | defaultMinWordSize = 5
  constant defaultMinSubWordSize (line 29) | defaultMinSubWordSize = 2
  constant defaultMaxSubWordSize (line 30) | defaultMaxSubWordSize = 15
  constant defaultOnlyLongestMatch (line 31) | defaultOnlyLongestMatch = false
  type DictionaryCompoundFilter (line 33) | type DictionaryCompoundFilter struct
    method Filter (line 51) | func (f *DictionaryCompoundFilter) Filter(input analysis.TokenStream) ...
    method decompose (line 68) | func (f *DictionaryCompoundFilter) decompose(token *analysis.Token) []...
  function NewDictionaryCompoundFilter (line 41) | func NewDictionaryCompoundFilter(dict analysis.TokenMap, minWordSize, mi...
  function DictionaryCompoundFilterConstructor (line 104) | func DictionaryCompoundFilterConstructor(config map[string]interface{}, ...
  function init (line 139) | func init() {

FILE: analysis/token/compound/dict_test.go
  function TestStopWordsFilter (line 26) | func TestStopWordsFilter(t *testing.T) {
  function TestStopWordsFilterLongestMatch (line 131) | func TestStopWordsFilterLongestMatch(t *testing.T) {

FILE: analysis/token/edgengram/edgengram.go
  constant Name (line 26) | Name = "edge_ngram"
  type Side (line 28) | type Side
  constant BACK (line 30) | BACK Side = true
  constant FRONT (line 31) | FRONT Side = false
  type EdgeNgramFilter (line 33) | type EdgeNgramFilter struct
    method Filter (line 47) | func (s *EdgeNgramFilter) Filter(input analysis.TokenStream) analysis....
  function NewEdgeNgramFilter (line 39) | func NewEdgeNgramFilter(side Side, minLength, maxLength int) *EdgeNgramF...
  function EdgeNgramFilterConstructor (line 93) | func EdgeNgramFilterConstructor(config map[string]interface{}, cache *re...
  function init (line 113) | func init() {

FILE: analysis/token/edgengram/edgengram_test.go
  function TestEdgeNgramFilter (line 24) | func TestEdgeNgramFilter(t *testing.T) {

FILE: analysis/token/elision/elision.go
  constant Name (line 25) | Name = "elision"
  constant RightSingleQuotationMark (line 27) | RightSingleQuotationMark = '’'
  constant Apostrophe (line 28) | Apostrophe = '\''
  type ElisionFilter (line 30) | type ElisionFilter struct
    method Filter (line 40) | func (s *ElisionFilter) Filter(input analysis.TokenStream) analysis.To...
  function NewElisionFilter (line 34) | func NewElisionFilter(articles analysis.TokenMap) *ElisionFilter {
  function ElisionFilterConstructor (line 60) | func ElisionFilterConstructor(config map[string]interface{}, cache *regi...
  function init (line 72) | func init() {

FILE: analysis/token/elision/elision_test.go
  function TestElisionFilter (line 26) | func TestElisionFilter(t *testing.T) {

FILE: analysis/token/hierarchy/hierarchy.go
  constant Name (line 12) | Name = "hierarchy"
  type HierarchyFilter (line 14) | type HierarchyFilter struct
    method Filter (line 28) | func (s *HierarchyFilter) Filter(input analysis.TokenStream) analysis....
    method buildToken (line 52) | func (s *HierarchyFilter) buildToken(tokenStream analysis.TokenStream,...
  function NewHierarchyFilter (line 20) | func NewHierarchyFilter(delimiter []byte, maxLevels int, splitInput bool...
  function HierarchyFilterConstructor (line 69) | func HierarchyFilterConstructor(config map[string]interface{}, cache *re...
  function init (line 90) | func init() {

FILE: analysis/token/hierarchy/hierarchy_test.go
  function TestHierarchyFilter (line 10) | func TestHierarchyFilter(t *testing.T) {

FILE: analysis/token/keyword/keyword.go
  constant Name (line 24) | Name = "keyword_marker"
  type KeyWordMarkerFilter (line 26) | type KeyWordMarkerFilter struct
    method Filter (line 36) | func (f *KeyWordMarkerFilter) Filter(input analysis.TokenStream) analy...
  function NewKeyWordMarkerFilter (line 30) | func NewKeyWordMarkerFilter(keyWords analysis.TokenMap) *KeyWordMarkerFi...
  function KeyWordMarkerFilterConstructor (line 46) | func KeyWordMarkerFilterConstructor(config map[string]interface{}, cache...
  function init (line 58) | func init() {

FILE: analysis/token/keyword/keyword_test.go
  function TestKeyWordMarkerFilter (line 24) | func TestKeyWordMarkerFilter(t *testing.T) {

FILE: analysis/token/length/length.go
  constant Name (line 25) | Name = "length"
  type LengthFilter (line 27) | type LengthFilter struct
    method Filter (line 39) | func (f *LengthFilter) Filter(input analysis.TokenStream) analysis.Tok...
  function NewLengthFilter (line 32) | func NewLengthFilter(min, max int) *LengthFilter {
  function LengthFilterConstructor (line 56) | func LengthFilterConstructor(config map[string]interface{}, cache *regis...
  function init (line 75) | func init() {

FILE: analysis/token/length/length_test.go
  function TestLengthFilter (line 23) | func TestLengthFilter(t *testing.T) {
  function TestLengthFilterNoMax (line 47) | func TestLengthFilterNoMax(t *testing.T) {
  function TestLengthFilterNoMin (line 74) | func TestLengthFilterNoMin(t *testing.T) {

FILE: analysis/token/lowercase/lowercase.go
  constant Name (line 29) | Name = "to_lower"
  type LowerCaseFilter (line 31) | type LowerCaseFilter struct
    method Filter (line 38) | func (f *LowerCaseFilter) Filter(input analysis.TokenStream) analysis....
  function NewLowerCaseFilter (line 34) | func NewLowerCaseFilter() *LowerCaseFilter {
  function LowerCaseFilterConstructor (line 45) | func LowerCaseFilterConstructor(config map[string]interface{}, cache *re...
  function init (line 49) | func init() {
  function toLowerDeferredCopy (line 62) | func toLowerDeferredCopy(s []byte) []byte {

FILE: analysis/token/lowercase/lowercase_test.go
  function TestLowerCaseFilter (line 24) | func TestLowerCaseFilter(t *testing.T) {
  function BenchmarkLowerCaseFilter (line 88) | func BenchmarkLowerCaseFilter(b *testing.B) {

FILE: analysis/token/ngram/ngram.go
  constant Name (line 26) | Name = "ngram"
  type NgramFilter (line 28) | type NgramFilter struct
    method Filter (line 40) | func (s *NgramFilter) Filter(input analysis.TokenStream) analysis.Toke...
  function NewNgramFilter (line 33) | func NewNgramFilter(minLength, maxLength int) *NgramFilter {
  function NgramFilterConstructor (line 68) | func NgramFilterConstructor(config map[string]interface{}, cache *regist...
  function init (line 92) | func init() {
  function convertToInt (line 100) | func convertToInt(val interface{}) (int, error) {

FILE: analysis/token/ngram/ngram_test.go
  function TestNgramFilter (line 24) | func TestNgramFilter(t *testing.T) {
  function TestConversionInt (line 139) | func TestConversionInt(t *testing.T) {
  function TestConversionFloat (line 158) | func TestConversionFloat(t *testing.T) {
  function TestBadConversion (line 177) | func TestBadConversion(t *testing.T) {

FILE: analysis/token/porter/porter.go
  constant Name (line 26) | Name = "stemmer_porter"
  type PorterStemmer (line 28) | type PorterStemmer struct
    method Filter (line 35) | func (s *PorterStemmer) Filter(input analysis.TokenStream) analysis.To...
  function NewPorterStemmer (line 31) | func NewPorterStemmer() *PorterStemmer {
  function PorterStemmerConstructor (line 47) | func PorterStemmerConstructor(config map[string]interface{}, cache *regi...
  function init (line 51) | func init() {

FILE: analysis/token/porter/porter_test.go
  function TestPorterStemmer (line 24) | func TestPorterStemmer(t *testing.T) {
  function BenchmarkPorterStemmer (line 84) | func BenchmarkPorterStemmer(b *testing.B) {

FILE: analysis/token/reverse/reverse.go
  constant Name (line 26) | Name = "reverse"
  type ReverseFilter (line 28) | type ReverseFilter struct
    method Filter (line 35) | func (f *ReverseFilter) Filter(input analysis.TokenStream) analysis.To...
  function NewReverseFilter (line 31) | func NewReverseFilter() *ReverseFilter {
  function ReverseFilterConstructor (line 42) | func ReverseFilterConstructor(config map[string]interface{}, cache *regi...
  function init (line 46) | func init() {
  function reverse (line 55) | func reverse(s []byte) []byte {

FILE: analysis/token/reverse/reverse_test.go
  function TestReverseFilter (line 24) | func TestReverseFilter(t *testing.T) {
  function BenchmarkReverseFilter (line 109) | func BenchmarkReverseFilter(b *testing.B) {

FILE: analysis/token/shingle/shingle.go
  constant Name (line 25) | Name = "shingle"
  type ShingleFilter (line 27) | type ShingleFilter struct
    method Filter (line 45) | func (s *ShingleFilter) Filter(input analysis.TokenStream) analysis.To...
    method shingleCurrentRingState (line 87) | func (s *ShingleFilter) shingleCurrentRingState(ring *ring.Ring, items...
  function NewShingleFilter (line 35) | func NewShingleFilter(min, max int, outputOriginal bool, sep, fill strin...
  function ShingleFilterConstructor (line 134) | func ShingleFilterConstructor(config map[string]interface{}, cache *regi...
  function init (line 167) | func init() {

FILE: analysis/token/shingle/shingle_test.go
  function TestShingleFilter (line 24) | func TestShingleFilter(t *testing.T) {
  function TestShingleFilterBug431 (line 340) | func TestShingleFilterBug431(t *testing.T) {

FILE: analysis/token/snowball/snowball.go
  constant Name (line 26) | Name = "stemmer_snowball"
  type SnowballStemmer (line 28) | type SnowballStemmer struct
    method Filter (line 38) | func (s *SnowballStemmer) Filter(input analysis.TokenStream) analysis....
  function NewSnowballStemmer (line 32) | func NewSnowballStemmer(language string) *SnowballStemmer {
  function SnowballStemmerConstructor (line 49) | func SnowballStemmerConstructor(config map[string]interface{}, cache *re...
  function init (line 57) | func init() {

FILE: analysis/token/snowball/snowball_test.go
  function TestSnowballStemmer (line 24) | func TestSnowballStemmer(t *testing.T) {
  function BenchmarkSnowballStemmer (line 84) | func BenchmarkSnowballStemmer(b *testing.B) {

FILE: analysis/token/stop/stop.go
  constant Name (line 31) | Name = "stop_tokens"
  type StopTokensFilter (line 33) | type StopTokensFilter struct
    method Filter (line 43) | func (f *StopTokensFilter) Filter(input analysis.TokenStream) analysis...
  function NewStopTokensFilter (line 37) | func NewStopTokensFilter(stopTokens analysis.TokenMap) *StopTokensFilter {
  function StopTokensFilterConstructor (line 56) | func StopTokensFilterConstructor(config map[string]interface{}, cache *r...
  function init (line 68) | func init() {

FILE: analysis/token/stop/stop_test.go
  function TestStopWordsFilter (line 26) | func TestStopWordsFilter(t *testing.T) {
  function BenchmarkStopWordsFilter (line 80) | func BenchmarkStopWordsFilter(b *testing.B) {

FILE: analysis/token/truncate/truncate.go
  constant Name (line 25) | Name = "truncate_token"
  type TruncateTokenFilter (line 27) | type TruncateTokenFilter struct
    method Filter (line 37) | func (s *TruncateTokenFilter) Filter(input analysis.TokenStream) analy...
  function NewTruncateTokenFilter (line 31) | func NewTruncateTokenFilter(length int) *TruncateTokenFilter {
  function TruncateTokenFilterConstructor (line 47) | func TruncateTokenFilterConstructor(config map[string]interface{}, cache...
  function init (line 57) | func init() {

FILE: analysis/token/truncate/truncate_test.go
  function TestTruncateTokenFilter (line 24) | func TestTruncateTokenFilter(t *testing.T) {

FILE: analysis/token/unicodenorm/unicodenorm.go
  constant Name (line 25) | Name = "normalize_unicode"
  constant NFC (line 27) | NFC = "nfc"
  constant NFD (line 28) | NFD = "nfd"
  constant NFKC (line 29) | NFKC = "nfkc"
  constant NFKD (line 30) | NFKD = "nfkd"
  type UnicodeNormalizeFilter (line 39) | type UnicodeNormalizeFilter struct
    method Filter (line 61) | func (s *UnicodeNormalizeFilter) Filter(input analysis.TokenStream) an...
  function NewUnicodeNormalizeFilter (line 43) | func NewUnicodeNormalizeFilter(formName string) (*UnicodeNormalizeFilter...
  function MustNewUnicodeNormalizeFilter (line 53) | func MustNewUnicodeNormalizeFilter(formName string) *UnicodeNormalizeFil...
  function UnicodeNormalizeFilterConstructor (line 68) | func UnicodeNormalizeFilterConstructor(config map[string]interface{}, ca...
  function init (line 77) | func init() {

FILE: analysis/token/unicodenorm/unicodenorm_test.go
  function TestUnicodeNormalization (line 28) | func TestUnicodeNormalization(t *testing.T) {

FILE: analysis/token/unique/unique.go
  constant Name (line 22) | Name = "unique"
  type UniqueTermFilter (line 26) | type UniqueTermFilter struct
    method Filter (line 32) | func (f *UniqueTermFilter) Filter(input analysis.TokenStream) analysis...
  function NewUniqueTermFilter (line 28) | func NewUniqueTermFilter() *UniqueTermFilter {
  function UniqueTermFilterConstructor (line 47) | func UniqueTermFilterConstructor(config map[string]interface{}, cache *r...
  function init (line 51) | func init() {

FILE: analysis/token/unique/unique_test.go
  function TestUniqueTermFilter (line 24) | func TestUniqueTermFilter(t *testing.T) {
  function tokenStream (line 63) | func tokenStream(termStrs ...string) analysis.TokenStream {
  function subStream (line 78) | func subStream(stream analysis.TokenStream, indices []int) analysis.Toke...

FILE: analysis/tokenizer/character/character.go
  type IsTokenRune (line 23) | type IsTokenRune
  type CharacterTokenizer (line 25) | type CharacterTokenizer struct
    method Tokenize (line 35) | func (c *CharacterTokenizer) Tokenize(input []byte) analysis.TokenStre...
  function NewCharacterTokenizer (line 29) | func NewCharacterTokenizer(f IsTokenRune) *CharacterTokenizer {

FILE: analysis/tokenizer/character/character_test.go
  function TestCharacterTokenizer (line 25) | func TestCharacterTokenizer(t *testing.T) {

FILE: analysis/tokenizer/exception/exception.go
  constant Name (line 38) | Name = "exception"
  type ExceptionsTokenizer (line 40) | type ExceptionsTokenizer struct
    method Tokenize (line 52) | func (t *ExceptionsTokenizer) Tokenize(input []byte) analysis.TokenStr...
  function NewExceptionsTokenizer (line 45) | func NewExceptionsTokenizer(exception *regexp.Regexp, remaining analysis...
  function ExceptionsTokenizerConstructor (line 104) | func ExceptionsTokenizerConstructor(config map[string]interface{}, cache...
  function init (line 139) | func init() {

FILE: analysis/tokenizer/exception/exception_test.go
  function TestExceptionsTokenizer (line 26) | func TestExceptionsTokenizer(t *testing.T) {

FILE: analysis/tokenizer/letter/letter.go
  constant Name (line 25) | Name = "letter"
  function TokenizerConstructor (line 27) | func TokenizerConstructor(config map[string]interface{}, cache *registry...
  function init (line 31) | func init() {

FILE: analysis/tokenizer/regexp/regexp.go
  constant Name (line 26) | Name = "regexp"
  type RegexpTokenizer (line 30) | type RegexpTokenizer struct
    method Tokenize (line 40) | func (rt *RegexpTokenizer) Tokenize(input []byte) analysis.TokenStream {
  function NewRegexpTokenizer (line 34) | func NewRegexpTokenizer(r *regexp.Regexp) *RegexpTokenizer {
  function RegexpTokenizerConstructor (line 59) | func RegexpTokenizerConstructor(config map[string]interface{}, cache *re...
  function init (line 71) | func init() {
  function detectTokenType (line 78) | func detectTokenType(termBytes []byte) analysis.TokenType {

FILE: analysis/tokenizer/regexp/regexp_test.go
  function TestBoundary (line 25) | func TestBoundary(t *testing.T) {
  function TestBugProducingEmptyTokens (line 122) | func TestBugProducingEmptyTokens(t *testing.T) {

FILE: analysis/tokenizer/single/single.go
  constant Name (line 22) | Name = "single"
  type SingleTokenTokenizer (line 24) | type SingleTokenTokenizer struct
    method Tokenize (line 31) | func (t *SingleTokenTokenizer) Tokenize(input []byte) analysis.TokenSt...
  function NewSingleTokenTokenizer (line 27) | func NewSingleTokenTokenizer() *SingleTokenTokenizer {
  function SingleTokenTokenizerConstructor (line 43) | func SingleTokenTokenizerConstructor(config map[string]interface{}, cach...
  function init (line 47) | func init() {

FILE: analysis/tokenizer/single/single_test.go
  function TestSingleTokenTokenizer (line 24) | func TestSingleTokenTokenizer(t *testing.T) {

FILE: analysis/tokenizer/unicode/unicode.go
  constant Name (line 24) | Name = "unicode"
  type UnicodeTokenizer (line 26) | type UnicodeTokenizer struct
    method Tokenize (line 33) | func (rt *UnicodeTokenizer) Tokenize(input []byte) analysis.TokenStream {
  function NewUnicodeTokenizer (line 29) | func NewUnicodeTokenizer() *UnicodeTokenizer {
  function UnicodeTokenizerConstructor (line 113) | func UnicodeTokenizerConstructor(config map[string]interface{}, cache *r...
  function init (line 117) | func init() {
  function convertType (line 124) | func convertType(segmentWordType int) analysis.TokenType {

FILE: analysis/tokenizer/unicode/unicode_test.go
  function TestUnicode (line 25) | func TestUnicode(t *testing.T) {
  function BenchmarkTokenizeEnglishText (line 166) | func BenchmarkTokenizeEnglishText(b *testing.B) {
  function TestConvertType (line 177) | func TestConvertType(t *testing.T) {

FILE: analysis/tokenizer/web/web.go
  constant Name (line 27) | Name = "web"
  function TokenizerConstructor (line 37) | func TokenizerConstructor(config map[string]interface{}, cache *registry...
  function init (line 45) | func init() {

FILE: analysis/tokenizer/web/web_test.go
  function TestWeb (line 25) | func TestWeb(t *testing.T) {

FILE: analysis/tokenizer/whitespace/whitespace.go
  constant Name (line 25) | Name = "whitespace"
  function TokenizerConstructor (line 27) | func TokenizerConstructor(config map[string]interface{}, cache *registry...
  function notSpace (line 31) | func notSpace(r rune) bool {
  function init (line 35) | func init() {

FILE: analysis/tokenizer/whitespace/whitespace_test.go
  function TestBoundary (line 25) | func TestBoundary(t *testing.T) {
  function BenchmarkTokenizeEnglishText (line 97) | func BenchmarkTokenizeEnglishText(b *testing.B) {

FILE: analysis/tokenmap.go
  type TokenMap (line 25) | type TokenMap
    method LoadFile (line 34) | func (t TokenMap) LoadFile(filename string) error {
    method LoadBytes (line 45) | func (t TokenMap) LoadBytes(data []byte) error {
    method LoadLine (line 61) | func (t TokenMap) LoadLine(line string) {
    method AddToken (line 74) | func (t TokenMap) AddToken(token string) {
  function NewTokenMap (line 27) | func NewTokenMap() TokenMap {

FILE: analysis/tokenmap/custom.go
  constant Name (line 35) | Name = "custom"
  function GenericTokenMapConstructor (line 37) | func GenericTokenMapConstructor(config map[string]interface{}, cache *re...
  function init (line 60) | func init() {

FILE: analysis/tokenmap_test.go
  function TestTokenMapLoadFile (line 22) | func TestTokenMapLoadFile(t *testing.T) {

FILE: analysis/type.go
  type CharFilter (line 22) | type CharFilter interface
  type TokenType (line 26) | type TokenType
  constant AlphaNumeric (line 29) | AlphaNumeric TokenType = iota
  constant Ideographic (line 30) | Ideographic
  constant Numeric (line 31) | Numeric
  constant DateTime (line 32) | DateTime
  constant Shingle (line 33) | Shingle
  constant Single (line 34) | Single
  constant Double (line 35) | Double
  constant Boolean (line 36) | Boolean
  constant IP (line 37) | IP
  type Token (line 42) | type Token struct
    method String (line 58) | func (t *Token) String() string {
  type TokenStream (line 62) | type TokenStream
  type Tokenizer (line 66) | type Tokenizer interface
  type TokenFilter (line 71) | type TokenFilter interface
  type Analyzer (line 75) | type Analyzer interface
  type DefaultAnalyzer (line 79) | type DefaultAnalyzer struct
    method Analyze (line 85) | func (a *DefaultAnalyzer) Analyze(input []byte) TokenStream {
  type DateTimeParser (line 105) | type DateTimeParser interface
  constant SynonymSourceType (line 109) | SynonymSourceType = "synonym"
  type SynonymSourceVisitor (line 111) | type SynonymSourceVisitor
  type SynonymSource (line 113) | type SynonymSource interface
  type ByteArrayConverter (line 118) | type ByteArrayConverter interface

FILE: analysis/util.go
  function DeleteRune (line 22) | func DeleteRune(in []rune, pos int) []rune {
  function InsertRune (line 30) | func InsertRune(in []rune, pos int, r rune) []rune {
  function BuildTermFromRunesOptimistic (line 48) | func BuildTermFromRunesOptimistic(buf []byte, runes []rune) []byte {
  function BuildTermFromRunes (line 66) | func BuildTermFromRunes(runes []rune) []byte {
  function TruncateRunes (line 70) | func TruncateRunes(input []byte, num int) []byte {
  function RunesEndsWith (line 77) | func RunesEndsWith(input []rune, suffix string) bool {

FILE: analysis/util_test.go
  function TestDeleteRune (line 22) | func TestDeleteRune(t *testing.T) {
  function TestInsertRune (line 43) | func TestInsertRune(t *testing.T) {
  function TestBuildTermFromRunes (line 78) | func TestBuildTermFromRunes(t *testing.T) {
  function TestBuildTermFromRunesOptimistic (line 98) | func TestBuildTermFromRunesOptimistic(t *testing.T) {
  function BenchmarkBuildTermFromRunes (line 130) | func BenchmarkBuildTermFromRunes(b *testing.B) {

FILE: builder.go
  type builderImpl (line 27) | type builderImpl struct
    method Index (line 32) | func (b *builderImpl) Index(id string, data interface{}) error {
    method Close (line 46) | func (b *builderImpl) Close() error {
  function newBuilder (line 50) | func newBuilder(path string, mapping mapping.IndexMapping, config map[st...

FILE: builder_test.go
  function TestBuilder (line 23) | func TestBuilder(t *testing.T) {

FILE: cmd/bleve/cmd/bulk.go
  function randomString (line 103) | func randomString(n int) string {
  function init (line 111) | func init() {

FILE: cmd/bleve/cmd/check.go
  function checkField (line 65) | func checkField(index bleve.Index, fieldName string) (int, error) {
  function getDictionary (line 101) | func getDictionary(index bleve.Index, field string) (map[string]uint64, ...
  function init (line 127) | func init() {

FILE: cmd/bleve/cmd/count.go
  function init (line 38) | func init() {

FILE: cmd/bleve/cmd/create.go
  function buildMapping (line 60) | func buildMapping() (mapping.IndexMapping, error) {
  function init (line 75) | func init() {

FILE: cmd/bleve/cmd/dictionary.go
  function init (line 58) | func init() {

FILE: cmd/bleve/cmd/dump.go
  function init (line 59) | func init() {

FILE: cmd/bleve/cmd/dumpDoc.go
  function init (line 61) | func init() {

FILE: cmd/bleve/cmd/dumpFields.go
  function init (line 57) | func init() {

FILE: cmd/bleve/cmd/fields.go
  function init (line 48) | func init() {

FILE: cmd/bleve/cmd/index.go
  type file (line 70) | type file struct
  function handleArgs (line 75) | func handleArgs(args []string) chan file {
  function getAllFiles (line 81) | func getAllFiles(args []string, rv chan file) {
  function init (line 110) | func init() {

FILE: cmd/bleve/cmd/mapping.go
  function init (line 40) | func init() {

FILE: cmd/bleve/cmd/query.go
  function buildQuery (line 66) | func buildQuery(args []string) query.Query {
  function init (line 89) | func init() {

FILE: cmd/bleve/cmd/registry.go
  function printType (line 71) | func printType(label string, types, instances []string) {
  function init (line 86) | func init() {

FILE: cmd/bleve/cmd/root.go
  constant canMutateBleveIndex (line 34) | canMutateBleveIndex = "canMutateBleveIndex"
  function CanMutateBleveIndex (line 39) | func CanMutateBleveIndex(c *cobra.Command) bool {
  function Execute (line 88) | func Execute() {

FILE: cmd/bleve/cmd/scorch.go
  function init (line 23) | func init() {

FILE: cmd/bleve/cmd/scorch/ascii.go
  function init (line 57) | func init() {

FILE: cmd/bleve/cmd/scorch/deleted.go
  function init (line 53) | func init() {

FILE: cmd/bleve/cmd/scorch/info.go
  function init (line 57) | func init() {

FILE: cmd/bleve/cmd/scorch/internal.go
  function init (line 58) | func init() {

FILE: cmd/bleve/cmd/scorch/root.go
  function Execute (line 65) | func Execute() {

FILE: cmd/bleve/cmd/scorch/snapshot.go
  function init (line 62) | func init() {

FILE: cmd/bleve/gendocs.go
  function main (line 38) | func main() {

FILE: cmd/bleve/main.go
  function main (line 24) | func main() {

FILE: config.go
  type configuration (line 32) | type configuration struct
    method SetAnalysisQueueSize (line 42) | func (c *configuration) SetAnalysisQueueSize(n int) {
    method Shutdown (line 49) | func (c *configuration) Shutdown() {
  function newConfiguration (line 53) | func newConfiguration() *configuration {
  function init (line 63) | func init() {
  function SetLog (line 93) | func SetLog(l *log.Logger) {

FILE: config_app.go
  function initDisk (line 22) | func initDisk() {

FILE: config_disk.go
  function initDisk (line 23) | func initDisk() {

FILE: document/document.go
  function init (line 27) | func init() {
  type Document (line 32) | type Document struct
    method StoredFieldsBytes (line 41) | func (d *Document) StoredFieldsBytes() uint64 {
    method Size (line 60) | func (d *Document) Size() int {
    method AddField (line 75) | func (d *Document) AddField(f Field) *Document {
    method GoString (line 85) | func (d *Document) GoString() string {
    method NumPlainTextBytes (line 103) | func (d *Document) NumPlainTextBytes() uint64 {
    method ID (line 118) | func (d *Document) ID() string {
    method SetID (line 122) | func (d *Document) SetID(id string) {
    method AddIDField (line 126) | func (d *Document) AddIDField() {
    method VisitFields (line 130) | func (d *Document) VisitFields(visitor index.FieldVisitor) {
    method VisitComposite (line 136) | func (d *Document) VisitComposite(visitor index.CompositeFieldVisitor) {
    method HasComposite (line 142) | func (d *Document) HasComposite() bool {
    method VisitSynonymFields (line 146) | func (d *Document) VisitSynonymFields(visitor index.SynonymFieldVisito...
    method SetIndexed (line 154) | func (d *Document) SetIndexed() {
    method Indexed (line 158) | func (d *Document) Indexed() bool {
    method AddNestedDocument (line 162) | func (d *Document) AddNestedDocument(doc *Document) {
    method VisitNestedDocuments (line 166) | func (d *Document) VisitNestedDocuments(visitor func(doc index.Documen...
  function NewDocument (line 45) | func NewDocument(id string) *Document {
  function NewSynonymDocument (line 53) | func NewSynonymDocument(id string) *Document {

FILE: document/document_test.go
  function TestDocumentNumPlainTextBytes (line 21) | func TestDocumentNumPlainTextBytes(t *testing.T) {

FILE: document/field.go
  type Field (line 21) | type Field interface

FILE: document/field_boolean.go
  function init (line 28) | func init() {
  constant DefaultBooleanIndexingOptions (line 33) | DefaultBooleanIndexingOptions = index.StoreField | index.IndexField | in...
  type BooleanField (line 35) | type BooleanField struct
    method Size (line 45) | func (b *BooleanField) Size() int {
    method Name (line 57) | func (b *BooleanField) Name() string {
    method ArrayPositions (line 61) | func (b *BooleanField) ArrayPositions() []uint64 {
    method Options (line 65) | func (b *BooleanField) Options() index.FieldIndexingOptions {
    method Analyze (line 69) | func (b *BooleanField) Analyze() {
    method Value (line 83) | func (b *BooleanField) Value() []byte {
    method Boolean (line 87) | func (b *BooleanField) Boolean() (bool, error) {
    method GoString (line 94) | func (b *BooleanField) GoString() string {
    method NumPlainTextBytes (line 98) | func (b *BooleanField) NumPlainTextBytes() uint64 {
    method EncodedFieldType (line 102) | func (b *BooleanField) EncodedFieldType() byte {
    method AnalyzedLength (line 106) | func (b *BooleanField) AnalyzedLength() int {
    method AnalyzedTokenFrequencies (line 110) | func (b *BooleanField) AnalyzedTokenFrequencies() index.TokenFrequenci...
  function NewBooleanFieldFromBytes (line 114) | func NewBooleanFieldFromBytes(name string, arrayPositions []uint64, valu...
  function NewBooleanField (line 124) | func NewBooleanField(name string, arrayPositions []uint64, b bool) *Bool...
  function NewBooleanFieldWithIndexingOptions (line 128) | func NewBooleanFieldWithIndexingOptions(name string, arrayPositions []ui...

FILE: document/field_composite.go
  function init (line 26) | func init() {
  constant DefaultCompositeIndexingOptions (line 31) | DefaultCompositeIndexingOptions = index.IndexField
  type CompositeField (line 33) | type CompositeField struct
    method Size (line 67) | func (c *CompositeField) Size() int {
    method Name (line 85) | func (c *CompositeField) Name() string {
    method ArrayPositions (line 89) | func (c *CompositeField) ArrayPositions() []uint64 {
    method Options (line 93) | func (c *CompositeField) Options() index.FieldIndexingOptions {
    method Analyze (line 97) | func (c *CompositeField) Analyze() {
    method Value (line 100) | func (c *CompositeField) Value() []byte {
    method NumPlainTextBytes (line 104) | func (c *CompositeField) NumPlainTextBytes() uint64 {
    method includesField (line 108) | func (c *CompositeField) includesField(field string) bool {
    method Compose (line 121) | func (c *CompositeField) Compose(field string, length int, freq index....
    method EncodedFieldType (line 128) | func (c *CompositeField) EncodedFieldType() byte {
    method AnalyzedLength (line 132) | func (c *CompositeField) AnalyzedLength() int {
    method AnalyzedTokenFrequencies (line 136) | func (c *CompositeField) AnalyzedTokenFrequencies() index.TokenFrequen...
  function NewCompositeField (line 43) | func NewCompositeField(name string, defaultInclude bool, include []strin...
  function NewCompositeFieldWithIndexingOptions (line 47) | func NewCompositeFieldWithIndexingOptions(name string, defaultInclude bo...

FILE: document/field_datetime.go
  function init (line 34) | func init() {
  constant DefaultDateTimeIndexingOptions (line 39) | DefaultDateTimeIndexingOptions = index.StoreField | index.IndexField | i...
  constant DefaultDateTimePrecisionStep (line 40) | DefaultDateTimePrecisionStep uint = 4
  type DateTimeField (line 45) | type DateTimeField struct
    method Size (line 55) | func (n *DateTimeField) Size() int {
    method Name (line 67) | func (n *DateTimeField) Name() string {
    method ArrayPositions (line 71) | func (n *DateTimeField) ArrayPositions() []uint64 {
    method Options (line 75) | func (n *DateTimeField) Options() index.FieldIndexingOptions {
    method EncodedFieldType (line 79) | func (n *DateTimeField) EncodedFieldType() byte {
    method AnalyzedLength (line 83) | func (n *DateTimeField) AnalyzedLength() int {
    method AnalyzedTokenFrequencies (line 87) | func (n *DateTimeField) AnalyzedTokenFrequencies() index.TokenFrequenc...
    method splitValue (line 93) | func (n *DateTimeField) splitValue() (numeric.PrefixCoded, string) {
    method Analyze (line 101) | func (n *DateTimeField) Analyze() {
    method Value (line 137) | func (n *DateTimeField) Value() []byte {
    method DateTime (line 141) | func (n *DateTimeField) DateTime() (time.Time, string, error) {
    method GoString (line 150) | func (n *DateTimeField) GoString() string {
    method NumPlainTextBytes (line 154) | func (n *DateTimeField) NumPlainTextBytes() uint64 {
  function NewDateTimeFieldFromBytes (line 158) | func NewDateTimeFieldFromBytes(name string, arrayPositions []uint64, val...
  function NewDateTimeField (line 168) | func NewDateTimeField(name string, arrayPositions []uint64, dt time.Time...
  function NewDateTimeFieldWithIndexingOptions (line 172) | func NewDateTimeFieldWithIndexingOptions(name string, arrayPositions []u...
  function canRepresent (line 197) | func canRepresent(dt time.Time) bool {

FILE: document/field_geopoint.go
  function init (line 30) | func init() {
  type GeoPointField (line 37) | type GeoPointField struct
    method Size (line 49) | func (n *GeoPointField) Size() int {
    method Name (line 61) | func (n *GeoPointField) Name() string {
    method ArrayPositions (line 65) | func (n *GeoPointField) ArrayPositions() []uint64 {
    method Options (line 69) | func (n *GeoPointField) Options() index.FieldIndexingOptions {
    method EncodedFieldType (line 73) | func (n *GeoPointField) EncodedFieldType() byte {
    method AnalyzedLength (line 77) | func (n *GeoPointField) AnalyzedLength() int {
    method AnalyzedTokenFrequencies (line 81) | func (n *GeoPointField) AnalyzedTokenFrequencies() index.TokenFrequenc...
    method Analyze (line 85) | func (n *GeoPointField) Analyze() {
    method Value (line 138) | func (n *GeoPointField) Value() []byte {
    method Lon (line 142) | func (n *GeoPointField) Lon() (float64, error) {
    method Lat (line 150) | func (n *GeoPointField) Lat() (float64, error) {
    method GoString (line 158) | func (n *GeoPointField) GoString() string {
    method NumPlainTextBytes (line 162) | func (n *GeoPointField) NumPlainTextBytes() uint64 {
    method SetSpatialAnalyzerPlugin (line 205) | func (n *GeoPointField) SetSpatialAnalyzerPlugin(
  function NewGeoPointFieldFromBytes (line 166) | func NewGeoPointFieldFromBytes(name string, arrayPositions []uint64, val...
  function NewGeoPointField (line 176) | func NewGeoPointField(name string, arrayPositions []uint64, lon, lat flo...
  function NewGeoPointFieldWithIndexingOptions (line 180) | func NewGeoPointFieldWithIndexingOptions(name string, arrayPositions []u...

FILE: document/field_geopoint_test.go
  function TestGeoPointField (line 5) | func TestGeoPointField(t *testing.T) {

FILE: document/field_geoshape.go
  function init (line 30) | func init() {
  constant DefaultGeoShapeIndexingOptions (line 35) | DefaultGeoShapeIndexingOptions = index.IndexField | index.DocValues
  type GeoShapeField (line 37) | type GeoShapeField struct
    method Size (line 50) | func (n *GeoShapeField) Size() int {
    method Name (line 63) | func (n *GeoShapeField) Name() string {
    method ArrayPositions (line 67) | func (n *GeoShapeField) ArrayPositions() []uint64 {
    method Options (line 71) | func (n *GeoShapeField) Options() index.FieldIndexingOptions {
    method EncodedFieldType (line 75) | func (n *GeoShapeField) EncodedFieldType() byte {
    method AnalyzedLength (line 79) | func (n *GeoShapeField) AnalyzedLength() int {
    method AnalyzedTokenFrequencies (line 83) | func (n *GeoShapeField) AnalyzedTokenFrequencies() index.TokenFrequenc...
    method Analyze (line 87) | func (n *GeoShapeField) Analyze() {
    method Value (line 109) | func (n *GeoShapeField) Value() []byte {
    method GoString (line 113) | func (n *GeoShapeField) GoString() string {
    method NumPlainTextBytes (line 118) | func (n *GeoShapeField) NumPlainTextBytes() uint64 {
    method EncodedShape (line 122) | func (n *GeoShapeField) EncodedShape() []byte {
    method GeoShape (line 271) | func (n *GeoShapeField) GeoShape() (index.GeoJSON, error) {
  function NewGeoShapeField (line 126) | func NewGeoShapeField(name string, arrayPositions []uint64,
  function NewGeoShapeFieldFromBytes (line 132) | func NewGeoShapeFieldFromBytes(name string, arrayPositions []uint64,
  function NewGeoShapeFieldWithIndexingOptions (line 143) | func NewGeoShapeFieldWithIndexingOptions(name string, arrayPositions []u...
  function NewGeoShapeFieldFromShapeWithIndexingOptions (line 155) | func NewGeoShapeFieldFromShapeWithIndexingOptions(name string, arrayPosi...
  function NewGeometryCollectionFieldWithIndexingOptions (line 200) | func NewGeometryCollectionFieldWithIndexingOptions(name string,
  function NewGeometryCollectionFieldFromShapesWithIndexingOptions (line 219) | func NewGeometryCollectionFieldFromShapesWithIndexingOptions(name string,
  function NewGeoCircleFieldWithIndexingOptions (line 256) | func NewGeoCircleFieldWithIndexingOptions(name string, arrayPositions []...

FILE: document/field_ip.go
  function init (line 29) | func init() {
  constant DefaultIPIndexingOptions (line 34) | DefaultIPIndexingOptions = index.StoreField | index.IndexField | index.D...
  type IPField (line 36) | type IPField struct
    method Size (line 46) | func (b *IPField) Size() int {
    method Name (line 58) | func (b *IPField) Name() string {
    method ArrayPositions (line 62) | func (b *IPField) ArrayPositions() []uint64 {
    method Options (line 66) | func (b *IPField) Options() index.FieldIndexingOptions {
    method EncodedFieldType (line 70) | func (n *IPField) EncodedFieldType() byte {
    method AnalyzedLength (line 74) | func (n *IPField) AnalyzedLength() int {
    method AnalyzedTokenFrequencies (line 78) | func (n *IPField) AnalyzedTokenFrequencies() index.TokenFrequencies {
    method Analyze (line 82) | func (b *IPField) Analyze() {
    method Value (line 97) | func (b *IPField) Value() []byte {
    method IP (line 101) | func (b *IPField) IP() (net.IP, error) {
    method GoString (line 105) | func (b *IPField) GoString() string {
    method NumPlainTextBytes (line 109) | func (b *IPField) NumPlainTextBytes() uint64 {
  function NewIPFieldFromBytes (line 113) | func NewIPFieldFromBytes(name string, arrayPositions []uint64, value []b...
  function NewIPField (line 123) | func NewIPField(name string, arrayPositions []uint64, v net.IP) *IPField {
  function NewIPFieldWithIndexingOptions (line 127) | func NewIPFieldWithIndexingOptions(name string, arrayPositions []uint64,...

FILE: document/field_ip_test.go
  function TestIPField (line 23) | func TestIPField(t *testing.T) {

FILE: document/field_numeric.go
  function init (line 29) | func init() {
  constant DefaultNumericIndexingOptions (line 34) | DefaultNumericIndexingOptions = index.StoreField | index.IndexField | in...
  constant DefaultPrecisionStep (line 36) | DefaultPrecisionStep uint = 4
  type NumericField (line 38) | type NumericField struct
    method Size (line 48) | func (n *NumericField) Size() int {
    method Name (line 60) | func (n *NumericField) Name() string {
    method ArrayPositions (line 64) | func (n *NumericField) ArrayPositions() []uint64 {
    method Options (line 68) | func (n *NumericField) Options() index.FieldIndexingOptions {
    method EncodedFieldType (line 72) | func (n *NumericField) EncodedFieldType() byte {
    method AnalyzedLength (line 76) | func (n *NumericField) AnalyzedLength() int {
    method AnalyzedTokenFrequencies (line 80) | func (n *NumericField) AnalyzedTokenFrequencies() index.TokenFrequenci...
    method Analyze (line 84) | func (n *NumericField) Analyze() {
    method Value (line 119) | func (n *NumericField) Value() []byte {
    method Number (line 123) | func (n *NumericField) Number() (float64, error) {
    method GoString (line 131) | func (n *NumericField) GoString() string {
    method NumPlainTextBytes (line 135) | func (n *NumericField) NumPlainTextBytes() uint64 {
  function NewNumericFieldFromBytes (line 139) | func NewNumericFieldFromBytes(name string, arrayPositions []uint64, valu...
  function NewNumericField (line 149) | func NewNumericField(name string, arrayPositions []uint64, number float6...
  function NewNumericFieldWithIndexingOptions (line 153) | func NewNumericFieldWithIndexingOptions(name string, arrayPositions []ui...

FILE: document/field_numeric_test.go
  function TestNumericField (line 21) | func TestNumericField(t *testing.T) {

FILE: document/field_synonym.go
  function init (line 27) | func init() {
  constant DefaultSynonymIndexingOptions (line 32) | DefaultSynonymIndexingOptions = index.IndexField
  type SynonymField (line 34) | type SynonymField struct
    method Size (line 46) | func (s *SynonymField) Size() int {
    method Name (line 51) | func (s *SynonymField) Name() string {
    method ArrayPositions (line 55) | func (s *SynonymField) ArrayPositions() []uint64 {
    method Options (line 59) | func (s *SynonymField) Options() index.FieldIndexingOptions {
    method NumPlainTextBytes (line 63) | func (s *SynonymField) NumPlainTextBytes() uint64 {
    method AnalyzedLength (line 67) | func (s *SynonymField) AnalyzedLength() int {
    method EncodedFieldType (line 71) | func (s *SynonymField) EncodedFieldType() byte {
    method AnalyzedTokenFrequencies (line 75) | func (s *SynonymField) AnalyzedTokenFrequencies() index.TokenFrequenci...
    method Analyze (line 79) | func (s *SynonymField) Analyze() {
    method Value (line 100) | func (s *SynonymField) Value() []byte {
    method IterateSynonyms (line 104) | func (s *SynonymField) IterateSynonyms(visitor func(term string, synon...
  function NewSynonymField (line 110) | func NewSynonymField(name string, analyzer analysis.Analyzer, input []st...
  function processSynonymData (line 120) | func processSynonymData(input []string, synonyms []string) map[string][]...
  function analyzeSynonymTerm (line 143) | func analyzeSynonymTerm(term string, analyzer analysis.Analyzer) string {

FILE: document/field_text.go
  function init (line 28) | func init() {
  constant DefaultTextIndexingOptions (line 33) | DefaultTextIndexingOptions = index.IndexField | index.DocValues
  type TextField (line 35) | type TextField struct
    method Size (line 46) | func (t *TextField) Size() int {
    method Name (line 58) | func (t *TextField) Name() string {
    method ArrayPositions (line 62) | func (t *TextField) ArrayPositions() []uint64 {
    method Options (line 66) | func (t *TextField) Options() index.FieldIndexingOptions {
    method EncodedFieldType (line 70) | func (t *TextField) EncodedFieldType() byte {
    method AnalyzedLength (line 74) | func (t *TextField) AnalyzedLength() int {
    method AnalyzedTokenFrequencies (line 78) | func (t *TextField) AnalyzedTokenFrequencies() index.TokenFrequencies {
    method Analyze (line 82) | func (t *TextField) Analyze() {
    method Analyzer (line 108) | func (t *TextField) Analyzer() analysis.Analyzer {
    method Value (line 112) | func (t *TextField) Value() []byte {
    method Text (line 116) | func (t *TextField) Text() string {
    method GoString (line 120) | func (t *TextField) GoString() string {
    method NumPlainTextBytes (line 124) | func (t *TextField) NumPlainTextBytes() uint64 {
  function NewTextField (line 128) | func NewTextField(name string, arrayPositions []uint64, value []byte) *T...
  function NewTextFieldWithIndexingOptions (line 132) | func NewTextFieldWithIndexingOptions(name string, arrayPositions []uint6...
  function NewTextFieldWithAnalyzer (line 142) | func NewTextFieldWithAnalyzer(name string, arrayPositions []uint64, valu...
  function NewTextFieldCustom (line 153) | func NewTextFieldCustom(name string, arrayPositions []uint64, value []by...

FILE: document/field_vector.go
  function init (line 30) | func init() {
  constant DefaultVectorIndexingOptions (line 35) | DefaultVectorIndexingOptions = index.IndexField
  type VectorField (line 37) | type VectorField struct
    method Size (line 47) | func (n *VectorField) Size() int {
    method Name (line 55) | func (n *VectorField) Name() string {
    method ArrayPositions (line 59) | func (n *VectorField) ArrayPositions() []uint64 {
    method Options (line 63) | func (n *VectorField) Options() index.FieldIndexingOptions {
    method NumPlainTextBytes (line 67) | func (n *VectorField) NumPlainTextBytes() uint64 {
    method AnalyzedLength (line 71) | func (n *VectorField) AnalyzedLength() int {
    method EncodedFieldType (line 76) | func (n *VectorField) EncodedFieldType() byte {
    method AnalyzedTokenFrequencies (line 80) | func (n *VectorField) AnalyzedTokenFrequencies() index.TokenFrequencies {
    method Analyze (line 85) | func (n *VectorField) Analyze() {
    method Value (line 89) | func (n *VectorField) Value() []byte {
    method GoString (line 93) | func (n *VectorField) GoString() string {
    method Vector (line 143) | func (n *VectorField) Vector() []float32 {
    method Dims (line 147) | func (n *VectorField) Dims() int {
    method Similarity (line 151) | func (n *VectorField) Similarity() string {
    method IndexOptimizedFor (line 155) | func (n *VectorField) IndexOptimizedFor() string {
  function NewVectorField (line 100) | func NewVectorField(name string, arrayPositions []uint64,
  function NewVectorFieldWithIndexingOptions (line 109) | func NewVectorFieldWithIndexingOptions(name string, arrayPositions []uin...
  function numBytesFloat32s (line 135) | func numBytesFloat32s(value []float32) uint64 {

FILE: document/field_vector_base64.go
  function init (line 34) | func init() {
  type VectorBase64Field (line 39) | type VectorBase64Field struct
    method Size (line 44) | func (n *VectorBase64Field) Size() int {
    method Name (line 54) | func (n *VectorBase64Field) Name() string {
    method ArrayPositions (line 58) | func (n *VectorBase64Field) ArrayPositions() []uint64 {
    method Options (line 62) | func (n *VectorBase64Field) Options() index.FieldIndexingOptions {
    method NumPlainTextBytes (line 66) | func (n *VectorBase64Field) NumPlainTextBytes() uint64 {
    method AnalyzedLength (line 70) | func (n *VectorBase64Field) AnalyzedLength() int {
    method EncodedFieldType (line 74) | func (n *VectorBase64Field) EncodedFieldType() byte {
    method AnalyzedTokenFrequencies (line 78) | func (n *VectorBase64Field) AnalyzedTokenFrequencies() index.TokenFreq...
    method Analyze (line 82) | func (n *VectorBase64Field) Analyze() {
    method Value (line 85) | func (n *VectorBase64Field) Value() []byte {
    method GoString (line 89) | func (n *VectorBase64Field) GoString() string {
    method Vector (line 149) | func (n *VectorBase64Field) Vector() []float32 {
    method Dims (line 153) | func (n *VectorBase64Field) Dims() int {
    method Similarity (line 157) | func (n *VectorBase64Field) Similarity() string {
    method IndexOptimizedFor (line 161) | func (n *VectorBase64Field) IndexOptimizedFor() string {
  function NewVectorBase64Field (line 96) | func NewVectorBase64Field(name string, arrayPositions []uint64, vectorBa...
  function DecodeVector (line 115) | func DecodeVector(encodedValue string) ([]float32, error) {

FILE: document/field_vector_base64_test.go
  function TestDecodeVector (line 29) | func TestDecodeVector(t *testing.T) {
  function BenchmarkDecodeVector128 (line 53) | func BenchmarkDecodeVector128(b *testing.B) {
  function BenchmarkDecodeVector784 (line 69) | func BenchmarkDecodeVector784(b *testing.B) {
  function BenchmarkDecodeVector1536 (line 85) | func BenchmarkDecodeVector1536(b *testing.B) {
  function bytifyVec (line 101) | func bytifyVec(vec []float32) []byte {

FILE: error.go
  constant ErrorIndexPathExists (line 19) | ErrorIndexPathExists Error = iota
  constant ErrorIndexPathDoesNotExist (line 20) | ErrorIndexPathDoesNotExist
  constant ErrorIndexMetaMissing (line 21) | ErrorIndexMetaMissing
  constant ErrorIndexMetaCorrupt (line 22) | ErrorIndexMetaCorrupt
  constant ErrorIndexClosed (line 23) | ErrorIndexClosed
  constant ErrorAliasMulti (line 24) | ErrorAliasMulti
  constant ErrorAliasEmpty (line 25) | ErrorAliasEmpty
  constant ErrorUnknownIndexType (line 26) | ErrorUnknownIndexType
  constant ErrorEmptyID (line 27) | ErrorEmptyID
  constant ErrorIndexReadInconsistency (line 28) | ErrorIndexReadInconsistency
  constant ErrorTwoPhaseSearchInconsistency (line 29) | ErrorTwoPhaseSearchInconsistency
  constant ErrorSynonymSearchNotSupported (line 30) | ErrorSynonymSearchNotSupported
  type Error (line 35) | type Error
    method Error (line 37) | func (e Error) Error() string {

FILE: examples_test.go
  function TestMain (line 32) | func TestMain(m *testing.M) {
  function ExampleNew (line 51) | func ExampleNew() {
  function ExampleIndex_indexing (line 67) | func ExampleIndex_indexing() {
  function ExampleNewMatchQuery (line 102) | func ExampleNewMatchQuery() {
  function ExampleNewMatchAllQuery (line 116) | func ExampleNewMatchAllQuery() {
  function ExampleNewMatchNoneQuery (line 130) | func ExampleNewMatchNoneQuery() {
  function ExampleNewMatchPhraseQuery (line 144) | func ExampleNewMatchPhraseQuery() {
  function ExampleNewNumericRangeQuery (line 158) | func ExampleNewNumericRangeQuery() {
  function ExampleNewNumericRangeInclusiveQuery (line 185) | func ExampleNewNumericRangeInclusiveQuery() {
  function ExampleNewPhraseQuery (line 203) | func ExampleNewPhraseQuery() {
  function ExampleNewPrefixQuery (line 217) | func ExampleNewPrefixQuery() {
  function ExampleNewQueryStringQuery (line 231) | func ExampleNewQueryStringQuery() {
  function ExampleNewTermQuery (line 244) | func ExampleNewTermQuery() {
  function ExampleNewFacetRequest (line 257) | func ExampleNewFacetRequest() {
  function ExampleFacetRequest_AddDateTimeRange (line 279) | func ExampleFacetRequest_AddDateTimeRange() {
  function ExampleFacetRequest_AddNumericRange (line 296) | func ExampleFacetRequest_AddNumericRange() {
  function ExampleNewHighlight (line 315) | func ExampleNewHighlight() {
  function ExampleNewHighlightWithStyle (line 329) | func ExampleNewHighlightWithStyle() {
  function ExampleSearchRequest_AddFacet (line 343) | func ExampleSearchRequest_AddFacet() {
  function ExampleNewSearchRequest (line 365) | func ExampleNewSearchRequest() {
  function ExampleNewBooleanQuery (line 379) | func ExampleNewBooleanQuery() {
  function ExampleNewConjunctionQuery (line 396) | func ExampleNewConjunctionQuery() {
  function ExampleNewDisjunctionQuery (line 411) | func ExampleNewDisjunctionQuery() {
  function ExampleSearchRequest_SortBy (line 426) | func ExampleSearchRequest_SortBy() {
  function ExampleSearchRequest_SortByCustom (line 443) | func ExampleSearchRequest_SortByCustom() {

FILE: fusion/fusion.go
  type FusionResult (line 22) | type FusionResult struct

FILE: fusion/rrf.go
  function formatRRFMessage (line 26) | func formatRRFMessage(weight float64, rank int, rankConstant int) string {
  function ReciprocalRankFusion (line 34) | func ReciprocalRankFusion(hits search.DocumentMatchCollection, weights [...

FILE: fusion/rrf_test.go
  constant epsilon (line 25) | epsilon float64 = 1e-3
  function nearlyEqual (line 27) | func nearlyEqual(a float64, b float64, epsilon float64) bool {
  function compareFusionResults (line 31) | func compareFusionResults(a, b FusionResult) bool {
  function TestReciprocalRankFusion (line 47) | func TestReciprocalRankFusion(t *testing.T) {

FILE: fusion/rsf.go
  function formatRSFMessage (line 25) | func formatRSFMessage(weight float64, normalizedScore float64, minScore ...
  function RelativeScoreFusion (line 35) | func RelativeScoreFusion(hits search.DocumentMatchCollection, weights []...

FILE: fusion/rsf_test.go
  function TestRelativeScoreFusion (line 23) | func TestRelativeScoreFusion(t *testing.T) {

FILE: fusion/util.go
  function sortDocMatchesByScore (line 27) | func sortDocMatchesByScore(hits search.DocumentMatchCollection) {
  function scoreBreakdownForQuery (line 44) | func scoreBreakdownForQuery(hit *search.DocumentMatch, idx int) (float64...
  function sortDocMatchesByBreakdown (line 56) | func sortDocMatchesByBreakdown(hits search.DocumentMatchCollection, quer...
  function getFusionExplAt (line 95) | func getFusionExplAt(hit *search.DocumentMatch, i int, value float64, me...
  function finalizeFusionExpl (line 106) | func finalizeFusionExpl(hit *search.DocumentMatch, explChildren []*searc...

FILE: geo/benchmark_geohash_test.go
  function BenchmarkGeoHashLen5NewDecode (line 21) | func BenchmarkGeoHashLen5NewDecode(b *testing.B) {
  function BenchmarkGeoHashLen6NewDecode (line 29) | func BenchmarkGeoHashLen6NewDecode(b *testing.B) {
  function BenchmarkGeoHashLen7NewDecode (line 37) | func BenchmarkGeoHashLen7NewDecode(b *testing.B) {

FILE: geo/geo.go
  type Point (line 43) | type Point struct
  function MortonHash (line 50) | func MortonHash(lon, lat float64) uint64 {
  function scaleLon (line 54) | func scaleLon(lon float64) uint64 {
  function scaleLat (line 59) | func scaleLat(lat float64) uint64 {
  function MortonUnhashLon (line 65) | func MortonUnhashLon(hash uint64) float64 {
  function MortonUnhashLat (line 70) | func MortonUnhashLat(hash uint64) float64 {
  function unscaleLon (line 74) | func unscaleLon(lon uint64) float64 {
  function unscaleLat (line 78) | func unscaleLat(lat uint64) float64 {
  function compareGeo (line 84) | func compareGeo(a, b float64) float64 {
  function RectIntersects (line 93) | func RectIntersects(aMinX, aMinY, aMaxX, aMaxY, bMinX, bMinY, bMaxX, bMa...
  function RectWithin (line 98) | func RectWithin(aMinX, aMinY, aMaxX, aMaxY, bMinX, bMinY, bMaxX, bMaxY f...
  function BoundingBoxContains (line 104) | func BoundingBoxContains(lon, lat, minLon, minLat, maxLon, maxLat float6...
  constant degreesToRadian (line 109) | degreesToRadian = math.Pi / 180
  constant radiansToDegrees (line 110) | radiansToDegrees = 180 / math.Pi
  function DegreesToRadians (line 113) | func DegreesToRadians(d float64) float64 {
  function RadiansToDegrees (line 118) | func RadiansToDegrees(r float64) float64 {
  function RectFromPointDistance (line 124) | func RectFromPointDistance(lon, lat, dist float64) (float64, float64, fl...
  function checkLatitude (line 166) | func checkLatitude(latitude float64) error {
  function checkLongitude (line 173) | func checkLongitude(longitude float64) error {
  function BoundingRectangleForPolygon (line 180) | func BoundingRectangleForPolygon(polygon []Point) (

FILE: geo/geo_dist.go
  type distanceUnit (line 24) | type distanceUnit struct
  function ParseDistance (line 51) | func ParseDistance(d string) (float64, error) {
  function ParseDistanceUnit (line 74) | func ParseDistanceUnit(u string) (float64, error) {
  function Haversin (line 88) | func Haversin(lon1, lat1, lon2, lat2 float64) float64 {

FILE: geo/geo_dist_test.go
  function TestParseDistance (line 25) | func TestParseDistance(t *testing.T) {
  function TestParseDistanceUnit (line 50) | func TestParseDistanceUnit(t *testing.T) {
  function TestHaversinDistance (line 74) | func TestHaversinDistance(t *testing.T) {

FILE: geo/geo_s2plugin_impl.go
  constant PointType (line 28) | PointType              = "point"
  constant MultiPointType (line 29) | MultiPointType         = "multipoint"
  constant LineStringType (line 30) | LineStringType         = "linestring"
  constant MultiLineStringType (line 31) | MultiLineStringType    = "multilinestring"
  constant PolygonType (line 32) | PolygonType            = "polygon"
  constant MultiPolygonType (line 33) | MultiPolygonType       = "multipolygon"
  constant GeometryCollectionType (line 34) | GeometryCollectionType = "geometrycollection"
  constant CircleType (line 35) | CircleType             = "circle"
  constant EnvelopeType (line 36) | EnvelopeType           = "envelope"
  function init (line 45) | func init() {
  function registerS2RegionTermIndexer (line 49) | func registerS2RegionTermIndexer() {
  function RegisterSpatialAnalyzerPlugin (line 60) | func RegisterSpatialAnalyzerPlugin(plugin index.SpatialAnalyzerPlugin) {
  function GetSpatialAnalyzerPlugin (line 67) | func GetSpatialAnalyzerPlugin(typ string) index.SpatialAnalyzerPlugin {
  function initS2IndexerOptions (line 76) | func initS2IndexerOptions() s2.Options {
  function initS2SearcherOptions (line 99) | func initS2SearcherOptions() s2.Options {
  function initS2OptionsForGeoPoints (line 122) | func initS2OptionsForGeoPoints() s2.Options {
  type S2SpatialAnalyzerPlugin (line 148) | type S2SpatialAnalyzerPlugin struct
    method Type (line 154) | func (s *S2SpatialAnalyzerPlugin) Type() string {
    method GetIndexTokens (line 158) | func (s *S2SpatialAnalyzerPlugin) GetIndexTokens(queryShape index.GeoJ...
    method GetQueryTokens (line 176) | func (s *S2SpatialAnalyzerPlugin) GetQueryTokens(queryShape index.GeoJ...
  type s2Tokenizable (line 199) | type s2Tokenizable interface
  type s2TokenizableEx (line 212) | type s2TokenizableEx interface
  method Type (line 222) | func (p *Point) Type() string {
  method Value (line 226) | func (p *Point) Value() ([]byte, error) {
  method Intersects (line 230) | func (p *Point) Intersects(s index.GeoJSON) (bool, error) {
  method Contains (line 235) | func (p *Point) Contains(s index.GeoJSON) (bool, error) {
  method IndexTokens (line 240) | func (p *Point) IndexTokens(s *S2SpatialAnalyzerPlugin) []string {
  method QueryTokens (line 245) | func (p *Point) QueryTokens(s *S2SpatialAnalyzerPlugin) []string {
  type boundedRectangle (line 251) | type boundedRectangle struct
    method Type (line 264) | func (br *boundedRectangle) Type() string {
    method Value (line 269) | func (br *boundedRectangle) Value() ([]byte, error) {
    method Intersects (line 273) | func (p *boundedRectangle) Intersects(s index.GeoJSON) (bool, error) {
    method Contains (line 278) | func (p *boundedRectangle) Contains(s index.GeoJSON) (bool, error) {
    method IndexTokens (line 283) | func (br *boundedRectangle) IndexTokens(s *S2SpatialAnalyzerPlugin) []...
    method QueryTokens (line 287) | func (br *boundedRectangle) QueryTokens(s *S2SpatialAnalyzerPlugin) []...
  function NewBoundedRectangle (line 258) | func NewBoundedRectangle(minLat, minLon, maxLat,
  type boundedPolygon (line 298) | type boundedPolygon struct
    method Type (line 306) | func (bp *boundedPolygon) Type() string {
    method Value (line 311) | func (bp *boundedPolygon) Value() ([]byte, error) {
    method Intersects (line 315) | func (p *boundedPolygon) Intersects(s index.GeoJSON) (bool, error) {
    method Contains (line 320) | func (p *boundedPolygon) Contains(s index.GeoJSON) (bool, error) {
    method IndexTokens (line 325) | func (bp *boundedPolygon) IndexTokens(s *S2SpatialAnalyzerPlugin) []st...
    method QueryTokens (line 329) | func (bp *boundedPolygon) QueryTokens(s *S2SpatialAnalyzerPlugin) []st...
  function NewBoundedPolygon (line 302) | func NewBoundedPolygon(coordinates []Point) *boundedPolygon {
  type pointDistance (line 346) | type pointDistance struct
    method Type (line 352) | func (p *pointDistance) Type() string {
    method Value (line 357) | func (p *pointDistance) Value() ([]byte, error) {
    method Intersects (line 367) | func (p *pointDistance) Intersects(s index.GeoJSON) (bool, error) {
    method Contains (line 372) | func (p *pointDistance) Contains(s index.GeoJSON) (bool, error) {
    method IndexTokens (line 377) | func (pd *pointDistance) IndexTokens(s *S2SpatialAnalyzerPlugin) []str...
    method QueryTokens (line 381) | func (pd *pointDistance) QueryTokens(s *S2SpatialAnalyzerPlugin) []str...
  function NewPointDistance (line 361) | func NewPointDistance(centerLat, centerLon,
  function NewGeometryCollection (line 397) | func NewGeometryCollection(coordinates [][][][][]float64,
  function NewGeometryCollectionFromShapes (line 410) | func NewGeometryCollectionFromShapes(shapes []*geojson.GeoShape) (
  function NewGeoCircleShape (line 419) | func NewGeoCircleShape(cp []float64,
  function NewGeoJsonShape (line 424) | func NewGeoJsonShape(coordinates [][][][]float64, typ string) (
  function NewGeoJsonPoint (line 429) | func NewGeoJsonPoint(points []float64) index.GeoJSON {
  function NewGeoJsonMultiPoint (line 433) | func NewGeoJsonMultiPoint(points [][]float64) index.GeoJSON {
  function NewGeoJsonLinestring (line 437) | func NewGeoJsonLinestring(points [][]float64) index.GeoJSON {
  function NewGeoJsonMultilinestring (line 441) | func NewGeoJsonMultilinestring(points [][][]float64) index.GeoJSON {
  function NewGeoJsonPolygon (line 445) | func NewGeoJsonPolygon(points [][][]float64) index.GeoJSON {
  function NewGeoJsonMultiPolygon (line 449) | func NewGeoJsonMultiPolygon(points [][][][]float64) index.GeoJSON {
  function NewGeoCircle (line 453) | func NewGeoCircle(points []float64, radius string) index.GeoJSON {
  function NewGeoEnvelope (line 457) | func NewGeoEnvelope(points [][]float64) index.GeoJSON {
  function ParseGeoJSONShape (line 461) | func ParseGeoJSONShape(input json.RawMessage) (index.GeoJSON, error) {

FILE: geo/geo_test.go
  function TestMortonHashMortonUnhash (line 22) | func TestMortonHashMortonUnhash(t *testing.T) {
  function TestScaleLonUnscaleLon (line 48) | func TestScaleLonUnscaleLon(t *testing.T) {
  function TestScaleLatUnscaleLat (line 67) | func TestScaleLatUnscaleLat(t *testing.T) {
  function TestRectFromPointDistance (line 86) | func TestRectFromPointDistance(t *testing.T) {
  function TestRectIntersects (line 100) | func TestRectIntersects(t *testing.T) {
  function TestRectWithin (line 128) | func TestRectWithin(t *testing.T) {
  function TestBoundingBoxContains (line 160) | func TestBoundingBoxContains(t *testing.T) {

FILE: geo/geohash.go
  type encoding (line 20) | type encoding struct
  function newEncoding (line 27) | func newEncoding(encoder string) *encoding {
  function DecodeGeoHash (line 46) | func DecodeGeoHash(geoHash string) (float64, float64) {
  function EncodeGeoHash (line 74) | func EncodeGeoHash(lat, lon float64) string {

FILE: geo/geohash_test.go
  function TestDecodeGeoHash (line 22) | func TestDecodeGeoHash(t *testing.T) {
  function TestEncodeGeoHash (line 47) | func TestEncodeGeoHash(t *testing.T) {

FILE: geo/parse.go
  function ExtractGeoPoint (line 50) | func ExtractGeoPoint(thing interface{}) (lon, lat float64, success bool) {
  type loner (line 164) | type loner interface
  type later (line 168) | type later interface
  type lnger (line 172) | type lnger interface
  function extractCoordinates (line 182) | func extractCoordinates(thing interface{}) []float64 {
  function extract2DCoordinates (line 214) | func extract2DCoordinates(thing interface{}) [][]float64 {
  function extract3DCoordinates (line 238) | func extract3DCoordinates(thing interface{}) (c [][][]float64) {
  function extract4DCoordinates (line 260) | func extract4DCoordinates(thing interface{}) (rv [][][][]float64) {
  function ParseGeoShapeField (line 276) | func ParseGeoShapeField(thing interface{}) (interface{}, string, error) {
  function extractGeoShape (line 302) | func extractGeoShape(thing interface{}) (*geojson.GeoShape, bool) {
  function ExtractGeometryCollection (line 318) | func ExtractGeometryCollection(thing interface{}) ([]*geojson.GeoShape, ...
  function ExtractCircle (line 355) | func ExtractCircle(thing interface{}) (*geojson.GeoShape, bool) {
  function ExtractGeoShapeCoordinates (line 391) | func ExtractGeoShapeCoordinates(coordValue interface{},

FILE: geo/parse_test.go
  function TestExtractGeoPoint (line 23) | func TestExtractGeoPoint(t *testing.T) {
  type s11 (line 180) | type s11 struct
    method Lon (line 185) | func (s *s11) Lon() float64 {
    method Lat (line 189) | func (s *s11) Lat() float64 {
  type s12 (line 193) | type s12 struct
    method Lng (line 198) | func (s *s12) Lng() float64 {
    method Lat (line 202) | func (s *s12) Lat() float64 {
  function TestExtractGeoShape (line 206) | func TestExtractGeoShape(t *testing.T) {
  function TestExtractGeoShapeCoordinates (line 380) | func TestExtractGeoShapeCoordinates(t *testing.T) {

FILE: geo/sloppy.go
  constant radiusTabsSize (line 24) | radiusTabsSize = (1 << 10) + 1
  constant radiusDelta (line 25) | radiusDelta    = (math.Pi / 2) / (radiusTabsSize - 1)
  constant radiusIndexer (line 26) | radiusIndexer  = 1 / radiusDelta
  function init (line 29) | func init() {
  function earthDiameter (line 53) | func earthDiameter(lat float64) float64 {

FILE: geo/versus_test.go
  function TestDecodeGeoHashVersus (line 31) | func TestDecodeGeoHashVersus(t *testing.T) {
  function compareLatitude (line 4146) | func compareLatitude(box []float64, v float64) bool {
  function compareLogitude (line 4152) | func compareLogitude(box []float64, v float64) bool {

FILE: index.go
  type Batch (line 35) | type Batch struct
    method Index (line 46) | func (b *Batch) Index(id string, data interface{}) error {
    method IndexSynonym (line 67) | func (b *Batch) IndexSynonym(id string, collection string, definition ...
    method LastDocSize (line 97) | func (b *Batch) LastDocSize() uint64 {
    method TotalDocsSize (line 101) | func (b *Batch) TotalDocsSize() uint64 {
    method IndexAdvanced (line 108) | func (b *Batch) IndexAdvanced(doc *document.Document) (err error) {
    method Delete (line 119) | func (b *Batch) Delete(id string) {
    method SetInternal (line 128) | func (b *Batch) SetInternal(key, val []byte) {
    method DeleteInternal (line 135) | func (b *Batch) DeleteInternal(key []byte) {
    method Size (line 141) | func (b *Batch) Size() int {
    method String (line 147) | func (b *Batch) String() string {
    method Reset (line 153) | func (b *Batch) Reset() {
    method Merge (line 159) | func (b *Batch) Merge(o *Batch) {
    method SetPersistedCallback (line 169) | func (b *Batch) SetPersistedCallback(f index.BatchCallback) {
    method PersistedCallback (line 173) | func (b *Batch) PersistedCallback() index.BatchCallback {
  type Index (line 242) | type Index interface
  function New (line 291) | func New(path string, mapping mapping.IndexMapping) (Index, error) {
  function NewMemOnly (line 300) | func NewMemOnly(mapping mapping.IndexMapping) (Index, error) {
  function NewUsing (line 314) | func NewUsing(path string, mapping mapping.IndexMapping, indexType strin...
  function Open (line 320) | func Open(path string) (Index, error) {
  function OpenUsing (line 330) | func OpenUsing(path string, runtimeConfig map[string]interface{}) (Index...
  type Builder (line 337) | type Builder interface
  function NewBuilder (line 344) | func NewBuilder(path string, mapping mapping.IndexMapping, config map[st...
  type IndexCopyable (line 350) | type IndexCopyable interface
  type FileSystemDirectory (line 358) | type FileSystemDirectory
  type SynonymDefinition (line 363) | type SynonymDefinition struct
    method Validate (line 377) | func (sd *SynonymDefinition) Validate() error {
  type SynonymIndex (line 386) | type SynonymIndex interface
  type InsightsIndex (line 392) | type InsightsIndex interface

FILE: index/scorch/builder.go
  constant DefaultBuilderBatchSize (line 28) | DefaultBuilderBatchSize = 1000
  constant DefaultBuilderMergeMax (line 29) | DefaultBuilderMergeMax = 10
  type Builder (line 31) | type Builder struct
    method parseConfig (line 73) | func (o *Builder) parseConfig(config map[string]interface{}) (err erro...
    method Index (line 118) | func (o *Builder) Index(doc index.Document) error {
    method maybeFlushBatchLOCKED (line 127) | func (o *Builder) maybeFlushBatchLOCKED(moreThan int) error {
    method executeBatchLOCKED (line 135) | func (o *Builder) executeBatchLOCKED(batch *index.Batch) (err error) {
    method doMerge (line 169) | func (o *Builder) doMerge() error {
    method Close (line 238) | func (o *Builder) Close() error {
  function NewBuilder (line 44) | func NewBuilder(config map[string]interface{}) (*Builder, error) {

FILE: index/scorch/builder_test.go
  function TestBuilder (line 27) | func TestBuilder(t *testing.T) {
  function checkIndex (line 65) | func checkIndex(t *testing.T, path string, term []byte, field string, ex...
  function TestBuilderFlushFinalBatch (line 123) | func TestBuilderFlushFinalBatch(t *testing.T) {

FILE: index/scorch/empty.go
  type emptyPostingsIterator (line 19) | type emptyPostingsIterator struct
    method Next (line 21) | func (e *emptyPostingsIterator) Next() (segment.Posting, error) {
    method Advance (line 25) | func (e *emptyPostingsIterator) Advance(uint64) (segment.Posting, erro...
    method Size (line 29) | func (e *emptyPostingsIterator) Size() int {
    method BytesRead (line 33) | func (e *emptyPostingsIterator) BytesRead() uint64 {
    method ResetBytesRead (line 37) | func (e *emptyPostingsIterator) ResetBytesRead(uint64) {}
    method BytesWritten (line 39) | func (e *emptyPostingsIterator) BytesWritten() uint64 { return 0 }

FILE: index/scorch/event.go
  type Event (line 29) | type Event struct
  type EventKind (line 36) | type EventKind
  constant EventKindCloseStart (line 40) | EventKindCloseStart EventKind = iota
  constant EventKindClose (line 43) | EventKindClose
  constant EventKindMergerProgress (line 47) | EventKindMergerProgress
  constant EventKindPersisterProgress (line 51) | EventKindPersisterProgress
  constant EventKindBatchIntroductionStart (line 55) | EventKindBatchIntroductionStart
  constant EventKindBatchIntroduction (line 58) | EventKindBatchIntroduction
  constant EventKindMergeTaskIntroductionStart (line 62) | EventKindMergeTaskIntroductionStart
  constant EventKindMergeTaskIntroduction (line 66) | EventKindMergeTaskIntroduction
  constant EventKindPreMergeCheck (line 70) | EventKindPreMergeCheck
  constant EventKindIndexStart (line 74) | EventKindIndexStart
  constant EventKindPurgerCheck (line 78) | EventKindPurgerCheck

FILE: index/scorch/event_test.go
  function TestEventBatchIntroductionStart (line 24) | func TestEventBatchIntroductionStart(t *testing.T) {

FILE: index/scorch/field_dict_test.go
  function TestIndexFieldDict (line 25) | func TestIndexFieldDict(t *testing.T) {

FILE: index/scorch/int.go
  constant intMin (line 27) | intMin      = 0x80
  constant intMaxWidth (line 28) | intMaxWidth = 8
  constant intZero (line 29) | intZero     = intMin + intMaxWidth
  constant intSmall (line 30) | intSmall    = intMax - intZero - intMaxWidth
  constant intMax (line 32) | intMax = 0xfd
  function encodeUvarintAscending (line 40) | func encodeUvarintAscending(b []byte, v uint64) []byte {
  function decodeUvarintAscending (line 70) | func decodeUvarintAscending(b []byte) ([]byte, uint64, error) {

FILE: index/scorch/int_test.go
  type testCaseUint64 (line 28) | type testCaseUint64 struct
  function TestEncodeDecodeUvarint (line 33) | func TestEncodeDecodeUvarint(t *testing.T) {
  function testBasicEncodeDecodeUint64 (line 46) | func testBasicEncodeDecodeUint64(
  function testCustomEncodeUint64 (line 87) | func testCustomEncodeUint64(

FILE: index/scorch/introducer.go
  constant introducer (line 27) | introducer = "introducer"
  type segmentIntroduction (line 29) | type segmentIntroduction struct
  type persistIntroduction (line 42) | type persistIntroduction struct
  type epochWatcher (line 47) | type epochWatcher struct
  method introducerLoop (line 52) | func (s *Scorch) introducerLoop() {
  method introduceSegment (line 109) | func (s *Scorch) introduceSegment(next *segmentIntroduction) error {
  method introducePersist (line 264) | func (s *Scorch) introducePersist(persist *persistIntroduction) {
  method introduceMerge (line 345) | func (s *Scorch) introduceMerge(nextMerge *segmentMerge) {
  function isMemorySegment (line 516) | func isMemorySegment(s *SegmentSnapshot) bool {

FILE: index/scorch/merge.go
  constant merger (line 32) | merger = "merger"
  method mergerLoop (line 34) | func (s *Scorch) mergerLoop() {
  type mergerCtrl (line 173) | type mergerCtrl struct
  method ForceMerge (line 181) | func (s *Scorch) ForceMerge(ctx context.Context,
  method parseMergePlannerOptions (line 225) | func (s *Scorch) parseMergePlannerOptions() (*mergeplan.MergePlanOptions,
  type closeChWrapper (line 258) | type closeChWrapper struct
    method close (line 275) | func (w *closeChWrapper) close() {
    method listen (line 279) | func (w *closeChWrapper) listen() {
  function newCloseChWrapper (line 265) | func newCloseChWrapper(ch1 chan struct{},
  method planMergeAtSnapshot (line 289) | func (s *Scorch) planMergeAtSnapshot(ctx context.Context,
  type mergeTaskIntroStatus (line 467) | type mergeTaskIntroStatus struct
  type mergedSegmentHistory (line 475) | type mergedSegmentHistory struct
  type segmentMerge (line 481) | type segmentMerge struct
  function cumulateBytesRead (line 490) | func cumulateBytesRead(sbs []segment.Segment) uint64 {
  function closeNewMergedSegments (line 498) | func closeNewMergedSegments(segs []segment.Segment) error {
  method mergeAndPersistInMemorySegments (line 510) | func (s *Scorch) mergeAndPersistInMemorySegments(snapshot *IndexSnapshot,
  method ReportBytesWritten (line 647) | func (s *Scorch) ReportBytesWritten(bytesWritten uint64) {

FILE: index/scorch/merge_test.go
  function TestObsoleteSegmentMergeIntroduction (line 26) | func TestObsoleteSegmentMergeIntroduction(t *testing.T) {

FILE: index/scorch/mergeplan/merge_plan.go
  type Segment (line 30) | type Segment interface
  function Plan (line 51) | func Plan(segments []Segment, o *MergePlanOptions) (*MergePlan, error) {
  type MergePlan (line 61) | type MergePlan struct
  type MergeTask (line 67) | type MergeTask struct
  type MergePlanOptions (line 72) | type MergePlanOptions struct
    method RaiseToFloorSegmentSize (line 126) | func (o *MergePlanOptions) RaiseToFloorSegmentSize(s int64) int64 {
    method RaiseToFloorSegmentFileSize (line 133) | func (o *MergePlanOptions) RaiseToFloorSegmentFileSize(s int64) int64 {
  constant MaxSegmentSizeLimit (line 142) | MaxSegmentSizeLimit = 1<<31 - 1
  function plan (line 174) | func plan(segmentsIn []Segment, o *MergePlanOptions) (*MergePlan, error) {
  function CalcBudget (line 312) | func CalcBudget(totalSize int64, firstTierSize int64, o *MergePlanOption...
  function removeSegments (line 345) | func removeSegments(segments []Segment, toRemove []Segment) []Segment {
  function ScoreSegments (line 360) | func ScoreSegments(segments []Segment, o *MergePlanOptions) float64 {
  function ToBarChart (line 398) | func ToBarChart(prefix string, barMax int, segments []Segment, plan *Mer...
  function ValidateMergePlannerOptions (line 451) | func ValidateMergePlannerOptions(options *MergePlanOptions) error {

FILE: index/scorch/mergeplan/merge_plan_test.go
  type segment (line 29) | type segment struct
    method Id (line 38) | func (s *segment) Id() uint64      { return s.MyId }
    method FullSize (line 39) | func (s *segment) FullSize() int64 { return s.MyFullSize }
    method LiveSize (line 40) | func (s *segment) LiveSize() int64 { return s.MyLiveSize }
    method HasVector (line 41) | func (s *segment) HasVector() bool { return s.MyHasVector }
    method FileSize (line 42) | func (s *segment) FileSize() int64 { return s.MyFileSize }
  function makeLinearSegments (line 44) | func makeLinearSegments(n int) (rv []Segment) {
  function TestSimplePlan (line 57) | func TestSimplePlan(t *testing.T) {
  function TestSort (line 176) | func TestSort(t *testing.T) {
  function TestCalcBudget (line 190) | func TestCalcBudget(t *testing.T) {
  function TestCalcBudgetForSingleSegmentMergePolicy (line 268) | func TestCalcBudgetForSingleSegmentMergePolicy(t *testing.T) {
  function TestInsert1SameSizedSegmentBetweenMerges (line 309) | func TestInsert1SameSizedSegmentBetweenMerges(t *testing.T) {
  function TestInsertManySameSizedSegmentsBetweenMerges (line 335) | func TestInsertManySameSizedSegmentsBetweenMerges(t *testing.T) {
  function TestInsertManySameSizedSegmentsWithDeletionsBetweenMerges (line 363) | func TestInsertManySameSizedSegmentsWithDeletionsBetweenMerges(t *testin...
  function TestInsertManyDifferentSizedSegmentsBetweenMerges (line 401) | func TestInsertManyDifferentSizedSegmentsBetweenMerges(t *testing.T) {
  function TestManySameSizedSegmentsWithDeletesBetweenMerges (line 429) | func TestManySameSizedSegmentsWithDeletesBetweenMerges(t *testing.T) {
  function TestValidateMergePlannerOptions (line 478) | func TestValidateMergePlannerOptions(t *testing.T) {
  function TestPlanMaxSegmentSizeLimit (line 491) | func TestPlanMaxSegmentSizeLimit(t *testing.T) {
  type testCyclesSpec (line 534) | type testCyclesSpec struct
    method runCycles (line 549) | func (spec *testCyclesSpec) runCycles(t *testing.T) {
  function emit (line 610) | func emit(descrip string, cycle int, step int, segments []Segment, plan ...
  function TestPlanMaxSegmentFileSize (line 627) | func TestPlanMaxSegmentFileSize(t *testing.T) {
  function TestSingleTaskMergePlan (line 723) | func TestSingleTaskMergePlan(t *testing.T) {

FILE: index/scorch/mergeplan/sort.go
  type byLiveSizeDescending (line 17) | type byLiveSizeDescending
    method Len (line 19) | func (a byLiveSizeDescending) Len() int { return len(a) }
    method Swap (line 21) | func (a byLiveSizeDescending) Swap(i, j int) { a[i], a[j] = a[j], a[i] }
    method Less (line 23) | func (a byLiveSizeDescending) Less(i, j int) bool {

FILE: index/scorch/optimize.go
  method Optimize (line 30) | func (s *IndexSnapshotTermFieldReader) Optimize(kind string,
  method optimizeConjunction (line 51) | func (s *IndexSnapshotTermFieldReader) optimizeConjunction(
  type OptimizeTFRConjunction (line 71) | type OptimizeTFRConjunction struct
    method Finish (line 77) | func (o *OptimizeTFRConjunction) Finish() (index.Optimized, error) {
  method optimizeConjunctionUnadorned (line 125) | func (s *IndexSnapshotTermFieldReader) optimizeConjunctionUnadorned(
  type OptimizeTFRConjunctionUnadorned (line 145) | type OptimizeTFRConjunctionUnadorned struct
    method Finish (line 158) | func (o *OptimizeTFRConjunctionUnadorned) Finish() (rv index.Optimized...
  method optimizeDisjunctionUnadorned (line 271) | func (s *IndexSnapshotTermFieldReader) optimizeDisjunctionUnadorned(
  type OptimizeTFRDisjunctionUnadorned (line 293) | type OptimizeTFRDisjunctionUnadorned struct
    method Finish (line 306) | func (o *OptimizeTFRDisjunctionUnadorned) Finish() (rv index.Optimized...
  method unadornedTermFieldReader (line 382) | func (i *IndexSnapshot) unadornedTermFieldReader(

FILE: index/scorch/optimize_knn.go
  type OptimizeVR (line 31) | type OptimizeVR struct
    method invokeSearcherEndCallback (line 42) | func (o *OptimizeVR) invokeSearcherEndCallback() {
    method Finish (line 57) | func (o *OptimizeVR) Finish() error {
  method VectorOptimize (line 142) | func (s *IndexSnapshotVectorReader) VectorOptimize(ctx context.Context,

FILE: index/scorch/persister.go
  constant persister (line 41) | persister = "persister"
  type persisterOptions (line 67) | type persisterOptions struct
  type notificationChan (line 95) | type notificationChan
  method persisterLoop (line 97) | func (s *Scorch) persisterLoop() {
  function notifyMergeWatchers (line 264) | func notifyMergeWatchers(lastPersistedEpoch uint64,
  method pausePersisterForMergerCatchUp (line 278) | func (s *Scorch) pausePersisterForMergerCatchUp(lastPersistedEpoch uint64,
  method parsePersisterOptions (line 346) | func (s *Scorch) parsePersisterOptions() (*persisterOptions, error) {
  method persistSnapshot (line 368) | func (s *Scorch) persistSnapshot(snapshot *IndexSnapshot,
  type flushable (line 393) | type flushable struct
  function legacyFlushBehaviour (line 408) | func legacyFlushBehaviour(maxSizeInMemoryMergePerWorker, numPersisterWor...
  method persistSnapshotMaybeMerge (line 416) | func (s *Scorch) persistSnapshotMaybeMerge(snapshot *IndexSnapshot, po *...
  function copyToDirectory (line 568) | func copyToDirectory(srcPath string, d index.Directory) (int64, error) {
  function persistToDirectory (line 596) | func persistToDirectory(seg segment.UnpersistedSegment, d index.Directory,
  function prepareBoltSnapshot (line 619) | func prepareBoltSnapshot(snapshot *IndexSnapshot, tx *bolt.Tx, path string,
  method persistSnapshotDirect (line 769) | func (s *Scorch) persistSnapshotDirect(snapshot *IndexSnapshot, exclude ...
  function zapFileName (line 852) | func zapFileName(epoch uint64) string {
  method loadFromBolt (line 858) | func (s *Scorch) loadFromBolt() error {
  method LoadSnapshot (line 923) | func (s *Scorch) LoadSnapshot(epoch uint64) (rv *IndexSnapshot, err erro...
  method loadSnapshot (line 943) | func (s *Scorch) loadSnapshot(snapshot *bolt.Bucket) (*IndexSnapshot, er...
  method loadSegment (line 1013) | func (s *Scorch) loadSegment(segmentBucket *bolt.Bucket) (*SegmentSnapsh...
  method removeOldData (line 1071) | func (s *Scorch) removeOldData() {
  function getTimeSeriesSnapshots (line 1114) | func getTimeSeriesSnapshots(maxDataPoints int, interval time.Duration,
  function getProtectedSnapshots (line 1161) | func getProtectedSnapshots(rollbackSamplingInterval time.Duration,
  function newCheckPoints (line 1181) | func newCheckPoints(snapshots map[uint64]time.Time) []*snapshotMetaData {
  method removeOldBoltSnapshots (line 1205) | func (s *Scorch) removeOldBoltSnapshots() (numRemoved int, err error) {
  method maxSegmentIDOnDisk (line 1272) | func (s *Scorch) maxSegmentIDOnDisk() (uint64, error) {
  method removeOldZapFiles (line 1296) | func (s *Scorch) removeOldZapFiles() error {
  function getBoundaryCheckPoint (line 1333) | func getBoundaryCheckPoint(retentionFactor float64,
  type snapshotMetaData (line 1349) | type snapshotMetaData struct
  method rootBoltSnapshotMetaData (line 1354) | func (s *Scorch) rootBoltSnapshotMetaData() ([]*snapshotMetaData, error) {
  method RootBoltSnapshotEpochs (line 1425) | func (s *Scorch) RootBoltSnapshotEpochs() ([]uint64, error) {
  method loadZapFileNames (line 1446) | func (s *Scorch) loadZapFileNames() (map[string]struct{}, error) {

FILE: index/scorch/reader_test.go
  function TestIndexReader (line 27) | func TestIndexReader(t *testing.T) {
  function TestIndexDocIdReader (line 221) | func TestIndexDocIdReader(t *testing.T) {
  function TestIndexDocIdOnlyReader (line 344) | func TestIndexDocIdOnlyReader(t *testing.T) {
  function TestSegmentIndexAndLocalDocNumFromGlobal (line 590) | func TestSegmentIndexAndLocalDocNumFromGlobal(t *testing.T) {

FILE: index/scorch/regexp.go
  function parseRegexp (line 23) | func parseRegexp(pattern string) (a *regexp.Regexp, prefixBeg, prefixEnd...
  function literalPrefix (line 47) | func literalPrefix(s *syntax.Regexp) string {

FILE: index/scorch/regexp_test.go
  function TestLiteralPrefix (line 22) | func TestLiteralPrefix(t *testing.T) {

FILE: index/scorch/rollback.go
  type RollbackPoint (line 26) | type RollbackPoint struct
    method GetInternal (line 31) | func (r *RollbackPoint) GetInternal(key []byte) []byte {
  function RollbackPoints (line 38) | func RollbackPoints(path string) ([]*RollbackPoint, error) {
  function Rollback (line 127) | func Rollback(path string, to *RollbackPoint) error {

FILE: index/scorch/rollback_test.go
  function TestIndexRollback (line 29) | func TestIndexRollback(t *testing.T) {
  function TestGetProtectedSnapshots (line 255) | func TestGetProtectedSnapshots(t *testing.T) {
  function indexDummyData (line 358) | func indexDummyData(t *testing.T, scorchi *Scorch, i int) {
  type testFSDirector (line 374) | type testFSDirector
    method GetWriter (line 376) | func (f testFSDirector) GetWriter(filePath string) (io.WriteCloser,
  function TestLatestSnapshotProtected (line 390) | func TestLatestSnapshotProtected(t *testing.T) {
  function TestBackupRacingWithPurge (line 470) | func TestBackupRacingWithPurge(t *testing.T) {
  function TestSparseMutationCheckpointing (line 554) | func TestSparseMutationCheckpointing(t *testing.T) {

FILE: index/scorch/scorch.go
  constant Name (line 34) | Name = "scorch"
  constant Version (line 36) | Version uint8 = 2
  type Scorch (line 40) | type Scorch struct
    method NumEventsBlocking (line 230) | func (s *Scorch) NumEventsBlocking() uint64 {
    method fireEvent (line 236) | func (s *Scorch) fireEvent(kind EventKind, dur time.Duration) bool {
    method fireAsyncError (line 246) | func (s *Scorch) fireAsyncError(err error) {
    method Open (line 253) | func (s *Scorch) Open() error {
    method openBolt (line 274) | func (s *Scorch) openBolt() error {
    method Close (line 387) | func (s *Scorch) Close() (err error) {
    method Update (line 417) | func (s *Scorch) Update(doc index.Document) error {
    method Delete (line 423) | func (s *Scorch) Delete(id string) error {
    method Batch (line 430) | func (s *Scorch) Batch(batch *index.Batch) (err error) {
    method prepareSegment (line 537) | func (s *Scorch) prepareSegment(newSegment segment.Segment, ids []string,
    method SetInternal (line 596) | func (s *Scorch) SetInternal(key, val []byte) error {
    method DeleteInternal (line 602) | func (s *Scorch) DeleteInternal(key []byte) error {
    method Reader (line 610) | func (s *Scorch) Reader() (index.IndexReader, error) {
    method currentSnapshot (line 614) | func (s *Scorch) currentSnapshot() *IndexSnapshot {
    method Stats (line 624) | func (s *Scorch) Stats() json.Marshaler {
    method BytesReadQueryTime (line 628) | func (s *Scorch) BytesReadQueryTime() uint64 {
    method diskFileStats (line 632) | func (s *Scorch) diskFileStats(rootSegmentPaths map[string]struct{}) (...
    method StatsMap (line 663) | func (s *Scorch) StatsMap() map[string]interface{} {
    method Analyze (line 749) | func (s *Scorch) Analyze(d index.Document) {
    method setSpatialAnalyzerPlugin (line 755) | func (s *Scorch) setSpatialAnalyzerPlugin(f index.Field) {
    method AddEligibleForRemoval (line 812) | func (s *Scorch) AddEligibleForRemoval(epoch uint64) {
    method MemoryUsed (line 820) | func (s *Scorch) MemoryUsed() (memUsed uint64) {
    method markIneligibleForRemoval (line 860) | func (s *Scorch) markIneligibleForRemoval(filename string) {
    method unmarkIneligibleForRemoval (line 866) | func (s *Scorch) unmarkIneligibleForRemoval(filename string) {
    method CopyReader (line 954) | func (s *Scorch) CopyReader() index.CopyReader {
    method FireIndexEvent (line 983) | func (s *Scorch) FireIndexEvent() {
    method UpdateFields (line 990) | func (s *Scorch) UpdateFields(fieldInfo map[string]*index.UpdateFieldI...
    method OpenMeta (line 1000) | func (s *Scorch) OpenMeta() error {
    method updateBolt (line 1012) | func (s *Scorch) updateBolt(fieldInfo map[string]*index.UpdateFieldInf...
  type ScorchErrorType (line 92) | type ScorchErrorType
    method Error (line 94) | func (t ScorchErrorType) Error() string {
  constant ErrAsyncPanic (line 100) | ErrAsyncPanic   = ScorchErrorType("async panic error")
  constant ErrPersist (line 101) | ErrPersist      = ScorchErrorType("persist error")
  constant ErrCleanup (line 102) | ErrCleanup      = ScorchErrorType("cleanup error")
  constant ErrOptionsParse (line 103) | ErrOptionsParse = ScorchErrorType("options parse error")
  type ScorchError (line 108) | type ScorchError struct
    method Error (line 114) | func (e *ScorchError) Error() string {
    method Unwrap (line 121) | func (e *ScorchError) Unwrap() error {
  function NewScorchError (line 125) | func NewScorchError(source, errMsg string, errType ScorchErrorType) error {
  type internalStats (line 133) | type internalStats struct
  function NewScorch (line 144) | func NewScorch(storeName string,
  function configForceSegmentTypeVersion (line 215) | func configForceSegmentTypeVersion(config map[string]interface{}) (strin...
  type customAnalyzerPluginInitFunc (line 753) | type customAnalyzerPluginInitFunc
  function analyze (line 766) | func analyze(d index.Document, fn customAnalyzerPluginInitFunc) {
  function init (line 872) | func init() {
  function parseToTimeDuration (line 879) | func parseToTimeDuration(i interface{}) (time.Duration, error) {
  function parseToInteger (line 889) | func parseToInteger(i interface{}) (int, error) {
  type fieldStats (line 902) | type fieldStats struct
    method Store (line 908) | func (fs *fieldStats) Store(statName, fieldName string, value uint64) {
    method Aggregate (line 916) | func (fs *fieldStats) Aggregate(stats segment.FieldStats) {
    method Fetch (line 935) | func (fs *fieldStats) Fetch() map[string]map[string]uint64 {
  function newFieldStats (line 944) | func newFieldStats() *fieldStats {

FILE: index/scorch/scorch_test.go
  function init (line 43) | func init() {
  function InitTest (line 48) | func InitTest(cfg map[string]interface{}) error {
  function DestroyTest (line 52) | func DestroyTest(cfg map[string]interface{}) error {
  function CreateConfig (line 56) | func CreateConfig(name string) map[string]interface{} {
  function TestIndexOpenReopen (line 67) | func TestIndexOpenReopen(t *testing.T) {
  function TestIndexOpenReopenWithInsert (line 171) | func TestIndexOpenReopenWithInsert(t *testing.T) {
  function TestIndexInsert (line 281) | func TestIndexInsert(t *testing.T) {
  function TestIndexInsertThenDelete (line 352) | func TestIndexInsertThenDelete(t *testing.T) {
  function TestIndexInsertThenUpdate (line 568) | func TestIndexInsertThenUpdate(t *testing.T) {
  function TestIndexInsertMultiple (line 640) | func TestIndexInsertMultiple(t *testing.T) {
  function TestIndexInsertWithStore (line 712) | func TestIndexInsertWithStore(t *testing.T) {
  function TestIndexInternalCRUD (line 818) | func TestIndexInternalCRUD(t *testing.T) {
  function TestIndexBatch (line 929) | func TestIndexBatch(t *testing.T) {
  function TestIndexBatchWithCallbacks (line 1052) | func TestIndexBatchWithCallbacks(t *testing.T) {
  function TestIndexInsertUpdateDeleteWithMultipleTypesStored (line 1098) | func TestIndexInsertUpdateDeleteWithMultipleTypesStored(t *testing.T) {
  function TestIndexInsertFields (line 1326) | func TestIndexInsertFields(t *testing.T) {
  function TestIndexUpdateComposites (line 1399) | func TestIndexUpdateComposites(t *testing.T) {
  function TestIndexTermReaderCompositeFields (line 1482) | func TestIndexTermReaderCompositeFields(t *testing.T) {
  function TestIndexDocValueReader (line 1557) | func TestIndexDocValueReader(t *testing.T) {
  function TestDocValueReaderConcurrent (line 1632) | func TestDocValueReaderConcurrent(t *testing.T) {
  function TestConcurrentUpdate (line 1726) | func TestConcurrentUpdate(t *testing.T) {
  function TestLargeField (line 1795) | func TestLargeField(t *testing.T) {
  function TestIndexDocValueReaderWithMultipleDocs (line 1862) | func TestIndexDocValueReaderWithMultipleDocs(t *testing.T) {
  function TestIndexDocValueReaderWithMultipleFieldOptions (line 2042) | func TestIndexDocValueReaderWithMultipleFieldOptions(t *testing.T) {
  function TestAllFieldWithDifferentTermVectorsEnabled (line 2121) | func TestAllFieldWithDifferentTermVectorsEnabled(t *testing.T) {
  function TestForceVersion (line 2187) | func TestForceVersion(t *testing.T) {
  function TestIndexForceMerge (line 2216) | func TestIndexForceMerge(t *testing.T) {
  function TestCancelIndexForceMerge (line 2335) | func TestCancelIndexForceMerge(t *testing.T) {
  function TestIndexSeekBackwardsStats (line 2453) | func TestIndexSeekBackwardsStats(t *testing.T) {
  type fieldTerms (line 2538) | type fieldTerms
    method FieldsNotYetCached (line 2541) | func (f fieldTerms) FieldsNotYetCached(fields []string) []string {
    method Merge (line 2554) | func (f fieldTerms) Merge(other fieldTerms) {
  function TestOpenBoltTimeout (line 2560) | func TestOpenBoltTimeout(t *testing.T) {
  function TestReadOnlyIndex (line 2600) | func TestReadOnlyIndex(t *testing.T) {
  function BenchmarkAggregateFieldStats (line 2691) | func BenchmarkAggregateFieldStats(b *testing.B) {
  function TestPersistorMergerOptions (line 2711) | func TestPersistorMergerOptions(t *testing.T) {

FILE: index/scorch/segment_plugin.go
  type SegmentPlugin (line 36) | type SegmentPlugin interface
  function init (line 83) | func init() {
  function ResetSegmentPlugins (line 94) | func ResetSegmentPlugins() {
  function RegisterSegmentPlugin (line 98) | func RegisterSegmentPlugin(plugin SegmentPlugin, makeDefault bool) {
  function SupportedSegmentTypes (line 108) | func SupportedSegmentTypes() (rv []string) {
  function SupportedSegmentTypeVersions (line 115) | func SupportedSegmentTypeVersions(typ string) (rv []uint32) {
  function chooseSegmentPlugin (line 122) | func chooseSegmentPlugin(forcedSegmentType string,
  method loadSegmentPlugin (line 137) | func (s *Scorch) loadSegmentPlugin(forcedSegmentType string,
  method loadSpatialAnalyzerPlugin (line 148) | func (s *Scorch) loadSpatialAnalyzerPlugin(typ string) error {

FILE: index/scorch/snapshot_index.go
  type asynchSegmentResult (line 40) | type asynchSegmentResult struct
  function init (line 54) | func init() {
  type IndexSnapshot (line 68) | type IndexSnapshot struct
    method Segments (line 94) | func (i *IndexSnapshot) Segments() []*SegmentSnapshot {
    method Internal (line 98) | func (i *IndexSnapshot) Internal() map[string][]byte {
    method AddRef (line 102) | func (i *IndexSnapshot) AddRef() {
    method DecRef (line 108) | func (i *IndexSnapshot) DecRef() (err error) {
    method Close (line 128) | func (i *IndexSnapshot) Close() error {
    method Size (line 132) | func (i *IndexSnapshot) Size() int {
    method updateSize (line 136) | func (i *IndexSnapshot) updateSize() {
    method newIndexSnapshotFieldDict (line 143) | func (is *IndexSnapshot) newIndexSnapshotFieldDict(field string,
    method FieldCardinality (line 213) | func (is *IndexSnapshot) FieldCardinality(field string) (rv int, err e...
    method FieldDict (line 240) | func (is *IndexSnapshot) FieldDict(field string) (index.FieldDict, err...
    method FieldDictRange (line 267) | func (is *IndexSnapshot) FieldDictRange(field string, startTerm []byte,
    method FieldDictPrefix (line 297) | func (is *IndexSnapshot) FieldDictPrefix(field string,
    method FieldDictRegexp (line 306) | func (is *IndexSnapshot) FieldDictRegexp(field string,
    method FieldDictRegexpAutomaton (line 313) | func (is *IndexSnapshot) FieldDictRegexpAutomaton(field string,
    method fieldDictRegexp (line 319) | func (is *IndexSnapshot) fieldDictRegexp(field string,
    method getLevAutomaton (line 339) | func (is *IndexSnapshot) getLevAutomaton(term string,
    method FieldDictFuzzy (line 351) | func (is *IndexSnapshot) FieldDictFuzzy(field string,
    method FieldDictFuzzyAutomaton (line 358) | func (is *IndexSnapshot) FieldDictFuzzyAutomaton(field string,
    method fieldDictFuzzy (line 364) | func (is *IndexSnapshot) fieldDictFuzzy(field string,
    method FieldDictContains (line 389) | func (is *IndexSnapshot) FieldDictContains(field string) (index.FieldD...
    method DocIDReaderAll (line 393) | func (is *IndexSnapshot) DocIDReaderAll() (index.DocIDReader, error) {
    method DocIDReaderOnly (line 407) | func (is *IndexSnapshot) DocIDReaderOnly(ids []string) (index.DocIDRea...
    method newDocIDReader (line 426) | func (is *IndexSnapshot) newDocIDReader(results chan *asynchSegmentRes...
    method Fields (line 451) | func (is *IndexSnapshot) Fields() ([]string, error) {
    method GetInternal (line 468) | func (is *IndexSnapshot) GetInternal(key []byte) ([]byte, error) {
    method DocCount (line 472) | func (is *IndexSnapshot) DocCount() (uint64, error) {
    method Document (line 480) | func (is *IndexSnapshot) Document(id string) (rv index.Document, err e...
    method segmentIndexAndLocalDocNumFromGlobal (line 562) | func (is *IndexSnapshot) segmentIndexAndLocalDocNumFromGlobal(docNum u...
    method ExternalID (line 571) | func (is *IndexSnapshot) ExternalID(id index.IndexInternalID) (string,...
    method segmentIndexAndLocalDocNum (line 589) | func (is *IndexSnapshot) segmentIndexAndLocalDocNum(id index.IndexInte...
    method InternalID (line 598) | func (is *IndexSnapshot) InternalID(id string) (rv index.IndexInternal...
    method TermFieldReader (line 618) | func (is *IndexSnapshot) TermFieldReader(ctx context.Context, term []b...
    method allocTermFieldReaderDicts (line 707) | func (is *IndexSnapshot) allocTermFieldReaderDicts(field string) (tfr ...
    method getFieldTFRCacheThreshold (line 735) | func (is *IndexSnapshot) getFieldTFRCacheThreshold() int {
    method recycleTermFieldReader (line 751) | func (is *IndexSnapshot) recycleTermFieldReader(tfr *IndexSnapshotTerm...
    method documentVisitFieldTermsOnSegment (line 779) | func (is *IndexSnapshot) documentVisitFieldTermsOnSegment(
    method DocValueReader (line 858) | func (is *IndexSnapshot) DocValueReader(fields []string) (
    method DumpAll (line 909) | func (is *IndexSnapshot) DumpAll() chan interface{} {
    method DumpDoc (line 917) | func (is *IndexSnapshot) DumpDoc(id string) chan interface{} {
    method DumpFields (line 925) | func (is *IndexSnapshot) DumpFields() chan interface{} {
    method diskSegmentsPaths (line 933) | func (is *IndexSnapshot) diskSegmentsPaths() map[string]struct{} {
    method reClaimableDocsRatio (line 945) | func (is *IndexSnapshot) reClaimableDocsRatio() float64 {
    method CopyTo (line 979) | func (is *IndexSnapshot) CopyTo(d index.Directory) error {
    method UpdateIOStats (line 1022) | func (is *IndexSnapshot) UpdateIOStats(val uint64) {
    method GetSpatialAnalyzerPlugin (line 1026) | func (is *IndexSnapshot) GetSpatialAnalyzerPlugin(typ string) (
    method CloseCopyReader (line 1040) | func (is *IndexSnapshot) CloseCopyReader() error {
    method ThesaurusTermReader (line 1063) | func (is *IndexSnapshot) ThesaurusTermReader(ctx context.Context, thes...
    method newIndexSnapshotThesaurusKeys (line 1092) | func (is *IndexSnapshot) newIndexSnapshotThesaurusKeys(name string,
    method ThesaurusKeys (line 1146) | func (is *IndexSnapshot) ThesaurusKeys(name string) (index.ThesaurusKe...
    method ThesaurusKeysFuzzy (line 1152) | func (is *IndexSnapshot) ThesaurusKeysFuzzy(name string,
    method ThesaurusKeysPrefix (line 1169) | func (is *IndexSnapshot) ThesaurusKeysPrefix(name string,
    method ThesaurusKeysRegexp (line 1178) | func (is *IndexSnapshot) ThesaurusKeysRegexp(name string,
    method UpdateSynonymSearchCount (line 1190) | func (is *IndexSnapshot) UpdateSynonymSearchCount(delta uint64) {
    method UpdateFieldsInfo (line 1195) | func (is *IndexSnapshot) UpdateFieldsInfo(updatedFields map[string]*in...
    method MergeUpdateFieldsInfo (line 1207) | func (is *IndexSnapshot) MergeUpdateFieldsInfo(updatedFields map[strin...
    method TermFrequencies (line 1226) | func (is *IndexSnapshot) TermFrequencies(field string, limit int, desc...
    method Ancestors (line 1284) | func (i *IndexSnapshot) Ancestors(ID index.IndexInternalID, prealloc [...
  function calculateExclusiveEndFromInclusiveEnd (line 250) | func calculateExclusiveEndFromInclusiveEnd(inclusiveEnd []byte) []byte {
  function calculateExclusiveEndFromPrefix (line 280) | func calculateExclusiveEndFromPrefix(in []byte) []byte {
  type DocValueReader (line 864) | type DocValueReader struct
    method BytesRead (line 876) | func (dvr *DocValueReader) BytesRead() uint64 {
    method VisitDocValues (line 880) | func (dvr *DocValueReader) VisitDocValues(id index.IndexInternalID,
  function subtractStrings (line 961) | func subtractStrings(a, b []string) []string {

FILE: index/scorch/snapshot_index_dict.go
  type segmentDictCursor (line 24) | type segmentDictCursor struct
  type IndexSnapshotFieldDict (line 30) | type IndexSnapshotFieldDict struct
    method BytesRead (line 39) | func (i *IndexSnapshotFieldDict) BytesRead() uint64 {
    method Len (line 43) | func (i *IndexSnapshotFieldDict) Len() int { return len(i.cursors) }
    method Less (line 44) | func (i *IndexSnapshotFieldDict) Less(a, b int) bool {
    method Swap (line 47) | func (i *IndexSnapshotFieldDict) Swap(a, b int) {
    method Push (line 51) | func (i *IndexSnapshotFieldDict) Push(x interface{}) {
    method Pop (line 55) | func (i *IndexSnapshotFieldDict) Pop() interface{} {
    method Next (line 62) | func (i *IndexSnapshotFieldDict) Next() (*index.DictEntry, error) {
    method Cardinality (line 99) | func (i *IndexSnapshotFieldDict) Cardinality() int {
    method Close (line 103) | func (i *IndexSnapshotFieldDict) Close() error {
    method Contains (line 107) | func (i *IndexSnapshotFieldDict) Contains(key []byte) (bool, error) {

FILE: index/scorch/snapshot_index_doc.go
  function init (line 27) | func init() {
  type IndexSnapshotDocIDReader (line 32) | type IndexSnapshotDocIDReader struct
    method Size (line 38) | func (i *IndexSnapshotDocIDReader) Size() int {
    method Next (line 42) | func (i *IndexSnapshotDocIDReader) Next() (index.IndexInternalID, erro...
    method Advance (line 56) | func (i *IndexSnapshotDocIDReader) Advance(ID index.IndexInternalID) (...
    method Close (line 77) | func (i *IndexSnapshotDocIDReader) Close() error {

FILE: index/scorch/snapshot_index_str.go
  function init (line 26) | func init() {
  type IndexSnapshotThesaurusTermReader (line 31) | type IndexSnapshotThesaurusTermReader struct
    method Size (line 40) | func (i *IndexSnapshotThesaurusTermReader) Size() int {
    method Next (line 59) | func (i *IndexSnapshotThesaurusTermReader) Next() (string, error) {
    method Close (line 77) | func (i *IndexSnapshotThesaurusTermReader) Close() error {

FILE: index/scorch/snapshot_index_test.go
  function TestIndexSnapshot_getLevAutomaton (line 9) | func TestIndexSnapshot_getLevAutomaton(t *testing.T) {

FILE: index/scorch/snapshot_index_tfr.go
  function init (line 31) | func init() {
  type IndexSnapshotTermFieldReader (line 36) | type IndexSnapshotTermFieldReader struct
    method incrementBytesRead (line 59) | func (i *IndexSnapshotTermFieldReader) incrementBytesRead(val uint64) {
    method Size (line 63) | func (i *IndexSnapshotTermFieldReader) Size() int {
    method Next (line 84) | func (i *IndexSnapshotTermFieldReader) Next(preAlloced *index.TermFiel...
    method postingToTermFieldDoc (line 127) | func (i *IndexSnapshotTermFieldReader) postingToTermFieldDoc(next segm...
    method Advance (line 156) | func (i *IndexSnapshotTermFieldReader) Advance(ID index.IndexInternalI...
    method Count (line 217) | func (i *IndexSnapshotTermFieldReader) Count() uint64 {
    method Close (line 225) | func (i *IndexSnapshotTermFieldReader) Close() error {

FILE: index/scorch/snapshot_index_thes.go
  type segmentThesCursor (line 24) | type segmentThesCursor struct
  type IndexSnapshotThesaurusKeys (line 30) | type IndexSnapshotThesaurusKeys struct
    method Len (line 36) | func (i *IndexSnapshotThesaurusKeys) Len() int { return len(i.cursors) }
    method Less (line 37) | func (i *IndexSnapshotThesaurusKeys) Less(a, b int) bool {
    method Swap (line 40) | func (i *IndexSnapshotThesaurusKeys) Swap(a, b int) {
    method Push (line 44) | func (i *IndexSnapshotThesaurusKeys) Push(x interface{}) {
    method Pop (line 48) | func (i *IndexSnapshotThesaurusKeys) Pop() interface{} {
    method Next (line 55) | func (i *IndexSnapshotThesaurusKeys) Next() (*index.ThesaurusEntry, er...
    method Close (line 91) | func (i *IndexSnapshotThesaurusKeys) Close() error {
    method Contains (line 95) | func (i *IndexSnapshotThesaurusKeys) Contains(key []byte) (bool, error) {

FILE: index/scorch/snapshot_index_vr.go
  constant VectorSearchSupportedSegmentVersion (line 32) | VectorSearchSupportedSegmentVersion = 16
  function init (line 36) | func init() {
  type IndexSnapshotVectorReader (line 41) | type IndexSnapshotVectorReader struct
    method Size (line 57) | func (i *IndexSnapshotVectorReader) Size() int {
    method Next (line 78) | func (i *IndexSnapshotVectorReader) Next(preAlloced *index.VectorDoc) (
    method Advance (line 112) | func (i *IndexSnapshotVectorReader) Advance(ID index.IndexInternalID,
    method Count (line 158) | func (i *IndexSnapshotVectorReader) Count() uint64 {
    method Close (line 166) | func (i *IndexSnapshotVectorReader) Close() error {
  method CentroidCardinalities (line 171) | func (i *IndexSnapshot) CentroidCardinalities(field string, limit int, d...

FILE: index/scorch/snapshot_segment.go
  type SegmentSnapshot (line 29) | type SegmentSnapshot struct
    method Segment (line 47) | func (s *SegmentSnapshot) Segment() segment.Segment {
    method Deleted (line 51) | func (s *SegmentSnapshot) Deleted() *roaring.Bitmap {
    method Id (line 55) | func (s *SegmentSnapshot) Id() uint64 {
    method FullSize (line 59) | func (s *SegmentSnapshot) FullSize() int64 {
    method LiveSize (line 63) | func (s *SegmentSnapshot) LiveSize() int64 {
    method HasVector (line 67) | func (s *SegmentSnapshot) HasVector() bool {
    method FileSize (line 73) | func (s *SegmentSnapshot) FileSize() int64 {
    method Close (line 92) | func (s *SegmentSnapshot) Close() error {
    method VisitDocument (line 96) | func (s *SegmentSnapshot) VisitDocument(num uint64, visitor segment.St...
    method DocID (line 100) | func (s *SegmentSnapshot) DocID(num uint64) ([]byte, error) {
    method Count (line 104) | func (s *SegmentSnapshot) Count() uint64 {
    method CountRoot (line 115) | func (s *SegmentSnapshot) CountRoot() uint64 {
    method DocNumbers (line 125) | func (s *SegmentSnapshot) DocNumbers(docIDs []string) (*roaring.Bitmap...
    method DocNumbersLive (line 137) | func (s *SegmentSnapshot) DocNumbersLive() *roaring.Bitmap {
    method Fields (line 146) | func (s *SegmentSnapshot) Fields() []string {
    method Size (line 150) | func (s *SegmentSnapshot) Size() (rv int) {
    method UpdateFieldsInfo (line 160) | func (s *SegmentSnapshot) UpdateFieldsInfo(updatedFields map[string]*i...
    method Ancestors (line 374) | func (s *SegmentSnapshot) Ancestors(docNum uint64, prealloc []index.An...
  type cachedFieldDocs (line 181) | type cachedFieldDocs struct
    method Size (line 189) | func (cfd *cachedFieldDocs) Size() int {
    method prepareField (line 199) | func (cfd *cachedFieldDocs) prepareField(field string, ss *SegmentSnap...
  type cachedDocs (line 251) | type cachedDocs struct
    method prepareFields (line 257) | func (c *cachedDocs) prepareFields(wantedFields []string, ss *SegmentS...
    method hasFields (line 294) | func (c *cachedDocs) hasFields(fields []string) bool {
    method Size (line 306) | func (c *cachedDocs) Size() int {
    method updateSizeLOCKED (line 310) | func (c *cachedDocs) updateSizeLOCKED() {
    method visitDoc (line 321) | func (c *cachedDocs) visitDoc(localDocNum uint64,
  type cachedMeta (line 353) | type cachedMeta struct
    method updateMeta (line 358) | func (c *cachedMeta) updateMeta(field string, val interface{}) {
    method fetchMeta (line 367) | func (c *cachedMeta) fetchMeta(field string) (rv interface{}) {

FILE: index/scorch/snapshot_vector_index.go
  method VectorReader (line 30) | func (is *IndexSnapshot) VectorReader(ctx context.Context, vector []floa...
  type eligibleDocumentList (line 50) | type eligibleDocumentList struct
    method Iterator (line 55) | func (edl *eligibleDocumentList) Iterator() index.EligibleDocumentIter...
    method Count (line 67) | func (edl *eligibleDocumentList) Count() uint64 {
  type eligibleDocumentIterator (line 78) | type eligibleDocumentIterator struct
    method Next (line 84) | func (it *eligibleDocumentIterator) Next() (id uint64, ok bool) {
  type emptyEligibleDocumentIterator (line 97) | type emptyEligibleDocumentIterator struct
    method Next (line 100) | func (it *emptyEligibleDocumentIterator) Next() (id uint64, ok bool) {
  type eligibleDocumentSelector (line 106) | type eligibleDocumentSelector struct
    method SegmentEligibleDocuments (line 113) | func (eds *eligibleDocumentSelector) SegmentEligibleDocuments(segmentI...
    method AddEligibleDocumentMatch (line 128) | func (eds *eligibleDocumentSelector) AddEligibleDocumentMatch(id index...
  method NewEligibleDocumentSelector (line 147) | func (is *IndexSnapshot) NewEligibleDocumentSelector() index.EligibleDoc...

FILE: index/scorch/stats.go
  type Stats (line 28) | type Stats struct
    method ToMap (line 142) | func (s *Stats) ToMap() map[string]interface{} {
    method MarshalJSON (line 158) | func (s *Stats) MarshalJSON() ([]byte, error) {

FILE: index/scorch/unadorned.go
  function init (line 29) | func init() {
  type unadornedPostingsIteratorBitmap (line 38) | type unadornedPostingsIteratorBitmap struct
    method Next (line 44) | func (i *unadornedPostingsIteratorBitmap) Next() (segment.Posting, err...
    method Advance (line 48) | func (i *unadornedPostingsIteratorBitmap) Advance(docNum uint64) (segm...
    method nextAtOrAfter (line 52) | func (i *unadornedPostingsIteratorBitmap) nextAtOrAfter(atOrAfter uint...
    method nextDocNumAtOrAfter (line 63) | func (i *unadornedPostingsIteratorBitmap) nextDocNumAtOrAfter(atOrAfte...
    method Size (line 76) | func (i *unadornedPostingsIteratorBitmap) Size() int {
    method BytesRead (line 80) | func (i *unadornedPostingsIteratorBitmap) BytesRead() uint64 {
    method BytesWritten (line 84) | func (i *unadornedPostingsIteratorBitmap) BytesWritten() uint64 {
    method ResetBytesRead (line 88) | func (i *unadornedPostingsIteratorBitmap) ResetBytesRead(uint64) {}
    method ActualBitmap (line 90) | func (i *unadornedPostingsIteratorBitmap) ActualBitmap() *roaring.Bitm...
    method DocNum1Hit (line 94) | func (i *unadornedPostingsIteratorBitmap) DocNum1Hit() (uint64, bool) {
    method ReplaceActual (line 98) | func (i *unadornedPostingsIteratorBitmap) ReplaceActual(actual *roarin...
    method ResetIterator (line 105) | func (i *unadornedPostingsIteratorBitmap) ResetIterator() {
  function newUnadornedPostingsIteratorFromBitmap (line 109) | func newUnadornedPostingsIteratorFromBitmap(bm *roaring.Bitmap) segment....
  constant docNum1HitFinished (line 116) | docNum1HitFinished = math.MaxUint64
  type unadornedPostingsIterator1Hit (line 118) | type unadornedPostingsIterator1Hit struct
    method Next (line 124) | func (i *unadornedPostingsIterator1Hit) Next() (segment.Posting, error) {
    method Advance (line 128) | func (i *unadornedPostingsIterator1Hit) Advance(docNum uint64) (segmen...
    method nextAtOrAfter (line 132) | func (i *unadornedPostingsIterator1Hit) nextAtOrAfter(atOrAfter uint64...
    method nextDocNumAtOrAfter (line 143) | func (i *unadornedPostingsIterator1Hit) nextDocNumAtOrAfter(atOrAfter ...
    method Size (line 157) | func (i *unadornedPostingsIterator1Hit) Size() int {
    method BytesRead (line 161) | func (i *unadornedPostingsIterator1Hit) BytesRead() uint64 {
    method BytesWritten (line 165) | func (i *unadornedPostingsIterator1Hit) BytesWritten() uint64 {
    method ResetBytesRead (line 169) | func (i *unadornedPostingsIterator1Hit) ResetBytesRead(uint64) {}
    method ResetIterator (line 172) | func (i *unadornedPostingsIterator1Hit) ResetIterator() {
  function newUnadornedPostingsIteratorFrom1Hit (line 176) | func newUnadornedPostingsIteratorFrom1Hit(docNum1Hit uint64) segment.Pos...
  type ResetablePostingsIterator (line 183) | type ResetablePostingsIterator interface
  type UnadornedPosting (line 187) | type UnadornedPosting struct
    method Number (line 191) | func (p *UnadornedPosting) Number() uint64 {
    method Frequency (line 195) | func (p *UnadornedPosting) Frequency() uint64 {
    method Norm (line 199) | func (p *UnadornedPosting) Norm() float64 {
    method Locations (line 203) | func (p *UnadornedPosting) Locations() []segment.Location {
    method Size (line 207) | func (p *UnadornedPosting) Size() int {

FILE: index/upsidedown/analysis.go
  type IndexRow (line 21) | type IndexRow interface
  type AnalysisResult (line 31) | type AnalysisResult struct
  method Analyze (line 36) | func (udc *UpsideDownCouch) Analyze(d index.Document) *AnalysisResult {
  method analyze (line 40) | func (udc *UpsideDownCouch) analyze(d index.Document) *AnalysisResult {

FILE: index/upsidedown/analysis_test.go
  function TestAnalysisBug328 (line 27) | func TestAnalysisBug328(t *testing.T) {
  function BenchmarkAnalyze (line 66) | func BenchmarkAnalyze(b *testing.B) {

FILE: index/upsidedown/benchmark_boltdb_test.go
  function BenchmarkBoltDBIndexing1Workers (line 27) | func BenchmarkBoltDBIndexing1Workers(b *testing.B) {
  function BenchmarkBoltDBIndexing2Workers (line 31) | func BenchmarkBoltDBIndexing2Workers(b *testing.B) {
  function BenchmarkBoltDBIndexing4Workers (line 35) | func BenchmarkBoltDBIndexing4Workers(b *testing.B) {
  function BenchmarkBoltDBIndexing1Workers10Batch (line 41) | func BenchmarkBoltDBIndexing1Workers10Batch(b *testing.B) {
  function BenchmarkBoltDBIndexing2Workers10Batch (line 45) | func BenchmarkBoltDBIndexing2Workers10Batch(b *testing.B) {
  function BenchmarkBoltDBIndexing4Workers10Batch (line 49) | func BenchmarkBoltDBIndexing4Workers10Batch(b *testing.B) {
  function BenchmarkBoltDBIndexing1Workers100Batch (line 53) | func BenchmarkBoltDBIndexing1Workers100Batch(b *testing.B) {
  function BenchmarkBoltDBIndexing2Workers100Batch (line 57) | func BenchmarkBoltDBIndexing2Workers100Batch(b *testing.B) {
  function BenchmarkBoltDBIndexing4Workers100Batch (line 61) | func BenchmarkBoltDBIndexing4Workers100Batch(b *testing.B) {
  function BenchmarkBoltBIndexing1Workers1000Batch (line 65) | func BenchmarkBoltBIndexing1Workers1000Batch(b *testing.B) {
  function BenchmarkBoltBIndexing2Workers1000Batch (line 69) | func BenchmarkBoltBIndexing2Workers1000Batch(b *testing.B) {
  function BenchmarkBoltBIndexing4Workers1000Batch (line 73) | func BenchmarkBoltBIndexing4Workers1000Batch(b *testing.B) {

FILE: index/upsidedown/benchmark_common_test.go
  type KVStoreDestroy (line 41) | type KVStoreDestroy
  function DestroyTest (line 43) | func DestroyTest() error {
  function CommonBenchmarkIndex (line 47) | func CommonBenchmarkIndex(b *testing.B, storeName string, storeConfig ma...
  function CommonBenchmarkIndexBatch (line 91) | func CommonBenchmarkIndexBatch(b *testing.B, storeName string, storeConf...

FILE: index/upsidedown/benchmark_gtreap_test.go
  function BenchmarkGTreapIndexing1Workers (line 23) | func BenchmarkGTreapIndexing1Workers(b *testing.B) {
  function BenchmarkGTreapIndexing2Workers (line 27) | func BenchmarkGTreapIndexing2Workers(b *testing.B) {
  function BenchmarkGTreapIndexing4Workers (line 31) | func BenchmarkGTreapIndexing4Workers(b *testing.B) {
  function BenchmarkGTreapIndexing1Workers10Batch (line 37) | func BenchmarkGTreapIndexing1Workers10Batch(b *testing.B) {
  function BenchmarkGTreapIndexing2Workers10Batch (line 41) | func BenchmarkGTreapIndexing2Workers10Batch(b *testing.B) {
  function BenchmarkGTreapIndexing4Workers10Batch (line 45) | func BenchmarkGTreapIndexing4Workers10Batch(b *testing.B) {
  function BenchmarkGTreapIndexing1Workers100Batch (line 49) | func BenchmarkGTreapIndexing1Workers100Batch(b *testing.B) {
  function BenchmarkGTreapIndexing2Workers100Batch (line 53) | func BenchmarkGTreapIndexing2Workers100Batch(b *testing.B) {
  function BenchmarkGTreapIndexing4Workers100Batch (line 57) | func BenchmarkGTreapIndexing4Workers100Batch(b *testing.B) {
  function BenchmarkGTreapIndexing1Workers1000Batch (line 61) | func BenchmarkGTreapIndexing1Workers1000Batch(b *testing.B) {
  function BenchmarkGTreapIndexing2Workers1000Batch (line 65) | func BenchmarkGTreapIndexing2Workers1000Batch(b *testing.B) {
  function BenchmarkGTreapIndexing4Workers1000Batch (line 69) | func BenchmarkGTreapIndexing4Workers1000Batch(b *testing.B) {

FILE: index/upsidedown/benchmark_null_test.go
  function BenchmarkNullIndexing1Workers (line 23) | func BenchmarkNullIndexing1Workers(b *testing.B) {
  function BenchmarkNullIndexing2Workers (line 27) | func BenchmarkNullIndexing2Workers(b *testing.B) {
  function BenchmarkNullIndexing4Workers (line 31) | func BenchmarkNullIndexing4Workers(b *testing.B) {
  function BenchmarkNullIndexing1Workers10Batch (line 37) | func BenchmarkNullIndexing1Workers10Batch(b *testing.B) {
  function BenchmarkNullIndexing2Workers10Batch (line 41) | func BenchmarkNullIndexing2Workers10Batch(b *testing.B) {
  function BenchmarkNullIndexing4Workers10Batch (line 45) | func BenchmarkNullIndexing4Workers10Batch(b *testing.B) {
  function BenchmarkNullIndexing1Workers100Batch (line 49) | func BenchmarkNullIndexing1Workers100Batch(b *testing.B) {
  function BenchmarkNullIndexing2Workers100Batch (line 53) | func BenchmarkNullIndexing2Workers100Batch(b *testing.B) {
  function BenchmarkNullIndexing4Workers100Batch (line 57) | func BenchmarkNullIndexing4Workers100Batch(b *testing.B) {
  function BenchmarkNullIndexing1Workers1000Batch (line 61) | func BenchmarkNullIndexing1Workers1000Batch(b *testing.B) {
  function BenchmarkNullIndexing2Workers1000Batch (line 65) | func BenchmarkNullIndexing2Workers1000Batch(b *testing.B) {
  function BenchmarkNullIndexing4Workers1000Batch (line 69) | func BenchmarkNullIndexing4Workers1000Batch(b *testing.B) {

FILE: index/upsidedown/dump.go
  function dumpPrefix (line 29) | func dumpPrefix(kvreader store.KVReader, rv chan interface{}, prefix []b...
  function dumpRange (line 59) | func dumpRange(kvreader store.KVReader, rv chan interface{}, start, end ...
  method DumpAll (line 85) | func (i *IndexReader) DumpAll() chan interface{} {
  method DumpFields (line 94) | func (i *IndexReader) DumpFields() chan interface{} {
  type keyset (line 103) | type keyset
    method Len (line 105) | func (k keyset) Len() int           { return len(k) }
    method Swap (line 106) | func (k keyset) Swap(i, j int)      { k[i], k[j] = k[j], k[i] }
    method Less (line 107) | func (k keyset) Less(i, j int) bool { return bytes.Compare(k[i], k[j])...
  method DumpDoc (line 110) | func (i *IndexReader) DumpDoc(id string) chan interface{} {

FILE: index/upsidedown/dump_test.go
  function TestDump (line 27) | func TestDump(t *testing.T) {

FILE: index/upsidedown/field_cache.go
  type FieldCache (line 21) | type FieldCache struct
    method AddExisting (line 35) | func (f *FieldCache) AddExisting(field string, index uint16) {
    method addLOCKED (line 41) | func (f *FieldCache) addLOCKED(field string, index uint16) uint16 {
    method FieldNamed (line 58) | func (f *FieldCache) FieldNamed(field string, createIfMissing bool) (u...
    method FieldIndexed (line 81) | func (f *FieldCache) FieldIndexed(index uint16) (field string) {
  function NewFieldCache (line 28) | func NewFieldCache() *FieldCache {

FILE: index/upsidedown/field_dict.go
  type UpsideDownCouchFieldDict (line 24) | type UpsideDownCouchFieldDict struct
    method BytesRead (line 54) | func (r *UpsideDownCouchFieldDict) BytesRead() uint64 {
    method Next (line 58) | func (r *UpsideDownCouchFieldDict) Next() (*index.DictEntry, error) {
    method Cardinality (line 80) | func (r *UpsideDownCouchFieldDict) Cardinality() int {
    method Close (line 84) | func (r *UpsideDownCouchFieldDict) Close() error {
  function newUpsideDownCouchFieldDict (line 32) | func newUpsideDownCouchFieldDict(indexReader *IndexReader, field uint16,...

FILE: index/upsidedown/field_dict_test.go
  function TestIndexFieldDict (line 26) | func TestIndexFieldDict(t *testing.T) {

FILE: index/upsidedown/index_reader.go
  function init (line 28) | func init() {
  type IndexReader (line 33) | type IndexReader struct
    method TermFieldReader (line 39) | func (i *IndexReader) TermFieldReader(ctx context.Context, term []byte...
    method FieldDict (line 47) | func (i *IndexReader) FieldDict(fieldName string) (index.FieldDict, er...
    method FieldDictRange (line 51) | func (i *IndexReader) FieldDictRange(fieldName string, startTerm []byt...
    method FieldDictPrefix (line 59) | func (i *IndexReader) FieldDictPrefix(fieldName string, termPrefix []b...
    method DocIDReaderAll (line 63) | func (i *IndexReader) DocIDReaderAll() (index.DocIDReader, error) {
    method DocIDReaderOnly (line 67) | func (i *IndexReader) DocIDReaderOnly(ids []string) (index.DocIDReader...
    method Document (line 71) | func (i *IndexReader) Document(id string) (doc index.Document, err err...
    method documentVisitFieldTerms (line 113) | func (i *IndexReader) documentVisitFieldTerms(id index.IndexInternalID...
    method Fields (line 151) | func (i *IndexReader) Fields() (fields []string, err error) {
    method GetInternal (line 180) | func (i *IndexReader) GetInternal(key []byte) ([]byte, error) {
    method DocCount (line 185) | func (i *IndexReader) DocCount() (uint64, error) {
    method Close (line 189) | func (i *IndexReader) Close() error {
    method ExternalID (line 193) | func (i *IndexReader) ExternalID(id index.IndexInternalID) (string, er...
    method InternalID (line 197) | func (i *IndexReader) InternalID(id string) (index.IndexInternalID, er...
    method DocValueReader (line 214) | func (i *IndexReader) DocValueReader(fields []string) (index.DocValueR...
  function incrementBytes (line 201) | func incrementBytes(in []byte) []byte {
  type DocValueReader (line 218) | type DocValueReader struct
    method VisitDocValues (line 223) | func (dvr *DocValueReader) VisitDocValues(id index.IndexInternalID,
    method BytesRead (line 228) | func (dvr *DocValueReader) BytesRead() uint64 { return 0 }

FILE: index/upsidedown/reader.go
  function init (line 31) | func init() {
  type UpsideDownCouchTermFieldReader (line 40) | type UpsideDownCouchTermFieldReader struct
    method Size (line 52) | func (r *UpsideDownCouchTermFieldReader) Size() int {
    method Count (line 108) | func (r *UpsideDownCouchTermFieldReader) Count() uint64 {
    method Next (line 112) | func (r *UpsideDownCouchTermFieldReader) Next(preAlloced *index.TermFi...
    method Advance (line 149) | func (r *UpsideDownCouchTermFieldReader) Advance(docID index.IndexInte...
    method Close (line 186) | func (r *UpsideDownCouchTermFieldReader) Close() error {
  function newUpsideDownCouchTermFieldReader (line 65) | func newUpsideDownCouchTermFieldReader(indexReader *IndexReader, term []...
  type UpsideDownCouchDocIDReader (line 196) | type UpsideDownCouchDocIDReader struct
    method Size (line 204) | func (r *UpsideDownCouchDocIDReader) Size() int {
    method Next (line 255) | func (r *UpsideDownCouchDocIDReader) Next() (index.IndexInternalID, er...
    method Advance (line 300) | func (r *UpsideDownCouchDocIDReader) Advance(docID index.IndexInternal...
    method Close (line 358) | func (r *UpsideDownCouchDocIDReader) Close() error {
    method nextOnly (line 364) | func (r *UpsideDownCouchDocIDReader) nextOnly() bool {
  function newUpsideDownCouchDocIDReader (line 215) | func newUpsideDownCouchDocIDReader(indexReader *IndexReader) (*UpsideDow...
  function newUpsideDownCouchDocIDReaderOnly (line 229) | func newUpsideDownCouchDocIDReaderOnly(indexReader *IndexReader, ids []s...

FILE: index/upsidedown/reader_test.go
  function TestIndexReader (line 27) | func TestIndexReader(t *testing.T) {
  function TestIndexDocIdReader (line 200) | func TestIndexDocIdReader(t *testing.T) {
  function TestCrashBadBackIndexRow (line 311) | func TestCrashBadBackIndexRow(t *testing.T) {
  function TestIndexDocIdOnlyReader (line 321) | func TestIndexDocIdOnlyReader(t *testing.T) {

FILE: index/upsidedown/row.go
  function init (line 34) | func init() {
  constant ByteSeparator (line 41) | ByteSeparator byte = 0xff
  type UpsideDownCouchRowStream (line 43) | type UpsideDownCouchRowStream
  type UpsideDownCouchRow (line 45) | type UpsideDownCouchRow interface
  function ParseFromKeyValue (line 54) | func ParseFromKeyValue(key, value []byte) (UpsideDownCouchRow, error) {
  type VersionRow (line 79) | type VersionRow struct
    method Key (line 83) | func (v *VersionRow) Key() []byte {
    method KeySize (line 87) | func (v *VersionRow) KeySize() int {
    method KeyTo (line 91) | func (v *VersionRow) KeyTo(buf []byte) (int, error) {
    method Value (line 96) | func (v *VersionRow) Value() []byte {
    method ValueSize (line 100) | func (v *VersionRow) ValueSize() int {
    method ValueTo (line 104) | func (v *VersionRow) ValueTo(buf []byte) (int, error) {
    method String (line 109) | func (v *VersionRow) String() string {
  function NewVersionRow (line 113) | func NewVersionRow(version uint8) *VersionRow {
  function NewVersionRowKV (line 119) | func NewVersionRowKV(key, value []byte) (*VersionRow, error) {
  type InternalRow (line 131) | type InternalRow struct
    method Key (line 136) | func (i *InternalRow) Key() []byte {
    method KeySize (line 142) | func (i *InternalRow) KeySize() int {
    method KeyTo (line 146) | func (i *InternalRow) KeyTo(buf []byte) (int, error) {
    method Value (line 152) | func (i *InternalRow) Value() []byte {
    method ValueSize (line 156) | func (i *InternalRow) ValueSize() int {
    method ValueTo (line 160) | func (i *InternalRow) ValueTo(buf []byte) (int, error) {
    method String (line 165) | func (i *InternalRow) String() string {
  function NewInternalRow (line 169) | func NewInternalRow(key, val []byte) *InternalRow {
  function NewInternalRowKV (line 176) | func NewInternalRowKV(key, value []byte) (*InternalRow, error) {
  type FieldRow (line 185) | type FieldRow struct
    method Key (line 190) | func (f *FieldRow) Key() []byte {
    method KeySize (line 196) | func (f *FieldRow) KeySize() int {
    method KeyTo (line 200) | func (f *FieldRow) KeyTo(buf []byte) (int, error) {
    method Value (line 206) | func (f *FieldRow) Value() []byte {
    method ValueSize (line 210) | func (f *FieldRow) ValueSize() int {
    method ValueTo (line 214) | func (f *FieldRow) ValueTo(buf []byte) (int, error) {
    method String (line 220) | func (f *FieldRow) String() string {
  function NewFieldRow (line 224) | func NewFieldRow(index uint16, name string) *FieldRow {
  function NewFieldRowKV (line 231) | func NewFieldRowKV(key, value []byte) (*FieldRow, error) {
  constant DictionaryRowMaxValueSize (line 256) | DictionaryRowMaxValueSize = binary.MaxVarintLen64
  type DictionaryRow (line 258) | type DictionaryRow struct
    method Key (line 264) | func (dr *DictionaryRow) Key() []byte {
    method KeySize (line 270) | func (dr *DictionaryRow) KeySize() int {
    method KeyTo (line 278) | func (dr *DictionaryRow) KeyTo(buf []byte) (int, error) {
    method Value (line 289) | func (dr *DictionaryRow) Value() []byte {
    method ValueSize (line 295) | func (dr *DictionaryRow) ValueSize() int {
    method ValueTo (line 299) | func (dr *DictionaryRow) ValueTo(buf []byte) (int, error) {
    method String (line 304) | func (dr *DictionaryRow) String() string {
    method parseDictionaryK (line 338) | func (dr *DictionaryRow) parseDictionaryK(key []byte) error {
    method parseDictionaryV (line 347) | func (dr *DictionaryRow) parseDictionaryV(value []byte) error {
  function dictionaryRowKeySize (line 274) | func dictionaryRowKeySize(term []byte) int {
  function dictionaryRowKeyTo (line 282) | func dictionaryRowKeyTo(buf
Condensed preview — 759 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (5,274K chars).
[
  {
    "path": ".github/workflows/cover.yml",
    "chars": 762,
    "preview": "on:\n  push:\n    branches:\n      - master\n  pull_request:\nname: Coverage\njobs:\n  coverage:\n    runs-on: ubuntu-latest\n   "
  },
  {
    "path": ".github/workflows/tests.yml",
    "chars": 512,
    "preview": "on:\n  push:\n    branches:\n    - master\n  pull_request:\nname: Tests\njobs:\n  test:\n    strategy:\n      matrix:\n        go-"
  },
  {
    "path": ".gitignore",
    "chars": 276,
    "preview": "#*\n*.sublime-*\n*~\n.#*\n.project\n.settings\n**/.idea/\n**/*.iml\n.DS_Store\nquery_string.y.go.tmp\n/analysis/token_filters/cld2"
  },
  {
    "path": "CONTRIBUTING.md",
    "chars": 1013,
    "preview": "# Contributing to Bleve\n\nWe look forward to your contributions, but ask that you first review these guidelines.\n\n## Sign"
  },
  {
    "path": "LICENSE",
    "chars": 11357,
    "preview": "\n                                 Apache License\n                           Version 2.0, January 2004\n                  "
  },
  {
    "path": "README.md",
    "chars": 5257,
    "preview": "# ![bleve](docs/bleve.png) bleve\n\n[![Tests](https://github.com/blevesearch/bleve/actions/workflows/tests.yml/badge.svg?b"
  },
  {
    "path": "SECURITY.md",
    "chars": 734,
    "preview": "# Security Policy\n\n## Supported Versions\n\nWe support the latest release (for example, bleve v2.5.x).\n\n## Reporting a Vul"
  },
  {
    "path": "analysis/analyzer/custom/custom.go",
    "chars": 4002,
    "preview": "//  Copyright (c) 2014 Couchbase, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
  },
  {
    "path": "analysis/analyzer/keyword/keyword.go",
    "chars": 1201,
    "preview": "//  Copyright (c) 2014 Couchbase, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
  },
  {
    "path": "analysis/analyzer/simple/simple.go",
    "chars": 1408,
    "preview": "//  Copyright (c) 2014 Couchbase, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
  },
  {
    "path": "analysis/analyzer/standard/standard.go",
    "chars": 1579,
    "preview": "//  Copyright (c) 2014 Couchbase, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
  },
  {
    "path": "analysis/analyzer/web/web.go",
    "chars": 1561,
    "preview": "//  Copyright (c) 2014 Couchbase, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
  },
  {
    "path": "analysis/benchmark_test.go",
    "chars": 11003,
    "preview": "//  Copyright (c) 2015 Couchbase, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
  },
  {
    "path": "analysis/char/asciifolding/asciifolding.go",
    "chars": 117129,
    "preview": "//  Copyright (c) 2018 Couchbase, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
  },
  {
    "path": "analysis/char/asciifolding/asciifolding_test.go",
    "chars": 3133,
    "preview": "//  Copyright (c) 2018 Couchbase, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
  },
  {
    "path": "analysis/char/html/html.go",
    "chars": 1476,
    "preview": "//  Copyright (c) 2014 Couchbase, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
  },
  {
    "path": "analysis/char/regexp/regexp.go",
    "chars": 1682,
    "preview": "//  Copyright (c) 2014 Couchbase, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
  },
  {
    "path": "analysis/char/regexp/regexp_test.go",
    "chars": 2197,
    "preview": "//  Copyright (c) 2014 Couchbase, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
  },
  {
    "path": "analysis/char/zerowidthnonjoiner/zerowidthnonjoiner.go",
    "chars": 1237,
    "preview": "//  Copyright (c) 2014 Couchbase, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
  },
  {
    "path": "analysis/datetime/flexible/flexible.go",
    "chars": 1710,
    "preview": "//  Copyright (c) 2014 Couchbase, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
  },
  {
    "path": "analysis/datetime/flexible/flexible_test.go",
    "chars": 2845,
    "preview": "//  Copyright (c) 2014 Couchbase, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
  },
  {
    "path": "analysis/datetime/iso/iso.go",
    "chars": 7373,
    "preview": "//  Copyright (c) 2023 Couchbase, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
  },
  {
    "path": "analysis/datetime/iso/iso_test.go",
    "chars": 4508,
    "preview": "//  Copyright (c) 2023 Couchbase, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
  },
  {
    "path": "analysis/datetime/optional/optional.go",
    "chars": 1419,
    "preview": "//  Copyright (c) 2014 Couchbase, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
  },
  {
    "path": "analysis/datetime/percent/percent.go",
    "chars": 7673,
    "preview": "//  Copyright (c) 2023 Couchbase, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
  },
  {
    "path": "analysis/datetime/percent/percent_test.go",
    "chars": 12321,
    "preview": "//  Copyright (c) 2023 Couchbase, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
  },
  {
    "path": "analysis/datetime/sanitized/sanitized.go",
    "chars": 3574,
    "preview": "//  Copyright (c) 2023 Couchbase, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
  },
  {
    "path": "analysis/datetime/sanitized/sanitized_test.go",
    "chars": 2880,
    "preview": "//  Copyright (c) 2023 Couchbase, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
  },
  {
    "path": "analysis/datetime/timestamp/microseconds/microseconds.go",
    "chars": 1594,
    "preview": "//  Copyright (c) 2023 Couchbase, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
  },
  {
    "path": "analysis/datetime/timestamp/milliseconds/milliseconds.go",
    "chars": 1600,
    "preview": "//  Copyright (c) 2023 Couchbase, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
  },
  {
    "path": "analysis/datetime/timestamp/nanoseconds/nanoseconds.go",
    "chars": 1576,
    "preview": "//  Copyright (c) 2023 Couchbase, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
  },
  {
    "path": "analysis/datetime/timestamp/seconds/seconds.go",
    "chars": 1592,
    "preview": "//  Copyright (c) 2014 Couchbase, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
  },
  {
    "path": "analysis/freq.go",
    "chars": 1843,
    "preview": "//  Copyright (c) 2014 Couchbase, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
  },
  {
    "path": "analysis/freq_test.go",
    "chars": 1455,
    "preview": "//  Copyright (c) 2014 Couchbase, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
  },
  {
    "path": "analysis/lang/ar/analyzer_ar.go",
    "chars": 1935,
    "preview": "//  Copyright (c) 2014 Couchbase, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
  },
  {
    "path": "analysis/lang/ar/analyzer_ar_test.go",
    "chars": 3722,
    "preview": "//  Copyright (c) 2014 Couchbase, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
  },
  {
    "path": "analysis/lang/ar/arabic_normalize.go",
    "chars": 2291,
    "preview": "//  Copyright (c) 2014 Couchbase, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
  },
  {
    "path": "analysis/lang/ar/arabic_normalize_test.go",
    "chars": 4299,
    "preview": "//  Copyright (c) 2014 Couchbase, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
  },
  {
    "path": "analysis/lang/ar/stemmer_ar.go",
    "chars": 2771,
    "preview": "//  Copyright (c) 2014 Couchbase, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
  },
  {
    "path": "analysis/lang/ar/stemmer_ar_test.go",
    "chars": 6969,
    "preview": "//  Copyright (c) 2014 Couchbase, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
  },
  {
    "path": "analysis/lang/ar/stop_filter_ar.go",
    "chars": 1142,
    "preview": "//  Copyright (c) 2014 Couchbase, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
  },
  {
    "path": "analysis/lang/ar/stop_words_ar.go",
    "chars": 1536,
    "preview": "package ar\n\nimport (\n\t\"github.com/blevesearch/bleve/v2/analysis\"\n\t\"github.com/blevesearch/bleve/v2/registry\"\n)\n\nconst St"
  },
  {
    "path": "analysis/lang/bg/stop_filter_bg.go",
    "chars": 1142,
    "preview": "//  Copyright (c) 2014 Couchbase, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
  },
  {
    "path": "analysis/lang/bg/stop_words_bg.go",
    "chars": 1779,
    "preview": "package bg\n\nimport (\n\t\"github.com/blevesearch/bleve/v2/analysis\"\n\t\"github.com/blevesearch/bleve/v2/registry\"\n)\n\nconst St"
  },
  {
    "path": "analysis/lang/ca/articles_ca.go",
    "chars": 633,
    "preview": "package ca\n\nimport (\n\t\"github.com/blevesearch/bleve/v2/analysis\"\n\t\"github.com/blevesearch/bleve/v2/registry\"\n)\n\nconst Ar"
  },
  {
    "path": "analysis/lang/ca/elision_ca.go",
    "chars": 1255,
    "preview": "//  Copyright (c) 2014 Couchbase, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
  },
  {
    "path": "analysis/lang/ca/elision_ca_test.go",
    "chars": 1510,
    "preview": "//  Copyright (c) 2014 Couchbase, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
  },
  {
    "path": "analysis/lang/ca/stop_filter_ca.go",
    "chars": 1142,
    "preview": "//  Copyright (c) 2014 Couchbase, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
  },
  {
    "path": "analysis/lang/ca/stop_words_ca.go",
    "chars": 1914,
    "preview": "package ca\n\nimport (\n\t\"github.com/blevesearch/bleve/v2/analysis\"\n\t\"github.com/blevesearch/bleve/v2/registry\"\n)\n\nconst St"
  },
  {
    "path": "analysis/lang/cjk/analyzer_cjk.go",
    "chars": 1642,
    "preview": "//  Copyright (c) 2014 Couchbase, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
  },
  {
    "path": "analysis/lang/cjk/analyzer_cjk_test.go",
    "chars": 13580,
    "preview": "//  Copyright (c) 2014 Couchbase, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
  },
  {
    "path": "analysis/lang/cjk/cjk_bigram.go",
    "chars": 5103,
    "preview": "//  Copyright (c) 2014 Couchbase, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
  },
  {
    "path": "analysis/lang/cjk/cjk_bigram_test.go",
    "chars": 19425,
    "preview": "//  Copyright (c) 2014 Couchbase, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
  },
  {
    "path": "analysis/lang/cjk/cjk_width.go",
    "chars": 3259,
    "preview": "//  Copyright (c) 2016 Couchbase, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
  },
  {
    "path": "analysis/lang/cjk/cjk_width_test.go",
    "chars": 1946,
    "preview": "//  Copyright (c) 2016 Couchbase, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
  },
  {
    "path": "analysis/lang/ckb/analyzer_ckb.go",
    "chars": 1784,
    "preview": "//  Copyright (c) 2014 Couchbase, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
  },
  {
    "path": "analysis/lang/ckb/analyzer_ckb_test.go",
    "chars": 1739,
    "preview": "//  Copyright (c) 2014 Couchbase, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
  },
  {
    "path": "analysis/lang/ckb/sorani_normalize.go",
    "chars": 2735,
    "preview": "//  Copyright (c) 2014 Couchbase, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
  },
  {
    "path": "analysis/lang/ckb/sorani_normalize_test.go",
    "chars": 5864,
    "preview": "//  Copyright (c) 2014 Couchbase, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
  },
  {
    "path": "analysis/lang/ckb/sorani_stemmer_filter.go",
    "chars": 4729,
    "preview": "//  Copyright (c) 2014 Couchbase, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
  },
  {
    "path": "analysis/lang/ckb/sorani_stemmer_filter_test.go",
    "chars": 6012,
    "preview": "//  Copyright (c) 2014 Couchbase, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
  },
  {
    "path": "analysis/lang/ckb/stop_filter_ckb.go",
    "chars": 1143,
    "preview": "//  Copyright (c) 2014 Couchbase, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
  },
  {
    "path": "analysis/lang/ckb/stop_words_ckb.go",
    "chars": 2140,
    "preview": "package ckb\n\nimport (\n\t\"github.com/blevesearch/bleve/v2/analysis\"\n\t\"github.com/blevesearch/bleve/v2/registry\"\n)\n\nconst S"
  },
  {
    "path": "analysis/lang/cs/stop_filter_cs.go",
    "chars": 1142,
    "preview": "//  Copyright (c) 2014 Couchbase, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
  },
  {
    "path": "analysis/lang/cs/stop_words_cs.go",
    "chars": 1420,
    "preview": "package cs\n\nimport (\n\t\"github.com/blevesearch/bleve/v2/analysis\"\n\t\"github.com/blevesearch/bleve/v2/registry\"\n)\n\nconst St"
  },
  {
    "path": "analysis/lang/da/analyzer_da.go",
    "chars": 1669,
    "preview": "//  Copyright (c) 2018 Couchbase, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
  },
  {
    "path": "analysis/lang/da/analyzer_da_test.go",
    "chars": 1639,
    "preview": "//  Copyright (c) 2018 Couchbase, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
  },
  {
    "path": "analysis/lang/da/stemmer_da.go",
    "chars": 1515,
    "preview": "//  Copyright (c) 2018 Couchbase, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
  },
  {
    "path": "analysis/lang/da/stop_filter_da.go",
    "chars": 1142,
    "preview": "//  Copyright (c) 2018 Couchbase, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
  },
  {
    "path": "analysis/lang/da/stop_words_da.go",
    "chars": 4139,
    "preview": "package da\n\nimport (\n\t\"github.com/blevesearch/bleve/v2/analysis\"\n\t\"github.com/blevesearch/bleve/v2/registry\"\n)\n\nconst St"
  },
  {
    "path": "analysis/lang/de/analyzer_de.go",
    "chars": 1801,
    "preview": "//  Copyright (c) 2017 Couchbase, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
  },
  {
    "path": "analysis/lang/de/analyzer_de_test.go",
    "chars": 3159,
    "preview": "//  Copyright (c) 2017 Couchbase, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
  },
  {
    "path": "analysis/lang/de/german_normalize.go",
    "chars": 2183,
    "preview": "//  Copyright (c) 2017 Couchbase, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
  },
  {
    "path": "analysis/lang/de/german_normalize_test.go",
    "chars": 2404,
    "preview": "//  Copyright (c) 2017 Couchbase, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
  },
  {
    "path": "analysis/lang/de/light_stemmer_de.go",
    "chars": 2586,
    "preview": "//  Copyright (c) 2017 Couchbase, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
  },
  {
    "path": "analysis/lang/de/stemmer_de_snowball.go",
    "chars": 1515,
    "preview": "//  Copyright (c) 2020 Couchbase, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
  },
  {
    "path": "analysis/lang/de/stemmer_de_test.go",
    "chars": 2014,
    "preview": "//  Copyright (c) 2020 Couchbase, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
  },
  {
    "path": "analysis/lang/de/stop_filter_de.go",
    "chars": 1142,
    "preview": "//  Copyright (c) 2017 Couchbase, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
  },
  {
    "path": "analysis/lang/de/stop_words_de.go",
    "chars": 5225,
    "preview": "package de\n\nimport (\n\t\"github.com/blevesearch/bleve/v2/analysis\"\n\t\"github.com/blevesearch/bleve/v2/registry\"\n)\n\nconst St"
  },
  {
    "path": "analysis/lang/el/stop_filter_el.go",
    "chars": 1142,
    "preview": "//  Copyright (c) 2014 Couchbase, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
  },
  {
    "path": "analysis/lang/el/stop_words_el.go",
    "chars": 1153,
    "preview": "package el\n\nimport (\n\t\"github.com/blevesearch/bleve/v2/analysis\"\n\t\"github.com/blevesearch/bleve/v2/registry\"\n)\n\nconst St"
  },
  {
    "path": "analysis/lang/en/analyzer_en.go",
    "chars": 2128,
    "preview": "//  Copyright (c) 2014 Couchbase, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
  },
  {
    "path": "analysis/lang/en/analyzer_en_test.go",
    "chars": 2244,
    "preview": "//  Copyright (c) 2014 Couchbase, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
  },
  {
    "path": "analysis/lang/en/plural_stemmer.go",
    "chars": 4761,
    "preview": "/*\n\tThis code was ported from the Open Search Project\n\thttps://github.com/opensearch-project/OpenSearch/blob/main/module"
  },
  {
    "path": "analysis/lang/en/plural_stemmer_test.go",
    "chars": 885,
    "preview": "package en\n\nimport \"testing\"\n\nfunc TestEnglishPluralStemmer(t *testing.T) {\n\tdata := []struct {\n\t\tIn, Out string\n\t}{\n\t\t{"
  },
  {
    "path": "analysis/lang/en/possessive_filter_en.go",
    "chars": 2263,
    "preview": "//  Copyright (c) 2014 Couchbase, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
  },
  {
    "path": "analysis/lang/en/possessive_filter_en_test.go",
    "chars": 2923,
    "preview": "//  Copyright (c) 2014 Couchbase, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
  },
  {
    "path": "analysis/lang/en/stemmer_en_snowball.go",
    "chars": 1525,
    "preview": "//  Copyright (c) 2020 Couchbase, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
  },
  {
    "path": "analysis/lang/en/stemmer_en_test.go",
    "chars": 1789,
    "preview": "//  Copyright (c) 2020 Couchbase, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
  },
  {
    "path": "analysis/lang/en/stop_filter_en.go",
    "chars": 1142,
    "preview": "//  Copyright (c) 2014 Couchbase, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
  },
  {
    "path": "analysis/lang/en/stop_words_en.go",
    "chars": 5711,
    "preview": "package en\n\nimport (\n\t\"github.com/blevesearch/bleve/v2/analysis\"\n\t\"github.com/blevesearch/bleve/v2/registry\"\n)\n\nconst St"
  },
  {
    "path": "analysis/lang/es/analyzer_es.go",
    "chars": 1803,
    "preview": "//  Copyright (c) 2017 Couchbase, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
  },
  {
    "path": "analysis/lang/es/analyzer_es_test.go",
    "chars": 2528,
    "preview": "//  Copyright (c) 2017 Couchbase, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
  },
  {
    "path": "analysis/lang/es/light_stemmer_es.go",
    "chars": 1937,
    "preview": "//  Copyright (c) 2017 Couchbase, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
  },
  {
    "path": "analysis/lang/es/spanish_normalize.go",
    "chars": 1780,
    "preview": "//  Copyright (c) 2017 Couchbase, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
  },
  {
    "path": "analysis/lang/es/spanish_normalize_test.go",
    "chars": 2387,
    "preview": "//  Copyright (c) 2017 Couchbase, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
  },
  {
    "path": "analysis/lang/es/stemmer_es_snowball.go",
    "chars": 1525,
    "preview": "//  Copyright (c) 2020 Couchbase, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
  },
  {
    "path": "analysis/lang/es/stemmer_es_snowball_test.go",
    "chars": 1801,
    "preview": "//  Copyright (c) 2020 Couchbase, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
  },
  {
    "path": "analysis/lang/es/stop_filter_es.go",
    "chars": 1139,
    "preview": "// Copyright (c) 2017 Couchbase, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may n"
  },
  {
    "path": "analysis/lang/es/stop_words_es.go",
    "chars": 6275,
    "preview": "package es\n\nimport (\n\t\"github.com/blevesearch/bleve/v2/analysis\"\n\t\"github.com/blevesearch/bleve/v2/registry\"\n)\n\nconst St"
  },
  {
    "path": "analysis/lang/eu/stop_filter_eu.go",
    "chars": 1142,
    "preview": "//  Copyright (c) 2014 Couchbase, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
  },
  {
    "path": "analysis/lang/eu/stop_words_eu.go",
    "chars": 1253,
    "preview": "package eu\n\nimport (\n\t\"github.com/blevesearch/bleve/v2/analysis\"\n\t\"github.com/blevesearch/bleve/v2/registry\"\n)\n\nconst St"
  },
  {
    "path": "analysis/lang/fa/analyzer_fa.go",
    "chars": 2053,
    "preview": "//  Copyright (c) 2014 Couchbase, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
  },
  {
    "path": "analysis/lang/fa/analyzer_fa_test.go",
    "chars": 14088,
    "preview": "//  Copyright (c) 2014 Couchbase, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
  },
  {
    "path": "analysis/lang/fa/persian_normalize.go",
    "chars": 1988,
    "preview": "//  Copyright (c) 2014 Couchbase, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
  },
  {
    "path": "analysis/lang/fa/persian_normalize_test.go",
    "chars": 2615,
    "preview": "//  Copyright (c) 2014 Couchbase, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
  },
  {
    "path": "analysis/lang/fa/stop_filter_fa.go",
    "chars": 1142,
    "preview": "//  Copyright (c) 2014 Couchbase, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
  },
  {
    "path": "analysis/lang/fa/stop_words_fa.go",
    "chars": 2476,
    "preview": "package fa\n\nimport (\n\t\"github.com/blevesearch/bleve/v2/analysis\"\n\t\"github.com/blevesearch/bleve/v2/registry\"\n)\n\nconst St"
  },
  {
    "path": "analysis/lang/fi/analyzer_fi.go",
    "chars": 1670,
    "preview": "//  Copyright (c) 2018 Couchbase, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
  },
  {
    "path": "analysis/lang/fi/analyzer_fi_test.go",
    "chars": 1749,
    "preview": "//  Copyright (c) 2018 Couchbase, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
  },
  {
    "path": "analysis/lang/fi/stemmer_fi.go",
    "chars": 1525,
    "preview": "//  Copyright (c) 2018 Couchbase, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
  },
  {
    "path": "analysis/lang/fi/stop_filter_fi.go",
    "chars": 1142,
    "preview": "//  Copyright (c) 2018 Couchbase, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
  },
  {
    "path": "analysis/lang/fi/stop_words_fi.go",
    "chars": 3465,
    "preview": "package fi\n\nimport (\n\t\"github.com/blevesearch/bleve/v2/analysis\"\n\t\"github.com/blevesearch/bleve/v2/registry\"\n)\n\nconst St"
  },
  {
    "path": "analysis/lang/fr/analyzer_fr.go",
    "chars": 1768,
    "preview": "//  Copyright (c) 2014 Couchbase, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
  },
  {
    "path": "analysis/lang/fr/analyzer_fr_test.go",
    "chars": 4458,
    "preview": "//  Copyright (c) 2014 Couchbase, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
  },
  {
    "path": "analysis/lang/fr/articles_fr.go",
    "chars": 665,
    "preview": "package fr\n\nimport (\n\t\"github.com/blevesearch/bleve/v2/analysis\"\n\t\"github.com/blevesearch/bleve/v2/registry\"\n)\n\nconst Ar"
  },
  {
    "path": "analysis/lang/fr/elision_fr.go",
    "chars": 1255,
    "preview": "//  Copyright (c) 2014 Couchbase, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
  },
  {
    "path": "analysis/lang/fr/elision_fr_test.go",
    "chars": 1386,
    "preview": "//  Copyright (c) 2014 Couchbase, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
  },
  {
    "path": "analysis/lang/fr/light_stemmer_fr.go",
    "chars": 7474,
    "preview": "//  Copyright (c) 2015 Couchbase, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
  },
  {
    "path": "analysis/lang/fr/light_stemmer_fr_test.go",
    "chars": 17964,
    "preview": "//  Copyright (c) 2015 Couchbase, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
  },
  {
    "path": "analysis/lang/fr/minimal_stemmer_fr.go",
    "chars": 2120,
    "preview": "//  Copyright (c) 2015 Couchbase, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
  },
  {
    "path": "analysis/lang/fr/minimal_stemmer_fr_test.go",
    "chars": 2783,
    "preview": "//  Copyright (c) 2015 Couchbase, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
  },
  {
    "path": "analysis/lang/fr/stemmer_fr_snowball.go",
    "chars": 1515,
    "preview": "//  Copyright (c) 2020 Couchbase, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
  },
  {
    "path": "analysis/lang/fr/stemmer_fr_snowball_test.go",
    "chars": 1808,
    "preview": "//  Copyright (c) 2020 Couchbase, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
  },
  {
    "path": "analysis/lang/fr/stop_filter_fr.go",
    "chars": 1142,
    "preview": "//  Copyright (c) 2014 Couchbase, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
  },
  {
    "path": "analysis/lang/fr/stop_words_fr.go",
    "chars": 3817,
    "preview": "package fr\n\nimport (\n\t\"github.com/blevesearch/bleve/v2/analysis\"\n\t\"github.com/blevesearch/bleve/v2/registry\"\n)\n\nconst St"
  },
  {
    "path": "analysis/lang/ga/articles_ga.go",
    "chars": 623,
    "preview": "package ga\n\nimport (\n\t\"github.com/blevesearch/bleve/v2/analysis\"\n\t\"github.com/blevesearch/bleve/v2/registry\"\n)\n\nconst Ar"
  },
  {
    "path": "analysis/lang/ga/elision_ga.go",
    "chars": 1255,
    "preview": "//  Copyright (c) 2014 Couchbase, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
  },
  {
    "path": "analysis/lang/ga/elision_ga_test.go",
    "chars": 1388,
    "preview": "//  Copyright (c) 2014 Couchbase, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
  },
  {
    "path": "analysis/lang/ga/stop_filter_ga.go",
    "chars": 1142,
    "preview": "//  Copyright (c) 2014 Couchbase, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
  },
  {
    "path": "analysis/lang/ga/stop_words_ga.go",
    "chars": 1162,
    "preview": "package ga\n\nimport (\n\t\"github.com/blevesearch/bleve/v2/analysis\"\n\t\"github.com/blevesearch/bleve/v2/registry\"\n)\n\nconst St"
  },
  {
    "path": "analysis/lang/gl/stop_filter_gl.go",
    "chars": 1142,
    "preview": "//  Copyright (c) 2014 Couchbase, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
  },
  {
    "path": "analysis/lang/gl/stop_words_gl.go",
    "chars": 1440,
    "preview": "package gl\n\nimport (\n\t\"github.com/blevesearch/bleve/v2/analysis\"\n\t\"github.com/blevesearch/bleve/v2/registry\"\n)\n\nconst St"
  },
  {
    "path": "analysis/lang/hi/analyzer_hi.go",
    "chars": 1965,
    "preview": "//  Copyright (c) 2014 Couchbase, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
  },
  {
    "path": "analysis/lang/hi/analyzer_hi_test.go",
    "chars": 1562,
    "preview": "//  Copyright (c) 2014 Couchbase, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
  },
  {
    "path": "analysis/lang/hi/hindi_normalize.go",
    "chars": 3339,
    "preview": "//  Copyright (c) 2014 Couchbase, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
  },
  {
    "path": "analysis/lang/hi/hindi_normalize_test.go",
    "chars": 4759,
    "preview": "//  Copyright (c) 2014 Couchbase, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
  },
  {
    "path": "analysis/lang/hi/hindi_stemmer_filter.go",
    "chars": 4823,
    "preview": "//  Copyright (c) 2014 Couchbase, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
  },
  {
    "path": "analysis/lang/hi/hindi_stemmer_filter_test.go",
    "chars": 5586,
    "preview": "//  Copyright (c) 2014 Couchbase, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
  },
  {
    "path": "analysis/lang/hi/stop_filter_hi.go",
    "chars": 1142,
    "preview": "//  Copyright (c) 2014 Couchbase, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
  },
  {
    "path": "analysis/lang/hi/stop_words_hi.go",
    "chars": 2223,
    "preview": "package hi\n\nimport (\n\t\"github.com/blevesearch/bleve/v2/analysis\"\n\t\"github.com/blevesearch/bleve/v2/registry\"\n)\n\nconst St"
  },
  {
    "path": "analysis/lang/hr/analyzer_hr.go",
    "chars": 1864,
    "preview": "//  Copyright (c) 2020 Couchbase, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
  },
  {
    "path": "analysis/lang/hr/analyzer_hr_test.go",
    "chars": 2206,
    "preview": "//  Copyright (c) 2020 Couchbase, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
  },
  {
    "path": "analysis/lang/hr/stemmer_hr.go",
    "chars": 8989,
    "preview": "//  Copyright (c) 2020 Couchbase, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
  },
  {
    "path": "analysis/lang/hr/stop_filter_hr.go",
    "chars": 1142,
    "preview": "//  Copyright (c) 2020 Couchbase, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
  },
  {
    "path": "analysis/lang/hr/stop_words_hr.go",
    "chars": 1499,
    "preview": "//  Copyright (c) 2020 Couchbase, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
  },
  {
    "path": "analysis/lang/hr/suffix_transformation_hr.go",
    "chars": 4429,
    "preview": "//  Copyright (c) 2020 Couchbase, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
  },
  {
    "path": "analysis/lang/hu/analyzer_hu.go",
    "chars": 1670,
    "preview": "//  Copyright (c) 2018 Couchbase, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
  },
  {
    "path": "analysis/lang/hu/analyzer_hu_test.go",
    "chars": 1753,
    "preview": "//  Copyright (c) 2018 Couchbase, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
  },
  {
    "path": "analysis/lang/hu/stemmer_hu.go",
    "chars": 1545,
    "preview": "//  Copyright (c) 2018 Couchbase, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
  },
  {
    "path": "analysis/lang/hu/stop_filter_hu.go",
    "chars": 1142,
    "preview": "//  Copyright (c) 2018 Couchbase, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
  },
  {
    "path": "analysis/lang/hu/stop_words_hu.go",
    "chars": 2267,
    "preview": "package hu\n\nimport (\n\t\"github.com/blevesearch/bleve/v2/analysis\"\n\t\"github.com/blevesearch/bleve/v2/registry\"\n)\n\nconst St"
  },
  {
    "path": "analysis/lang/hy/stop_filter_hy.go",
    "chars": 1142,
    "preview": "//  Copyright (c) 2014 Couchbase, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
  },
  {
    "path": "analysis/lang/hy/stop_words_hy.go",
    "chars": 855,
    "preview": "package hy\n\nimport (\n\t\"github.com/blevesearch/bleve/v2/analysis\"\n\t\"github.com/blevesearch/bleve/v2/registry\"\n)\n\nconst St"
  },
  {
    "path": "analysis/lang/id/stop_filter_id.go",
    "chars": 1142,
    "preview": "//  Copyright (c) 2014 Couchbase, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
  },
  {
    "path": "analysis/lang/id/stop_words_id.go",
    "chars": 3444,
    "preview": "package id\n\nimport (\n\t\"github.com/blevesearch/bleve/v2/analysis\"\n\t\"github.com/blevesearch/bleve/v2/registry\"\n)\n\nconst St"
  },
  {
    "path": "analysis/lang/in/indic_normalize.go",
    "chars": 1427,
    "preview": "//  Copyright (c) 2014 Couchbase, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
  },
  {
    "path": "analysis/lang/in/indic_normalize_test.go",
    "chars": 2850,
    "preview": "//  Copyright (c) 2014 Couchbase, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
  },
  {
    "path": "analysis/lang/in/scripts.go",
    "chars": 10232,
    "preview": "//  Copyright (c) 2014 Couchbase, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
  },
  {
    "path": "analysis/lang/it/analyzer_it.go",
    "chars": 1768,
    "preview": "//  Copyright (c) 2014 Couchbase, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
  },
  {
    "path": "analysis/lang/it/analyzer_it_test.go",
    "chars": 2206,
    "preview": "//  Copyright (c) 2014 Couchbase, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
  },
  {
    "path": "analysis/lang/it/articles_it.go",
    "chars": 699,
    "preview": "package it\n\nimport (\n\t\"github.com/blevesearch/bleve/v2/analysis\"\n\t\"github.com/blevesearch/bleve/v2/registry\"\n)\n\nconst Ar"
  },
  {
    "path": "analysis/lang/it/elision_it.go",
    "chars": 1255,
    "preview": "//  Copyright (c) 2014 Couchbase, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
  },
  {
    "path": "analysis/lang/it/elision_it_test.go",
    "chars": 1392,
    "preview": "//  Copyright (c) 2014 Couchbase, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
  },
  {
    "path": "analysis/lang/it/light_stemmer_it.go",
    "chars": 2468,
    "preview": "//  Copyright (c) 2015 Couchbase, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
  },
  {
    "path": "analysis/lang/it/light_stemmer_it_test.go",
    "chars": 1585,
    "preview": "//  Copyright (c) 2015 Couchbase, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
  },
  {
    "path": "analysis/lang/it/stemmer_it_snowball.go",
    "chars": 1525,
    "preview": "//  Copyright (c) 2020 Couchbase, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
  },
  {
    "path": "analysis/lang/it/stemmer_it_snowball_test.go",
    "chars": 1789,
    "preview": "//  Copyright (c) 2020 Couchbase, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
  },
  {
    "path": "analysis/lang/it/stop_filter_it.go",
    "chars": 1142,
    "preview": "//  Copyright (c) 2014 Couchbase, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
  },
  {
    "path": "analysis/lang/it/stop_words_it.go",
    "chars": 5567,
    "preview": "package it\n\nimport (\n\t\"github.com/blevesearch/bleve/v2/analysis\"\n\t\"github.com/blevesearch/bleve/v2/registry\"\n)\n\nconst St"
  },
  {
    "path": "analysis/lang/nl/analyzer_nl.go",
    "chars": 1670,
    "preview": "//  Copyright (c) 2018 Couchbase, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
  },
  {
    "path": "analysis/lang/nl/analyzer_nl_test.go",
    "chars": 1743,
    "preview": "//  Copyright (c) 2018 Couchbase, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
  },
  {
    "path": "analysis/lang/nl/stemmer_nl.go",
    "chars": 1505,
    "preview": "//  Copyright (c) 2018 Couchbase, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
  },
  {
    "path": "analysis/lang/nl/stop_filter_nl.go",
    "chars": 1142,
    "preview": "//  Copyright (c) 2018 Couchbase, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
  },
  {
    "path": "analysis/lang/nl/stop_words_nl.go",
    "chars": 5263,
    "preview": "package nl\n\nimport (\n\t\"github.com/blevesearch/bleve/v2/analysis\"\n\t\"github.com/blevesearch/bleve/v2/registry\"\n)\n\nconst St"
  },
  {
    "path": "analysis/lang/no/analyzer_no.go",
    "chars": 1670,
    "preview": "//  Copyright (c) 2018 Couchbase, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
  },
  {
    "path": "analysis/lang/no/analyzer_no_test.go",
    "chars": 1769,
    "preview": "//  Copyright (c) 2018 Couchbase, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
  },
  {
    "path": "analysis/lang/no/stemmer_no.go",
    "chars": 1545,
    "preview": "//  Copyright (c) 2018 Couchbase, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
  },
  {
    "path": "analysis/lang/no/stop_filter_no.go",
    "chars": 1142,
    "preview": "//  Copyright (c) 2018 Couchbase, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
  },
  {
    "path": "analysis/lang/no/stop_words_no.go",
    "chars": 5513,
    "preview": "package no\n\nimport (\n\t\"github.com/blevesearch/bleve/v2/analysis\"\n\t\"github.com/blevesearch/bleve/v2/registry\"\n)\n\nconst St"
  },
  {
    "path": "analysis/lang/pl/analyzer_pl.go",
    "chars": 1656,
    "preview": "//  Copyright (c) 2018 Couchbase, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
  },
  {
    "path": "analysis/lang/pl/analyzer_pl_test.go",
    "chars": 3477,
    "preview": "//  Copyright (c) 2018 Couchbase, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
  },
  {
    "path": "analysis/lang/pl/stemmer_pl.go",
    "chars": 1634,
    "preview": "//  Copyright (c) 2018 Couchbase, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
  },
  {
    "path": "analysis/lang/pl/stemmer_pl_test.go",
    "chars": 1594,
    "preview": "//  Copyright (c) 2018 Couchbase, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
  },
  {
    "path": "analysis/lang/pl/stempel/LICENSE",
    "chars": 11357,
    "preview": "\n                                 Apache License\n                           Version 2.0, January 2004\n                  "
  },
  {
    "path": "analysis/lang/pl/stempel/cell.go",
    "chars": 1331,
    "preview": "//  Copyright (c) 2018 Couchbase, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
  },
  {
    "path": "analysis/lang/pl/stempel/diff.go",
    "chars": 1539,
    "preview": "//  Copyright (c) 2018 Couchbase, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
  },
  {
    "path": "analysis/lang/pl/stempel/diff_test.go",
    "chars": 3756,
    "preview": "//  Copyright (c) 2018 Couchbase, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
  },
  {
    "path": "analysis/lang/pl/stempel/file.go",
    "chars": 1650,
    "preview": "//  Copyright (c) 2018 Couchbase, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
  },
  {
    "path": "analysis/lang/pl/stempel/file_test.go",
    "chars": 2033,
    "preview": "//  Copyright (c) 2018 Couchbase, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
  },
  {
    "path": "analysis/lang/pl/stempel/fuzz.go",
    "chars": 919,
    "preview": "//  Copyright (c) 2018 Couchbase, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
  },
  {
    "path": "analysis/lang/pl/stempel/javadata/README.md",
    "chars": 68,
    "preview": "# javadata\n\nGo library to read data written with java.io.DataOutput\n"
  },
  {
    "path": "analysis/lang/pl/stempel/javadata/fuzz.go",
    "chars": 851,
    "preview": "//  Copyright (c) 2018 Couchbase, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
  },
  {
    "path": "analysis/lang/pl/stempel/javadata/input.go",
    "chars": 3453,
    "preview": "//  Copyright (c) 2018 Couchbase, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
  },
  {
    "path": "analysis/lang/pl/stempel/javadata/input_test.go",
    "chars": 4291,
    "preview": "//  Copyright (c) 2018 Couchbase, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
  },
  {
    "path": "analysis/lang/pl/stempel/multi_trie.go",
    "chars": 2933,
    "preview": "//  Copyright (c) 2018 Couchbase, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
  },
  {
    "path": "analysis/lang/pl/stempel/row.go",
    "chars": 1614,
    "preview": "//  Copyright (c) 2018 Couchbase, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
  },
  {
    "path": "analysis/lang/pl/stempel/strenum.go",
    "chars": 1016,
    "preview": "//  Copyright (c) 2018 Couchbase, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
  },
  {
    "path": "analysis/lang/pl/stempel/strenum_test.go",
    "chars": 1468,
    "preview": "//  Copyright (c) 2018 Couchbase, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
  },
  {
    "path": "analysis/lang/pl/stempel/trie.go",
    "chars": 2972,
    "preview": "//  Copyright (c) 2018 Couchbase, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may "
  }
]

// ... and 559 more files (download for full content)

About this extraction

This page contains the full source code of the blevesearch/bleve GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 759 files (4.5 MB), approximately 1.2M tokens, and a symbol index with 5003 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.

Copied to clipboard!