feltartaktak.hu · mérési réteg

Hogyan mérünk

Ez a szabálykönyv nyilvános, mert olyat nem naplózunk, aminek a szabályát ne mernénk kitenni ide. Lejjebb ott van a teljes naplósor, amit egy látogatásból megtartunk, és a besoroló forráskódja — ugyanaz, ami a szerveren fut.

Frissítve: 2026. november 9. Build: HogyanMerunk b1 Forrás: kereses_besorolo.py · 242 sor
01

A rövid válasz

A keresőbe beírt szöveget nem tároljuk.

A kérés feldolgozásakor, a memóriában eldöntjük, hogy a keresés milyen típusú volt — és a naplóba már csak a típus, a találatszám és néhány technikai adat kerül. A beírt szöveg ezután eldobásra kerül: nem írjuk ki, nem küldjük el, nem őrizzük meg.

Nincs süti, nincs látogatói azonosító, nincs harmadik fél követőkódja, és nem küldünk adatot hirdetési vagy analitikai szolgáltatóhoz.

Ennek a lapnak az a dolga, hogy ezt az állítást ellenőrizhetővé tegye: megmutassa a teljes naplósort, a besorolás minden szabályát és a kódot, ami a döntést hozza.

02

Ennyit látunk — és ennyit nem

Ez a teljes naplónk. Nem egy részlete: ennyi az összes, ami egy látogatásból megmarad.

Napló · 2026. nov. 5. 15:00–16:00 minta · 20 sor
Napló-minta húsz sorral: idő, eseménytípus, részlet, eszköz
15:04megnyitásinnen: index.huasztali
15:04látogatás—asztali
15:04betöltési időteljes 640 ms · DOM 340 ms · első bájt 90 msasztali
15:05megnyitásinnen: index.humobil
15:05keresésteljes név · 0 találatmobil
15:05látogatás—mobil
15:06megnyitásinnen: index.humobil
15:06olvasáspublikáció · 1–5 percasztali
15:06betöltési időteljes 1 180 ms · DOM 720 ms · első bájt 140 msmobil
15:07keresésnyilvántartási szám · 0 találatmobil
15:07távozás10–60 mpmobil
15:07megnyitásinnen: index.huasztali
15:08keresésfedőnév · 3 találatasztali
15:08megnyitásinnen: facebook.commobil
15:08látogatás—mobil
15:09olvasáspublikáció · 5–15 percasztali
15:09keresésegyszavas név · 11 találatmobil
15:10megnyitásinnen: index.huasztali
15:10keresésteljes név · 0 találatasztali
15:11távozás1–5 percasztali

Minta, nem valódi naplórészlet: a sorok a 2026. november 5-i 15 órai tényleges arányok szerint készültek — ebben az órában 3 630 esemény, 834 keresés és 261 olvasás történt, a megnyitások túlnyomó része az Index-cikkből. Valódi sorokat nem teszünk közzé.

A naplósor mezői
idő
perc pontossággal, dátummal
típus
megnyitás, látogatás, keresés, olvasás, távozás, betöltési idő
keresés típusa
teljes név · egyszavas név · fedőnév · nyilvántartási szám · cím vagy tárgykör · egyéb
találat
hány találatot adott a keresés
olvasási idő
sávban: 0–10 mp, 10–60 mp, 1–5 perc, 5–15 perc, 15 perc fölött
honnan
a hivatkozó oldal domainje, teljes cím nélkül
eszköz
mobil vagy asztali
03

Mi kerül a naplóba

Mezőre lebontva, pontosan. Ami nincs itt a táblákban, az nem kerül a naplóba.

Keresésnél
mezőmit jelentpélda
idoidőpont perc pontossággal2026-11-09 14:03
tipusa keresés típusa — a hat kategória egyiketeljes_nev
talalathány találatot adott0
talaltvolt-e egyáltalán találatnem
javaslatbola legördülő javaslatból indult-enem
eszkozmobil vagy asztalimobil
Olvasásnál
mezőmit jelentpélda
idoidőpont perc pontossággal2026-11-09 14:06
publikacioa saját gyűjteményünk tételazonosítója — a tételről szól, nem a látogatórólpub-0421
idosavmennyi ideig volt nyitva — sávban, nem másodpercre1-5perc
eszkozmobil vagy asztalimobil

