EElasticsearch Handbook

ORTA

Analyzer & Tokenization

Analyzer, text field'ların nasıl indexleneceğini belirler. Üç aşamadan oluşur: Character Filter → Tokenizer → Token Filter.

Kod örneği tercihiBu sayfadaki istemci örneklerini birlikte değiştirir.
Input Text "Türkiye'nin En" Char Filter html_strip mapping pattern_replace Tokenizer standard var(--svg-text)space ngram / edge_ngram Token Filter lowercase stemmer (turkish) stop, synonym Tokens ["türkiye","en"] _analyze API ile test: POST _analyze {"analyzer":"turkish_custom","text":"..."}

Türkçe Analyzer Yapılandırması

# Türkçe analyzer test
curl -X POST "http://localhost:9200/_analyze" -H "Content-Type: application/json" -d'
{
  "tokenizer": "standard",
  "filter": ["lowercase", "turkish_stop", "turkish_stemmer"],
  "text": "Türkiye'''nin en güzel şehirlerinden İstanbul'''a gidiyorum"
}'

# Custom analyzer: autocomplete (edge_ngram)
curl -X PUT "http://localhost:9200/products_v2" -H "Content-Type: application/json" -d'
{
  "settings": {
    "analysis": {
      "analyzer": {
        "autocomplete_index": {
          "type": "custom",
          "tokenizer": "autocomplete_tokenizer",
          "filter": ["lowercase", "turkish_stemmer"]
        },
        "autocomplete_search": {
          "type": "custom",
          "tokenizer": "standard",
          "filter": ["lowercase"]
        }
      },
      "tokenizer": {
        "autocomplete_tokenizer": {
          "type": "edge_ngram",
          "min_gram": 2,
          "max_gram": 15,
          "token_chars": ["letter", "digit"]
        }
      },
      "filter": {
        "turkish_stemmer": { "type": "stemmer", "language": "turkish" },
        "turkish_stop": { "type": "stop", "stopwords": "_turkish_" }
      }
    }
  },
  "mappings": {
    "properties": {
      "name": {
        "type": "text",
        "analyzer": "autocomplete_index",
        "search_analyzer": "autocomplete_search"
      }
    }
  }
}'
// Autocomplete index with edge_ngram
public async Task CreateAutocompleteIndexAsync()
{
    await _client.Indices.CreateAsync("products_v2", c => c
        .Settings(s => s
            .Analysis(a => a
                .Analyzers(an => an
                    .Custom("autocomplete_index", ca => ca
                        .Tokenizer("autocomplete_tokenizer")
                        .Filter("lowercase", "turkish_stemmer"))
                    .Custom("autocomplete_search", ca => ca
                        .Tokenizer("standard")
                        .Filter("lowercase")))
                .Tokenizers(t => t
                    .EdgeNGram("autocomplete_tokenizer", e => e
                        .MinGram(2)
                        .MaxGram(15)
                        .TokenChars(TokenChar.Letter, TokenChar.Digit)))
                .TokenFilters(tf => tf
                    .Stemmer("turkish_stemmer", st => st.Language("turkish"))
                    .Stop("turkish_stop", st => st.Stopwords("_turkish_")))))
        .Mappings(m => m
            .Properties<Product>(p => p
                .Text(t => t.Name, t => t
                    .Analyzer("autocomplete_index")
                    .SearchAnalyzer("autocomplete_search")))));
}

Örnek: Arama kutusu autocomplete: kullanıcı "nik" yazar → edge_ngram tokenizer sayesinde "Nike Air Max", "Nike Dunk", "Nikecourt" önerileri gelir. Index time'da edge_ngram, search time'da standard analyzer — bu sayede hem prefix match hem de tam kelime araması çalışır.

search_analyzer ayrı tanımlayın! Eğer edge_ngram analyzer'ı hem index hem search'te kullanırsanız, "ayakkabı" araması "ay", "aya", "ayak"... tüm ngram'larla eşleşir ve irrelevant sonuçlar döner.