Mert Özen Her Satırda Daha İleri
SEO ve GEO Content SEO — #02

Keyword Research: Teknik Blog İçin Konu ve Sorgu Bulmak, Search Console'dan Keyword Planner'a

Mert Özen 14 Kas 2026 13 dk 2 görüntülenme
Keyword Research: Teknik Blog İçin Konu ve Sorgu Bulmak, Search Console'dan Keyword Planner'a

Teknik bir blog için en güvenilir keyword kaynağı kendi Search Console verindir; autocomplete, Google Trends ve Keyword Planner ise ifade, karşılaştırma ve tahmin verir, gerçek hacim değil. Her kaynağın sınırlarını, Türk geliştiricilerin İngilizce jargon ve hata mesajıyla arama alışkanlığını ve bulk export verisinden .NET 10 ile TR/EN keyword map çıkarmayı gösteriyoruz.

Sürüm notu: Bu yazıdaki kodlar .NET 10 ile derlenip denenmiştir; Search Console, Google Trends ve Keyword Planner anlatımı bu araçların Kasım 2026 hâlini esas alır.

Önce Tahmin Et

Bookstore blog'unun Search Console verisinde iki satır dikkatini çekiyor. "dependency injection" sorgusu son üç ayda 1.180 impression almış ama ortalama sırası 12,7 ve tıklama az. "cs8618" sorgusu 900 impression almış, sırası 2,1 ve tıklamaların büyük kısmı bu yazıya gidiyor. Bir ekip arkadaşın Keyword Planner'a bakıp "dependency injection aylık binlerce aranıyor, cs8618 neredeyse hiç; yeni yazıyı dependency injection için yazalım" diyor. Bu kararı vermek için elindeki veri yeterli mi? Keyword Planner'daki hacim kimin aramasını sayıyor, Türkçe mi İngilizce mi? Ve 900 impression alan bir hata kodu, "neredeyse hiç aranmayan" bir sorgu olabilir mi?

Seed Konudan Sorgu Ailesine

SEO (arama motorları için yapılan optimizasyon çalışması) işinde keyword research, okurun bir konuyu hangi kelimelerle aradığını bulma adımı. Başlangıç noktası tek bir kelime değil, bir seed konu (çekirdek konu), örneğin Entity Framework Core (EF Core) için "EF Core migration". Bu konunun etrafında, farklı niyetlerle yazılmış bir sorgu ailesi var: "ef core migration nedir", "ef core migration nasıl yapılır", "dotnet ef migrations add", "ef core migration geri alma", "remove-migration hatası". Ailedeki her sorgu aynı yazıya mı, yoksa ayrı yazılara mı gitmeli? Bu sorunun cevabı serinin üçüncü ve dördüncü yazısının konusu; bu yazıda önce aileyi çıkarmayı ve her kaynağın ne kadar güvenilir olduğunu öğreniyoruz.

Google'ın SEO Starter Guide'ı bu konuda gerçekçi bir çerçeve çiziyor: insanlar bir konuyu, o konuya ne kadar hâkim olduklarına göre farklı kelimelerle arar; bu farklılıkları düşünmek işe yarar, ama her olası ifadeyi tek tek karşılamak gerekmez, çünkü Google'ın dil eşleştirmesi sayfayı birebir aynı kelimeleri içermeyen sorgularla da ilişkilendirebilir. Yani hedef, keyword listesi doldurmak değil; okurun gerçekte sorduğu soruları görmek.

Kaynak 1: Kendi Search Console Verin

Teknik bir blog için en güvenilir kaynak, Google'ın senin siten için verdiği gerçek veri: Search Console Performance raporu. Burada tahmin yok; sayfaların hangi sorgularda kaç kez gösterildiği (impression), kaç kez tıklandığı (click), CTR (tıklama oranı; tıklamanın impression'a oranı) ve ortalama sıran (average position) var. Raporu SEO Temelleri serisinin Search Console yazısında tanıttık; burada keyword kararı için gereken kısmına bakıyoruz.