Az olvasási idő sávjai: 0-10mp, 10-60mp, 1-5perc, 5-15perc, 15perc+. Sávban ugyanazt tudjuk meg — olvasták-e, vagy csak ránéztek —, de a pontos másodperc nem válik egyedi mintázattá, amiből két naplósort össze lehetne kötni.

04

Mi nem kerül a naplóba

Ennek az ára, hogy mi magunk sem tudjuk összerakni egy látogató útját, és visszatérő látogatót sem tudunk számolni. Ezt vállaljuk: az első 56 óra elemzésében is ez volt a legnagyobb korlát, és inkább maradunk a korláttal.

05

A hat kategória

A besorolás kizárólag a keresés alakjából dolgozik: hány szóból áll, betű-e vagy szám, szerepel-e benne témaszó, és egyezik-e a saját gyűjteményünk valamelyik fedőnevével. Élő személyekről nem vezetünk listát, és nem is készítünk ilyet.

A hat kategória
kategóriamit jelentpélda
teljes_nevkét-három, csupa betűből álló szó, kérdőszó és témaszó nélkül„Kovács János”
egyszavas_nevegyetlen név-szerű szó„Kleopatra”
fedonev_talalata kifejezés egyezik a saját gyűjteményünk egyik fedőnevével — ez nyilvános adat, nem személyi nyilvántartás„Nanu-Nanu”
nyilvantartasi_szamH-, M- vagy B-szám alak, illetve puszta szám„h-21399”
cim_vagy_targykorcím, szerző, téma, kérdés — vagy bármi, amiben témaszó, kérdőszó vagy évszám van„egyházüldözés”
egyebtöredék, írásjel, besorolhatatlan„M-”

A két segédlista, ami a döntéshez kell — a témaszavak (ügynök, akta, egyház, 1956, tanulmány…) és a kérdőszavak (hogyan, ki, miért…) — a forráskódban teljes egészében olvasható, lejjebb. Egyik sem tartalmaz személyneveket.

Amit a besorolás nem tud

Őszintén a korlátokról, mert ezek nélkül a szám félrevezető volna:

06

Mit ad ez a besorolás a valódi adaton

Lefuttattuk a besorolót az indulás utáni napló 80 leggyakoribb kifejezésén, ami 416 keresést fed le. A táblában csak a kategóriák darabszáma és a találati arány szerepel — konkrét keresési kifejezést nem közlünk, egyet sem.

A 80 leggyakoribb kifejezés besorolása · 416 keresés
kategória kifejezés keresés megoszlás 0 találatos
egyszavas_nev5927113%
fedonev_talalat1411135%
egyeb1130%
teljes_nev41250%
cim_vagy_targykor2967%
nyilvantartasi_szam00—
összesen80416

A megoszlás-sáv a legnagyobb kategóriához mérve olvasandó. Két dolog látszik: a keresések túlnyomó része egyetlen szó, és a cim_vagy_targykor — vagyis amikor valaki témára keres — alig fordul elő. Ez a lap nem névtárként használható, de a közönség annak próbálja használni.

A szám óvatosan olvasandó. Az ellenőrzés nyolc elemű, demó fedőnév-listával futott; élesben a teljes gyűjtemény fedőnevei ellen megy, így az egyszavas_nev egy része átsorolódik a fedonev_talalat kategóriába. A kategóriák határai pedig ott is bizonytalanok, ahol a fenti „amit nem tud” pontok jelzik.

07

A forráskód

Ez a teljes besoroló, ahogy van — kivonat nélkül, 242 sor. Nincs külső függősége, és a végén önteszt is van: python -I kereses_besorolo.py. Ami itt érdekes: a classify() csak a szó alakját vizsgálja, és a search_record() visszatérési értékében nincs olyan mező, ami a beírt szöveget hordozná.

meres/kereses_besorolo.pyPython 3.8+ · függőség nélkül
# -*- coding: utf-8 -*-
"""
Keresés-besoroló — feltartaktak.hu mérési réteg
================================================

Ez a modul azt a célt szolgálja, hogy a naplóba NE a beírt szöveg kerüljön,
hanem csak annak a TÍPUSA és a kimenetele. A besorolás kizárólag a keresés
alakjából dolgozik (hány szó, nagybetűs-e, szám-e, szerepel-e a saját
gyűjteményünk fedőnevei között) — élő személyekről vezetett listát NEM
használ, és nem is készít.

Alapelv: csak olyat naplózunk, aminek a teljes szabálykönyvét ki merjük tenni
a cikk mellé. A szabálykönyv emberi nyelven: HOGYAN-MERUNK.md

A beírt szöveg a besorolás után eldobandó: sem a naplóba, sem máshova nem kerül.

Függőség nincs, Python 3.8+. Önteszt: python -I kereses_besorolo.py
"""

