Elasticsearch’in span_near sorgusu, Elasticsearch sorgu DSL’inde (Domain Specific Language) yer alan, daha karmaşık ve hassas metin aramaları yapmayı sağlayan önemli bir araçtır. Bu sorgu, “span” sorgu ailesinin bir parçasıdır ve özellikle terimlerin yakınlığı veya sırası gibi özel durumlarla ilgilenmek için tasarlanmıştır.
span_near sorgusu, birbirine yakın olan metin bölümlerini (bunlara “span” denilir) eşleştirmek için tasarlanmıştır. “span” bir belgedeki metin bölümünü ifade eder. span_near sorgusu ise belirli span bölümlerin birbirine belirli bir mesafe içinde yer aldığı belgeleri bulmanızı sağlar. Bu sorgu özellikle terimlerin sırasının önemli olduğu ve terimlerin birbirine yakın geçtiği belgeleri bulmak istediğiniz durumlarda oldukça kullanışlıdır.
Burada sorguya dair detaylar verilmiş: https://www.elastic.co/docs/reference/query-languages/query-dsl/query-dsl-span-near-query
Bu sorguda diğer span türü sorguların bir listesinden ve “slop” adlı bir parametreden oluşur. Slop parametresi, span arasındaki izin verilen en büyük mesafeyi belirler. Diğer bir parametre olan “in_order” ise span ifadelerin belirtilen sırayla eşleşip eşleşmeyeceğini kontrol eder.

Bu ifadeleri daha iyi anlamak için örnekler vereceğim.
TMK 14. maddesine göre herkes fiil ehliyetine sahiptir
span_near Kullanımı
Bu cümlede “TMK” ile “maddesine” kelimeleri yakın geçiyor. Biz bu iki kelimenin birbirinden en fazla 3 kelime uzaklıkta geçtiği belgeleri bulmak istiyoruz ve sıranın önemli olmasını istiyoruz (“TMK” önce, “maddesine” sonra gelmeli).
{
"query": {
"span_near": {
"clauses": [
{ "span_term": { "text": "tmk" } },
{ "span_term": { "text": "maddesine" } }
],
"slop": 3,
"in_order": true
}
}
}
Bu sorguda:
- clauses: Aranacak kelimeleri (veya alt span sorgularını) listeler.
Burada “tmk” ve “maddesine” kelimelerini verdik. - slop: Aralarında en fazla 3 kelime olabilir.
(örneğin “TMK 14. maddesine” veya “TMK’nin 14. maddesine” gibi) - in_order: “tmk” kelimesi “maddesine” kelimesinden önce gelmeli.

Kullanım Alanları
span_near sorgusunun en yaygın kullanım alanlarından biri, tam metin arama (full-text search) uygulamalarıdır. Hukuki metinler (karar veya mevzuat gibi), akademik çalışmalar (doktora tezleri gibi) gibi alanlarda da sıkça kullanılır. Çünkü bu tür uygulamalarda terimlerin birbirine yakınlığı, belgenin ilgili bulunma düzeyini ciddi şekilde etkileyebilir.
Örneğin bir hukuk dokümanında “sözleşme” ve “ihlal” kelimelerinin birbirine yakın geçtiği belgeler, bu terimlerin birbirinden çok uzak geçtiği belgelere kıyasla daha alakalı kabul edilebilir. Dolayısıyla arama skoru da yükselir.
Bir diğer kullanım alanı ise doğal dil işleme (NLP) uygulamalarıdır. span_near sorgusu, belirli ifade kalıplarının veya kelime kombinasyonlarının geçtiği belgeleri bulmak için kullanılabilir. Bu özellikle duygu analizi (sentiment analysis) çalışmalarında oldukça faydalı çünkü bazı kelimelerin yakınlığı bir cümlenin duygu tonunu tamamen değiştirebilir.
Geçmişte X üzerinde seyahat firmaları hakkında olumlu veya olumsuz yapılan tüm verileri çektirmiştim ve yazılan ifadelerde memnuniyet mi yoksa şikayet mi belirtildiği konusunda çalışmalar yapmıştım. Binlerce veri içinde oldukça performanslı şekilde span_near kullanarak duygu analizleri yaptırdık. Sonuç oldukça iyiydi.
span_near sorgusu oldukça kullanışlı olsa da özellikle çok büyük metinlerde çalışırken kaynak tüketimi yüksek olabilir. Çünkü Elasticsearch kaynak oluştukça tüketmesini sever.
Performansı artırmak için mutlaka bunları uygulayın:
— Slop değeri ne kadar büyük olursa, Elasticsearch eşleşen span kayıtlarını bulmak için harcayacağı işlem gücü o kadar artar. Mümkünse bu değeri olabildiğince küçük tutun.
— Filtreler kullanın. Sorgunun etki alanını daraltabiliyorsanız (örneğin belirli bir kategori veya tarih aralığıyla) bunu filtrelerle yapın. Belge sayısı azalmış olur.
— “in_order” parametresini akıllıca kullanın. Eğer kelimelerin sırası önemli değilse false olarak ayarlayın. Bu durumda terimlerin sırası kontrol edilmez ve performans artar.
Çakışmaları Engelleyin
Birden çok “span” türü kullanıyorsanız çakışmamasına dikkat edin. Çakışma (overlap), iki veya daha fazla span’ın aynı metin bölgesini kapsaması demektir. Bu durumda Elasticsearch aynı metin parçasını birden fazla kez değerlendirir.
Örnek sorgu:
{
"span_near": {
"clauses": [
{ "span_term": { "text": "sözleşme" } },
{ "span_term": { "text": "ihlali" } },
{ "span_or": {
"clauses": [
{ "span_term": { "text": "durumunda" } },
{ "span_term": { "text": "halinde" } }
]
}
}
],
"slop": 3,
"in_order": true
}
}
Burada “span_or” ifadesi “durumunda” ve “halinde” kelimelerini aynı pozisyonda eşleştirebilir. Eğer belgede her iki kelime geçiyorsa aynı pozisyonlar iki kez işlenir. Buna çakışma denilir.
Aynı kelime veya aynı aralığı hedefleyen span sorgularını tekrar etmeyin. span_or veya span_near kullanıyorsanız, her alt sorgunun farklı metin bölgesini hedeflediğinden emin olun. Gerekiyorsa span_not kullanarak belirli eşleşmeleri hariç tutun.
Doğru sorgu:
{
"span_near": {
"clauses": [
{ "span_term": { "text": "sözleşme" } },
{ "span_term": { "text": "ihlali" } }
],
"slop": 2,
"in_order": true
}
}
Analyzer Farkı
Elasticsearch’te analyzer, metni indekse eklerken ve aramada parçalayarak işler.
Analyzer kelimeleri küçük harfe çevirir, noktalama işaretlerini kaldırır, bazen köklerine (lemma/stem) indirger. Yani aramaların başarısı büyük ölçüde analyzer türüne bağlıdır.
Verdiğimiz örnekte “maddesine” gibi bir kelime kullandık. Türkçe gibi eklemeli dillerde, aynı kelime çok farklı biçimlerde geçebilir:
- madde
- maddenin
- maddesine
- maddesiyle
Hepsi aynı kökten gelir: madde.
Document mapping kısmında aranacak alanda “analyzer” kısmını “turkish” yaparsanız Elasticsearch bunların hepsini tek kök forma (madde) indirger. Dolayısıyla sadece “madde” diye aradığında hepsi eşleşir.
Umarım yardımcı olmuştur.
Yorum bırakın