Bu verinin sınırlarını bilmek, yanlış karar vermemenin ilk şartı:

  • Yalnız göründüğün sorgular var. Hiç yazmadığın bir konunun sorgusu burada çıkmaz; Search Console mevcut içeriği geliştirmek için güçlü, yeni konu bulmak için zayıf.
  • Anonimleştirilmiş sorgular tabloda yok. Google, iki-üç aylık bir dönemde birkaç düzineden fazla kullanıcının aramadığı sorguları gizlilik için tabloya koymuyor. Bu sorgular grafikteki toplamlara dahil, satırlara değil; bu yüzden tablo satırlarını toplayınca grafikteki sayıyı bulamazsın. Uzun ve nadir sorguların çok olduğu teknik blog'larda bu fark büyük olabilir.
  • Arayüz ve export 1.000 satırla sınırlı. Search Analytics API site, gün ve arama tipi başına 50.000 satıra kadar veri döndürüyor. Daha fazlası ve 16 aydan eski geçmiş için BigQuery'ye bulk export kurmak gerekiyor.
  • Sorgu ve sayfa birlikte. Arayüzde Queries ve Pages sekmeleri ayrı tablolar; "bu sorgu hangi sayfalara gidiyor?" sorusunu ancak filtreyle tek tek sorabilirsin. API'de ya da bulk export'taki searchdata_url_impression tablosunda sorgu ve URL aynı satırda.

Marka sorgularını ayırmak da önemli. Google Kasım 2025'te Search Console'a branded ve non-branded sorgu filtresini ekledi; Mart 2026'dan beri yeterli sorgu hacmi olan tüm sitelerde açık. Sınıflandırmayı regex değil, Google'ın AI destekli bir sistemi yapıyor, yani hatalı sınıflanan sorgular olabilir. "bookstore blog ef core" gibi seni zaten tanıyan birinin araması, yeni okur kazanıp kazanmadığını anlatmaz.

Arama kutusuna "ef core migration" yazdığında gelen öneriler (autocomplete), sonuç sayfasındaki "People also ask" kutusu ve sayfanın altındaki ilgili aramalar, okurun soruyu nasıl ifade ettiğini görmenin en hızlı yolu. Google'ın kendi açıklamasına göre autocomplete önerileri gerçek aramalardan geliyor; dil, konum ve trend ilgisi hesaba katılıyor, oturum açmış kullanıcıda geçmiş aramalar da etkili olabiliyor. Ama Google bunun bir hacim göstergesi olmadığını açıkça söylüyor: autocomplete en sık yapılan aramaları sıralamıyor ve Google Trends ile karşılaştırılmamalı.

Bu kaynakları soru cümlelerini toplamak için kullan: "ef core migration geri alma", "migration'ı veritabanından nasıl silerim", "remove-migration neden çalışmıyor" gibi ifadeler, yazının başlıklarına ve sık sorulan sorularına doğrudan malzeme. Sonuçlar kişiselleştirilebildiği için kontrolü gizli pencerede ve hedef dilde yap.

Google Trends mutlak arama sayısı vermiyor. Her veri noktasını o yer ve zamandaki toplam arama hacmine göre normalize ediyor, sonra seçtiğin aralıktaki en yüksek noktayı 100 kabul eden bir ölçeğe çeviriyor; ayrıca tüm aramaların bir örneklemi üzerinde çalışıyor. Hacmi düşük terimler 0 görünebiliyor ve düşük ilgili sorgulardaki küçük sıçramalar istatistiksel gürültü olabiliyor.

Bu yüzden Trends'in teknik blog için en iyi kullanımı karşılaştırma: aynı zaman aralığında, aynı bölgede iki ifadeyi yan yana koymak. Bölgeyi Türkiye seçip "dependency injection nedir" ile "what is dependency injection" ifadelerini karşılaştırmak, Türkiye'deki geliştiricilerin bu konuyu hangi dilde aradığına dair bir fikir verir. Mevsimsellik ve yükselen konular da burada görünür; yeni bir .NET sürümü çıktığında sürüm adıyla yapılan aramaların ne zaman yükseldiği gibi. Ama Trends'teki 100, "çok aranıyor" demek değil, "bu karşılaştırmadaki en yüksek nokta" demek.

Kaynak 4: Keyword Planner ve Üçüncü Taraf Araçlar

Keyword Planner bir Google Ads aracı ve reklamveren için tasarlanmış. Kullanmak için bir Google Ads hesabı açıp faturalandırma kurulumunu tamamlaman gerekiyor. Verdiği "average monthly searches" bir tahmin; harcaması düşük hesaplarda bu sayı çoğu zaman kesin değer yerine "1K–10K" gibi bir aralık olarak görünüyor ve Google eşiği açıklamıyor. "Competition" sütunu da organik sıralamadaki rekabeti değil, o kelimeye reklam verenlerin yoğunluğunu anlatıyor.