import re
import unicodedata

# --- a hat kategória (ezek a nevek jelennek meg a naplóban és a szabálykönyvben) ---

TELJES_NEV = "teljes_nev"                    # vezetéknév + keresztnév alak
EGYSZAVAS_NEV = "egyszavas_nev"              # egyetlen név-szerű szó
FEDONEV_TALALAT = "fedonev_talalat"          # a saját gyűjteményünk egyik fedőneve
NYILVANTARTASI_SZAM = "nyilvantartasi_szam"  # H-/M-/B-szám alak
CIM_VAGY_TARGYKOR = "cim_vagy_targykor"      # cím, szerző, téma, kérdés
EGYEB = "egyeb"                              # töredék, jel, besorolhatatlan

KATEGORIAK = [
    TELJES_NEV, EGYSZAVAS_NEV, FEDONEV_TALALAT,
    NYILVANTARTASI_SZAM, CIM_VAGY_TARGYKOR, EGYEB,
]

# Témaszavak: NEM személyek, hanem a gyűjtemény fogalmai. Ha egy keresésben
# szerepel valamelyik, akkor az a keresés témára irányul, nem névre.
# Ez a lista nyilvános és bárki átnézheti — pont ezért nem kerülhet bele
# egyetlen élő ember neve sem.
TOPIC_WORDS = {
    "ugynok", "ugynokok", "ugynokakta", "ugynokaktak", "akta", "aktak",
    "allambiztonsag", "allambiztonsagi", "titkosszolgalat", "tartotiszt",
    "halozat", "halozati", "beszervezes", "beszervezett", "fedonev", "fedonevek",
    "dosszie", "dossziek", "karton", "kartonok", "magnesszalag", "bnaplo",
    "abtl", "bm", "levettar", "leveltar", "iratok", "irat",
    "egyhaz", "egyhazi", "egyhazuldozes", "papok", "szerzetes",
    "rendszervaltas", "forradalom", "sortuz", "sortuzek", "megtorlas",
    "kadar", "rakosi", "kadarkorszak", "szocializmus",
    "kereso", "kereses", "segitseg", "sugo", "quiz", "teszt", "jatek",
    "tortenet", "tortenetek", "tanulmany", "konyv", "cikk", "szerzo",
}

# Kötőszavak és kérdőszavak: ha ilyen van a keresésben, az mondat vagy kérdés,
# nem névkeresés. Ez is fogalmi lista, nem személyekről szól.
FUNCTION_WORDS = {
    "a", "az", "es", "vagy", "de", "is", "meg", "csak", "nem", "ne",
    "hogy", "hogyan", "mi", "mit", "miert", "milyen", "melyik", "mikor", "hol",
    "ki", "kit", "kik", "van", "volt", "lesz", "lehet", "kell", "lenne",
    "ez", "ezt", "itt", "ott", "kerem", "koszonom",
}

# Nyilvántartási szám: H-21399, M/12345, B 4711, vagy puszta szám.
RE_REG_PREFIXED = re.compile(r"^[hmboHMBO][\s\-/.]?\d{2,7}$")
RE_REG_PLAIN = re.compile(r"^\d{3,7}$")
RE_ALPHA = re.compile(r"^[^\W\d_]+$", re.UNICODE)   # csak betű (ékezet is)


def strip_accents(text):
    """Ékezet-mentesítés: a magyar szövegek összehasonlításához."""
    decomposed = unicodedata.normalize("NFD", text)
    return "".join(ch for ch in decomposed if unicodedata.category(ch) != "Mn")


def norm(text):
    """Összehasonlítási kulcs: ékezet nélkül, kisbetűsen, az írásjelek szóközzé
    alakítva. Így a „Nanu-Nanu” és a „Nanu nanu” ugyanaz a kulcs, és az
    „abtl--2.2.2” alakú levéltári jelzetben is megtalálható az „abtl” szó."""
    plain = strip_accents(str(text or "")).lower()
    return re.sub(r"\s+", " ", re.sub(r"[^0-9a-z]+", " ", plain)).strip()


