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.
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.