Bu sınırlar Bookstore'daki tartışmayı açıklıyor. "dependency injection" yüksek hacimli ama dünya genelinde ve çoğunlukla İngilizce aranan, birçok güçlü dokümanla yarışan bir genel terim. "cs8618" ise reklamverenin ilgilenmediği, Planner'ın düşük ya da aralık olarak gösterdiği, ama bir geliştiricinin derleyici uyarısıyla karşılaştığı anda tam olarak bu kodu yazdığı bir sorgu. Search Console'daki 900 impression, Planner'ın tahmininden daha güvenilir bir sinyal.

Üçüncü taraf SEO araçlarının hacim ve "keyword difficulty" değerleri de tahmin. Google'ın Haziran 2026'da yayımladığı üçüncü taraf araç ve hizmet rehberi bunu açıkça yazıyor: bu araçların Google'ın iç ranking verisine erişimi yok, gösterdikleri kendi tahminleri. Google'dan doğrudan veri için önerilen yer Search Console.

Türkçe Teknik İçeriğin Gerçeği

Türkçe yazan bir teknik blog'un keyword research'ünü İngilizce bir rehberden kopyalayamazsın, çünkü Türk geliştiricilerin arama alışkanlığı karışık:

Jargon İngilizce kalıyor. Okur "bağımlılık enjeksiyonu nedir" yerine "dependency injection nedir" yazıyor. Sorgunun konusu İngilizce, soru eki Türkçe. Hatta çoğu zaman yalnız "dependency injection" yazıyor; bu sorgunun dili belli değil.

Hata mesajı aynen yapıştırılıyor. Derleyici ya da runtime mesajı İngilizce olduğu için Türk okur da İngilizce sorgu yapıyor: "non-nullable property must contain a non-null value when exiting constructor". Bu sorgular uzun, nadir ve çok net bir niyet taşıyor; doğru sayfaya geldiklerinde tıklama oranları yüksek.

TR ve EN sürüm ayrı keyword haritası istiyor. mertozen.com'da her yazının bir TR ve bir EN sürümü var; ama EN sürümün hedef sorguları TR'nin çevirisi değil. TR sayfa "ef core migration nasıl yapılır" için yarışırken EN sayfa "ef core migrations" gibi küresel ve çok daha rekabetçi bir sorguda yarışıyor. Bu yüzden haritayı dil başına ayrı tutmak gerekiyor.

Keyword Map'i Kodla Çıkarmak

Elle tablo tutmak yerine, sorgu ve URL'yi birlikte veren bir export'tan keyword map'i üreten küçük bir konsol uygulaması yazalım. Girdi, bulk export'taki searchdata_url_impression tablosunun URL ve sorgu bazında toplanmış hâli. Aşağıdaki satırlar Bookstore blog'u için hazırlanmış örnek bir export; gerçek bir sitenin rakamları değil, yöntemi göstermek için.

url,query,impressions,clicks,sum_position
/blog/ef-core-migration-rehberi,ef core migration,420,31,2184
/blog/ef-core-migration-rehberi,ef core migration nasıl yapılır,310,38,961
/blog/ef-core-migration-rehberi,ef core add-migration,150,9,1110
/blog/ef-core-migration-rehberi,ef core migration geri alma,260,7,2288
/blog/ef-core-migration-geri-alma,ef core migration geri alma,240,12,1560

sum_position sıfır tabanlı sıraların toplamı; ortalama sırayı Google'ın bulk export dokümanındaki formülle hesaplıyoruz: toplamı impression'a böl, 1 ekle.

namespace Bookstore.ContentSeo;

// Search Console bulk export'undaki searchdata_url_impression tablosunun url + query bazında toplanmış hâli
public sealed record SearchRow(string Url, string Query, int Impressions, int Clicks, long SumPosition)
{
    // sum_position 0 tabanlı; ortalama sıra = toplam / impression + 1
    public double AvgPosition => (double)SumPosition / Impressions + 1;

    public static SearchRow Parse(string line)
    {
        string[] f = line.Split(',');
        return new SearchRow(f[0], f[1], int.Parse(f[2]), int.Parse(f[3]), long.Parse(f[4]));
    }
}

Sorgunun dilini anlamak için basit bir kural yeterli: Türkçe karakter ya da Türkçe soru kelimesi varsa TR, İngilizce soru kelimesi varsa EN, yalnız jargon varsa "neutral". Türkçe kelime listesi Türkçe karakter içermiyor; çünkü okurların bir kısmı "nasil yapilir" diye Türkçe karakter kullanmadan arıyor.

namespace Bookstore.ContentSeo;