def _is_year(token):
    """Évszám-e? (1956 nem nyilvántartási szám.)"""
    return bool(re.fullmatch(r"\d{4}", token)) and 1900 <= int(token) <= 2030


def classify(query, cover_names=None):
    """A keresés típusa — a beírt szöveget NEM adja vissza és nem tárolja.

    query:       a beírt szöveg (csak itt, a memóriában)
    cover_names: a saját gyűjtemény fedőneveinek halmaza, norm() szerinti
                 kulccsal. Ha nincs megadva, a fedőnév-kategória kimarad.

    Visszatérés: a hat kategória egyike (sztring).
    """
    raw = str(query or "").strip()
    if len(raw) < 2:
        return EGYEB

    tokens = raw.split()
    key = norm(raw)

    # 1. Nyilvántartási szám (az évszám nem az)
    if len(tokens) == 1:
        token = tokens[0]
        if not _is_year(token) and (RE_REG_PREFIXED.match(token) or RE_REG_PLAIN.match(token)):
            return NYILVANTARTASI_SZAM

    # 2. A saját gyűjteményünk fedőneve (nyilvános adat, nem személy-lista)
    if cover_names and key in cover_names:
        return FEDONEV_TALALAT

    # 3. Témaszó bárhol a keresésben -> téma, nem név
    # A normalizált kulcs szavaival dolgozunk, így a központozás nem rejti el
    # a témaszót (pl. „abtl--2.2.2” -> „abtl 2 2 2”).
    norm_tokens = key.split()
    if any(t in TOPIC_WORDS for t in norm_tokens):
        return CIM_VAGY_TARGYKOR
    if len(tokens) > 1 and any(t in FUNCTION_WORDS for t in norm_tokens):
        return CIM_VAGY_TARGYKOR
    if any(_is_year(t) for t in tokens):
        return CIM_VAGY_TARGYKOR

    # 4. Négy szótól fölfelé: cím vagy kérdés, nem névkeresés
    if len(tokens) >= 4:
        return CIM_VAGY_TARGYKOR

    # 5. Két-három szó, mind betűből, témaszó és kérdőszó nélkül -> teljes név.
    # A kisbetűs gépelés gyakori („kovács jános”), ezért a nagybetű nem feltétel.
    if 2 <= len(tokens) <= 3:
        if all(RE_ALPHA.match(t) for t in tokens):
            return TELJES_NEV
        return CIM_VAGY_TARGYKOR

    # 6. Egy szó: név-szerű, ha csak betű és nem túl hosszú
    token = tokens[0]
    if RE_ALPHA.match(token) and 3 <= len(token) <= 25:
        return EGYSZAVAS_NEV

    return EGYEB


# --- olvasási idő: sávokban, pontos másodperc nélkül -------------------------

DWELL_BUCKETS = [
    (10, "0-10mp"),
    (60, "10-60mp"),
    (300, "1-5perc"),
    (900, "5-15perc"),
    (float("inf"), "15perc+"),
]


def dwell_bucket(seconds):
    """Olvasási idő sávja. A pontos másodperc nem kerül a naplóba:
    sávban ugyanaz a kutatási érték, de nem lesz belőle ujjlenyomat."""
    if seconds is None or seconds < 0:
        return "ismeretlen"
    for limit, label in DWELL_BUCKETS:
        if seconds < limit:
            return label
    return "15perc+"


# --- naplósorok: ezek a mezők kerülnek ki, és semmi más ---------------------

def search_record(query, result_count, from_suggestion, is_mobile,
                  minute_stamp, cover_names=None):
    """Keresési naplósor. A beírt szöveg NEM szerepel benne."""
    return {
        "esemeny": "kereses",
        "ido": minute_stamp,                       # perc pontosság
        "tipus": classify(query, cover_names),     # a hat kategória egyike
        "talalat": int(result_count or 0),
        "talalt": bool(result_count),
        "javaslatbol": bool(from_suggestion),
        "eszkoz": "mobil" if is_mobile else "asztali",
    }


def read_record(publication_id, seconds, is_mobile, minute_stamp):
    """Olvasási naplósor: a gyűjtemény egy tételéről szól, nem a látogatóról."""
    return {
        "esemeny": "olvasas",
        "ido": minute_stamp,
        "publikacio": publication_id,              # a saját gyűjtemény azonosítója
        "idosav": dwell_bucket(seconds),
        "eszkoz": "mobil" if is_mobile else "asztali",
    }


# --- önteszt ----------------------------------------------------------------

def _selftest():
    cover = {norm(x) for x in ["Szigeti", "Kovesdi", "Sarosi", "Nanu-Nanu", "Raguza"]}
    cases = [
        ("h-21399", NYILVANTARTASI_SZAM),
        ("M/12345", NYILVANTARTASI_SZAM),
        ("777", NYILVANTARTASI_SZAM),
        ("1956", CIM_VAGY_TARGYKOR),          # évszám, nem nyilvántartási szám
        ("Szigeti", FEDONEV_TALALAT),
        ("sarosi", FEDONEV_TALALAT),          # ékezet és kisbetű nem számít
        ("Kovács János", TELJES_NEV),
        ("dr Kovács János", TELJES_NEV),
        ("Kleopatra", EGYSZAVAS_NEV),
        ("quiz", CIM_VAGY_TARGYKOR),
        ("egyházüldözés", CIM_VAGY_TARGYKOR),
        ("ügynök tartótiszt", CIM_VAGY_TARGYKOR),
        ("hogyan lehet keresni az aktákban", CIM_VAGY_TARGYKOR),
        ("kovács jános", TELJES_NEV),        # kisbetűs gépelés is név
        ("ki volt Kovács", CIM_VAGY_TARGYKOR),  # kérdőszó -> nem névkeresés
        ("Nanu nanu", FEDONEV_TALALAT),       # a kötőjel nem számít
        ("abtl--2.2.2", CIM_VAGY_TARGYKOR),   # levéltári jelzet, nem névkeresés
        ("M-", EGYEB),
        ("?", EGYEB),
        ("", EGYEB),
    ]
    bad = 0
    for text, expected in cases:
        got = classify(text, cover)
        flag = "ok " if got == expected else "HIBA"
        if got != expected:
            bad += 1
        print("  %s  %-34r -> %-20s (vart: %s)" % (flag, text, got, expected))
    print("\n  dwell: 4mp=%s  45mp=%s  200mp=%s  1200mp=%s" % (
        dwell_bucket(4), dwell_bucket(45), dwell_bucket(200), dwell_bucket(1200)))
    print("\n  naplosor minta: %s" % search_record(
        "Kovács János", 0, False, True, "2026-11-09 14:03", cover))
    return bad


if __name__ == "__main__":
    import sys
    try:
        sys.stdout.reconfigure(encoding="utf-8")
    except Exception:
        pass
    print("Keresés-besoroló — önteszt\n")
    failures = _selftest()
    print("\n%s" % ("MINDEN ESET RENDBEN" if not failures else "%d eset elhasalt" % failures))
    sys.exit(1 if failures else 0)

A kódban a két nyilvános segédlista — TOPIC_WORDS és FUNCTION_WORDS — végig olvasható. Fogalmak vannak bennük, nem emberek.

08

Meddig őrizzük

A naplósorokat 12 hónapig tartjuk meg, utána automatikusan törlődnek. A nyers napló soha nem nyilvános; amit közzéteszünk, az mindig összesítés: kategóriánkénti darabszám, találati arány, napszaki eloszlás.

09

Mit változtattunk, és mikor

2026. november 4–6.

Az indulás első 56 órájában a napló még tartalmazta a beírt keresőszöveget. Ebből készült az az elemzés, amely kimutatta, hogy a keresések 60,4%-a nem adott találatot, és hogy a közönség valódi neveket keresett ott, ahol fedőnevek vannak.

A nyers keresési listát nem hoztuk és nem is hozzuk nyilvánosságra.

2026. november [dátum]-tól

A beírt szöveget már nem naplózzuk, csak a fenti hat kategória egyikét. A kérdést, amiért a mérést elindítottuk, egyszer megválaszoltuk; ahhoz, hogy a választ időről időre frissítsük, a szövegre nincs szükség.

10

Amit nem állítunk

A kód publikálása nem auditálható bizonyíték.

Innen senki nem tudja ellenőrizni, hogy a szerveren pontosan ez fut. Amit tehetünk, az annyi, hogy a szabályt leírjuk, a kódot megmutatjuk, a build-azonosítót kiírjuk a lap aljára, és vállaljuk, ha eltérés derül ki.

Ez nem bizonyíték, hanem ellenőrizhető állítás — és ennél többet egyetlen weboldal sem tud őszintén ígérni.

Ha kérdésed van a méréssel kapcsolatban, írj: [impresszum]