public static class QueryLanguage
{
    private static readonly string[] TurkishWords =
        ["nedir", "nasil", "yapilir", "hatasi", "uyarisi", "farki", "geri", "alma", "yenilikleri", "toplu", "mi", "mu", "duzeltilir"];
    private static readonly string[] EnglishWords =
        ["what", "is", "how", "to", "new", "features", "must", "when", "bulk", "fix", "error"];

    // "tr", "en" ya da yalnız jargon içeren sorgular için "neutral"
    public static string Detect(string query)
    {
        if (query.Any(c => "çğıöşü".Contains(c)))
        {
            return "tr";
        }
        string[] tokens = query.Split(' ');
        if (tokens.Any(TurkishWords.Contains))
        {
            return "tr";
        }
        return tokens.Any(EnglishWords.Contains) ? "en" : "neutral";
    }

    public static bool Mismatch(string lang, string url) =>
        (lang == "tr" && url.StartsWith("/en/")) || (lang == "en" && !url.StartsWith("/en/"));
}

Ana program sorguları seed konulara göre ailelere ayırıyor, her sorgu için toplam impression'ı ve en çok impression alan URL'yi buluyor, dil ile URL dili uyuşmuyorsa ve sorgu birden çok URL'ye gidiyorsa işaret koyuyor.

using System.Globalization;
using Bookstore.ContentSeo;

CultureInfo.CurrentCulture = CultureInfo.InvariantCulture;

string path = args.Length > 0 ? args[0] : "gsc-url-query.csv";
List<SearchRow> rows = [.. (await File.ReadAllLinesAsync(path)).Skip(1).Select(SearchRow.Parse)];

// Seed konu -> o aileye ait sorguları yakalayan terimler (ilk eşleşen kazanır)
(string Family, string[] Terms)[] families =
[
    ("ef-core-migration", ["migration"]),
    ("dependency-injection", ["dependency injection", "addscoped", "scoped singleton"]),
    ("nullable-cs8618", ["cs8618", "non-nullable"]),
    ("ef-core-dapper", ["dapper"]),
    ("ef-core-10", ["ef core 10"]),
];

string FamilyOf(string query) =>
    families.FirstOrDefault(f => f.Terms.Any(query.Contains)).Family ?? "(unassigned)";

List<KeywordRow> map = [.. rows
    .GroupBy(r => r.Query)
    .Select(g => new KeywordRow(
        FamilyOf(g.Key), g.Key, QueryLanguage.Detect(g.Key),
        g.Sum(r => r.Impressions), g.Sum(r => r.Clicks),
        Top: g.MaxBy(r => r.Impressions)!, Urls: g.Count()))
    .OrderBy(x => x.Family).ThenBy(x => x.Lang).ThenByDescending(x => x.Impressions)];

Console.WriteLine($"{"family",-21}{"lang",-8}{"query",-38}{"impr",6}{"pos",6}  target url");
foreach (KeywordRow m in map)
{
    string query = m.Query.Length > 36 ? m.Query[..33] + "..." : m.Query;
    string flags = (m.Urls > 1 ? $" [{m.Urls} urls]" : "")
        + (QueryLanguage.Mismatch(m.Lang, m.Top.Url) ? " [lang mismatch]" : "");
    Console.WriteLine($"{m.Family,-21}{m.Lang,-8}{query,-38}{m.Impressions,6}{m.Top.AvgPosition,6:F1}  {m.Top.Url}{flags}");
}

List<KeywordRow> longTail = [.. map.Where(m => m.Query.Split(' ').Length >= 4)];
Console.WriteLine($"\nqueries: {map.Count}, long-tail (4+ words): {longTail.Count}, " +
    $"long-tail share of clicks: {longTail.Sum(m => m.Clicks) * 100.0 / map.Sum(m => m.Clicks):F0}%");

record KeywordRow(string Family, string Query, string Lang, int Impressions, int Clicks, SearchRow Top, int Urls);

dotnet run çıktısı:

family               lang    query                                   impr   pos  target url
(unassigned)         neutral bookstore blog ef core                    12   1.0  /blog/ef-core-migration-rehberi
dependency-injection en      what is dependency injection             450  17.9  /en/blog/what-is-dependency-injection
dependency-injection neutral dependency injection                    1180  12.7  /blog/dependency-injection-nedir [2 urls]
dependency-injection neutral addscoped vs addsingleton                310   8.8  /blog/aspnet-core-di-lifetime
dependency-injection neutral dependency injection lifetime            300  10.4  /blog/dependency-injection-nedir [2 urls]
dependency-injection tr      dependency injection nedir               520   3.3  /blog/dependency-injection-nedir
dependency-injection tr      scoped singleton transient farkı         230   2.9  /blog/aspnet-core-di-lifetime
ef-core-10           en      ef core 10 new features                   95  21.0  /blog/ef-core-10-yenilikleri [lang mismatch]
ef-core-10           tr      ef core 10 yenilikleri                   180   2.4  /blog/ef-core-10-yenilikleri
ef-core-dapper       en      dapper bulk insert                       200  13.2  /blog/dapper-ile-toplu-insert [lang mismatch]
ef-core-dapper       neutral ef core vs dapper                        340   6.7  /blog/ef-core-vs-dapper
ef-core-dapper       tr      dapper mı ef core mu                     110   2.8  /blog/ef-core-vs-dapper
ef-core-dapper       tr      dapper toplu insert                       45   1.9  /blog/dapper-ile-toplu-insert
ef-core-migration    neutral ef core migration                       1060  14.6  /en/blog/ef-core-migrations-guide [2 urls]
ef-core-migration    neutral ef core migrations                       980  11.3  /en/blog/ef-core-migrations-guide
ef-core-migration    neutral dotnet ef migrations add                 280   9.1  /en/blog/ef-core-migrations-guide [2 urls]
ef-core-migration    neutral ef core add-migration                    150   8.4  /blog/ef-core-migration-rehberi
ef-core-migration    tr      ef core migration geri alma              500   9.8  /blog/ef-core-migration-rehberi [2 urls]
ef-core-migration    tr      ef core migration nasıl yapılır          310   4.1  /blog/ef-core-migration-rehberi
ef-core-migration    tr      ef core migration nedir                  130   5.0  /blog/ef-core-migration-rehberi
ef-core-migration    tr      remove-migration hatası                   90   3.2  /blog/ef-core-migration-geri-alma
nullable-cs8618      en      non-nullable property must contai...     370   1.6  /blog/cs8618-nullable-uyarisi [lang mismatch]
nullable-cs8618      neutral cs8618                                   900   2.1  /blog/cs8618-nullable-uyarisi [2 urls]
nullable-cs8618      tr      cs8618 uyarısı nasıl düzeltilir           60   1.4  /blog/cs8618-nullable-uyarisi

queries: 24, long-tail (4+ words): 13, long-tail share of clicks: 48%

Çıktıyı okumak

Satırların yarıdan fazlası iki türden: TR soru ekli sorgular ve dili belirsiz jargon sorguları. Dili "neutral" olan "ef core migration" sorgusunda en çok impression'ı EN sayfa alıyor ve sırası 14,6; aynı sorguda TR sayfa da görünüyor. Bu bir çakışma değil, iki dil sürümü; ama TR okur için TR sayfanın neden geride kaldığına bakmaya değer.

Üç satırda [lang mismatch] var ve hepsi farklı bir hikâye anlatıyor. "ef core 10 new features" TR sayfaya 21. sırada geliyor: EN okur bu konuda bir sayfa arıyor ama EN sürüm yok, yani eksik içerik. "dapper bulk insert" de benzer. "non-nullable property must contain..." ise TR sayfaya 1,6 sırasıyla geliyor; bu, hata mesajını İngilizce yapıştıran Türk okur. Burada sorun yok, tersine TR sayfa bu sorgunun doğru cevabı; bunu doğrulamak için Search Console'da sorguya country boyutuyla bakmak yeterli.

İki satırda [2 urls] aynı dilde iki sayfayı gösteriyor: "ef core migration geri alma" ve "dependency injection lifetime". Bunlar serinin dördüncü yazısındaki cannibalization adayları.

Son satır long-tail'in değerini gösteriyor: dört ve daha fazla kelimelik sorgular sorguların yarısından fazlası ve tıklamaların %48'i. Hata mesajları ve "nasıl yapılır" soruları tek tek küçük, ama toplamda blog'un trafiğinin büyük kısmı.

Bu çıktıdan elle çıkardığımız harita, her aile için hangi sayfanın hangi dilde hedef olduğunu ve bir sonraki adımı gösteriyor:

Sorgu ailesiNiyetTR hedefEN hedefSonraki adım
ef core migrationTanım ve adım adım/blog/ef-core-migration-rehberi/en/blog/ef-core-migrations-guideGeri alma sorgusunun sahibini seç
ef core 10Sürüm yenilikleri/blog/ef-core-10-yenilikleriYokEN sürümü yaz
dependency injectionTanım/blog/dependency-injection-nedir/en/blog/what-is-dependency-injectionEN sayfanın 17,9'luk sırasına bak
cs8618Hata çözümü/blog/cs8618-nullable-uyarisi/en/blog/cs8618-non-nullable-property-warningKoru; benzer uyarılar için yeni yazılar
dapperKarşılaştırma ve adım adım/blog/ef-core-vs-dapper, /blog/dapper-ile-toplu-insertYokEN toplu insert yazısını değerlendir

Başlangıçtaki soruya dönersek: veriye göre Bookstore'un bir sonraki yazısı genel bir "dependency injection" yazısı değil. cs8618 sayfası, okurun hata mesajıyla geldiği ve sayfanın cevap verdiği bir sorguda 2. sırada; aynı türden başka uyarılar (CS8602, CS8604 gibi) için yazılar, kanıtı olan bir yön.

Üretimde Dikkat

Veriyi düzenli çek. Arayüzden ayda bir 1.000 satır indirmek, uzun sorgu kuyruğunu kaçırır. Search Analytics API ile günlük çekim ya da BigQuery bulk export, hem satır sınırını hem 16 aylık geçmiş sınırını aşmanın yolu. Bulk export'u bir kez kurduğunda bu yazıdaki girdi dosyasını tek bir SQL sorgusu üretir.

Anonimleştirilmiş sorguları hesaba kat. Bir sorgu filtresi uyguladığında anonimleştirilmiş sorgular hesaptan tamamen düşüyor; "EF Core ile ilgili sorgular toplam tıklamanın şu kadarı" gibi oranlar bu yüzden olduğundan düşük çıkar.

Seed listesini kod dışında tut. Bu örnekte aileler kodun içinde; gerçek kullanımda bir JSON dosyasında veya veritabanında tutmak, editörün yeni bir aileyi kod değiştirmeden eklemesini sağlar.

Ortalama sırayı tek başına okuma. Bir sayfanın birçok sorgudaki ortalama sırası, birbirinden çok farklı sorguların ortalaması; karar verirken sorgu bazında bak.

Sık Düşülen Tuzaklar

Hacme göre konu seçmek. Keyword Planner'ın en yüksek hacimli kelimesi, çoğu zaman en genel, en rekabetçi ve okurun niyeti en belirsiz olanı. Teknik blog için kanıtı olan yön, okurun gerçek problemi.

Aynı anahtar kelimeyi iki yazıya hedeflemek. Keyword map'te her sorgu ailesinin dil başına tek bir sahibi olmalı. Aksi hâlde iki sayfa aynı sorguda birbirinin önünü keser; çıktıdaki [2 urls] satırları bunun ilk işareti ve serinin dördüncü yazısının konusu.

Anahtar kelimeyi metne doldurmak. Keyword stuffing bir spam policy ihlali: sayfayı doğal olmayan biçimde aynı kelimelerle veya kelime gruplarıyla doldurmak. SEO Starter Guide da aynı kelimeyi aşırı tekrar etmenin okuru yorduğunu söylüyor. Keyword map'in amacı metne kelime eklemek değil, hangi soruya hangi sayfanın cevap vereceğine karar vermek.

Trends'teki 100'ü hacim sanmak. 100, karşılaştırmadaki en yüksek nokta; iki farklı karşılaştırmanın 100'ü aynı şey değil.

Küçük Bir Deneme

★☆☆ Kendi sitenin Search Console'unda Queries tablosunu 4 ve daha fazla kelimeli sorgulara filtrele (regex filtresiyle). Bunların kaçı bir hata mesajı veya "nasıl" sorusu?

★★☆ QueryLanguage'a "neutral" sorgular için URL dilini kullanan ikinci bir kural ekle ve sonucu country boyutuyla karşılaştır: Türkiye'den gelen "neutral" sorguların ne kadarı TR sayfaya gidiyor?

★★★ Search Analytics API'den query ve page boyutlarıyla son 90 günü sayfalayarak çeken ve bu yazıdaki girdi dosyası biçimini üreten bir job yaz. Seed listesini JSON dosyasından okusun.

Keyword map'te "Niyet" sütununu sezgiyle doldurduk. Bir sonraki yazıda bu sütunu sistematik hâle getiriyoruz: sorgunun arkasındaki search intent'i okumak, sonuç sayfasından ipucu çıkarmak ve buna göre doğru içerik formatını seçmek.