fix: wyszukiwanie po ISBN — wydawnictwo nadrzędne i wyszukiwarki globalne - #802
Open
mpasternak wants to merge 2 commits into
Open
fix: wyszukiwanie po ISBN — wydawnictwo nadrzędne i wyszukiwarki globalne#802mpasternak wants to merge 2 commits into
mpasternak wants to merge 2 commits into
Conversation
Trzy niezależne usterki sprawiały, że ISBN nie znajdował wydawnictwa nadrzędnego — ani lokalnie, ani w PBN. 1. `type="BOOK"` w zapytaniach do PBN. Wydawnictwo nadrzędne dla rozdziału to w PBN prawie zawsze `EDITED_BOOK` (praca zbiorowa pod redakcją); w danych referencyjnych stosunek wynosi 272 do 2 na korzyść EDITED_BOOK. Filtr odcinał więc niemal cały szukany zasób. ISBN i DOI idą teraz bez `type` (filtr `isbn` w API PBN sam z siebie trafia wyłącznie w rekordy książkowe — `type="CHAPTER"` z ISBN-em zwraca pustkę), a tytuł dwoma leniwymi zapytaniami: EDITED_BOOK, potem BOOK. 2. `isbnlib.notisbn()` do rozpoznawania ISBN-u. Ta funkcja liczy cyfrę kontrolną, więc ISBN z literówką przestawał być rozpoznawany jako ISBN i trafiał do gałęzi wyszukiwania po tytule — cicho, bez wyników. Rozpoznanie idzie teraz po kształcie ciągu (`bpp.util.isbn`), a suma kontrolna jest używana wyłącznie tam, gdzie coś liczy: przy przeliczaniu ISBN-10 na ISBN-13. 3. Pole „Wydawnictwo nadrzędne" nie szukało po ISBN w ogóle — ani w module redakcyjnym, ani w wyszukiwarce publicznej, ani w `zglos_publikacje`. ISBN-y zapisywane są tak, jak wpisał je użytkownik (w bazie referencyjnej 236 rekordów z myślnikami, 146 bez), więc porównanie normalizuje obie strony — wpisaną i bazodanową. Dodatkowo: PBN nie przelicza ISBN-10 na ISBN-13, więc wysyłamy obie formy, a etykieta opcji „Pobierz z PBN…" pokazuje to, co wpisał użytkownik, zamiast formy skanonizowanej. Zachowanie serwera PBN sprawdzone empirycznie na `/api/v1/search/publications`: ISBN dopasowywany jest dosłownie, po formie kanonicznej — zapytanie z myślnikami zwraca zero wyników nawet wtedy, gdy PBN przechowuje ISBN właśnie z myślnikami. Dlatego kanonizacja przed wysyłką zostaje. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FMffMAhZ91hfdoUCc7SsJN
…lnych
Wyszukiwarka publiczna porównywała ISBN dosłownie:
qry |= Q(pk__in=Rekord.objects.filter(isbn__iexact=self.q))
Żadnej normalizacji po którejkolwiek stronie — rekord zapisany jako
`978-83-7430-700-0` nie znajdował się po wpisaniu `9788374307000` ani
odwrotnie.
Wyszukiwarka redakcyjna normalizowała, ale niejednakowo: strona zapytania
(`normalize_isbn`) zdejmowała kropki, myślniki i spacje i nie ruszała
wielkości liter, a strona bazy (`normalized_db_isbn`) zdejmowała wyłącznie
myślnik i sprowadzała do małych liter. Skutki: ISBN zapisany w bazie ze
spacjami nie był znajdowany, a ISBN-10 z cyfrą kontrolną „X" przepadał na
samej różnicy wielkości litery. Żadna z wyszukiwarek nie zaglądała do
`e_isbn` ani nie przeliczała ISBN-10 na ISBN-13.
Obie używają teraz wspólnych `warunek_po_isbn` / `adnotacje_isbn` z
`bpp.util.isbn` — normalizacja identyczna po obu stronach porównania,
`isbn` razem z `e_isbn`, plus odpowiednik w drugiej długości.
Zbiór wyników jest świadomie NADZBIOREM dotychczasowego: warunek ISBN-owy
nie jest bramkowany na `wyglada_jak_isbn` (dopasowanie jest równościowe,
więc zwykły tytuł i tak niczego nie trafi), a odziedziczony limit
`len(ni) < 20` zniknął — w wersji publicznej takiego limitu nie było, więc
jego wprowadzenie mogłoby coś zgubić.
`normalized_db_isbn` zostało usunięte razem z eksportem z `import_common.core`
— po tej zmianie nie miało już użytkowników, a zostawienie go groziło tym, że
ktoś sięgnie po wersję z rozjazdem.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FMffMAhZ91hfdoUCc7SsJN
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Wyszukiwanie po ISBN nie działało w czterech miejscach naraz. PR naprawia
wszystkie, opierając je na jednym module
bpp.util.isbn.Ustalenia empiryczne (produkcyjne
/api/v1/search/publications)isbnz myślnikami — nawet gdy PBN przechowuje ISBN właśnie z myślnikamiisbnw formie kanonicznejisbn+type="BOOK"dla realnej „okładki"isbn+type="EDITED_BOOK"albo beztypetitle+type="BOOK"dla pracy zbiorowejisbn+type="CHAPTER"PBN indeksuje ISBN bez separatorów, ale zapytania NIE normalizuje. Kanonizacja
przed wysyłką jest więc poprawna i zostaje — wysyłanie surowego wpisu użytkownika
pogorszyłoby sytuację.
W danych referencyjnych wydawnictwa nadrzędne mają w PBN rodzaj
EDITED_BOOK(272 rekordy) kontra
BOOK(2). Własne ISBN-y BPP zapisywane są tak, jak wpisał jeużytkownik: 236 z myślnikami, 146 bez.
Commit 1 — wydawnictwo nadrzędne
type="BOOK"w zapytaniach do PBN — odcinałoEDITED_BOOK, czylipraktycznie wszystkie realne wydawnictwa nadrzędne. Główna przyczyna
zgłoszenia. ISBN i DOI idą teraz bez
type, tytuł dwoma leniwymizapytaniami (
EDITED_BOOK, potemBOOK— poletypew API PBN jestskalarem). Drugie zapytanie odpala się tylko, gdy pierwsze się wyczerpie.
isbnlib.notisbn()wqualify_query— funkcja liczy cyfrę kontrolną,więc ISBN z literówką przestawał być rozpoznawany jako ISBN i trafiał do
gałęzi wyszukiwania po tytule. Cicho, bez komunikatu, zero wyników.
redakcyjnym, ani w wyszukiwarce publicznej, ani w
zglos_publikacje.Etykieta „Pobierz z PBN…" pokazuje teraz to, co wpisał użytkownik, zamiast formy
skanonizowanej.
Commit 2 — wyszukiwarki globalne
Wyszukiwarka publiczna porównywała ISBN dosłownie (
isbn__iexact), bezżadnej normalizacji po którejkolwiek stronie. Wyszukiwarka redakcyjna
normalizowała, ale niejednakowo: strona zapytania zdejmowała kropki, myślniki
i spacje i nie ruszała wielkości liter, strona bazy (
normalized_db_isbn)zdejmowała wyłącznie myślnik i sprowadzała do małych liter — przez co ISBN-10
z cyfrą kontrolną „X" przepadał na samej różnicy wielkości litery, a ISBN
zapisany ze spacjami nie był znajdowany nigdy. Żadna nie zaglądała do
e_isbn.Zbiór wyników jest świadomie nadzbiorem dotychczasowego: warunek ISBN-owy
nie jest bramkowany na
wyglada_jak_isbn(dopasowanie jest równościowe, więczwykły tytuł i tak niczego nie trafi), a odziedziczony limit
len(ni) < 20zniknął, bo w wersji publicznej takiego limitu nie było.
normalized_db_isbnusunięte razem z eksportem zimport_common.core— po tejzmianie nie miało już użytkowników.
Nowy moduł
bpp.util.isbnwyglada_jak_isbn()— rozpoznanie po kształcie ciągu, bez sumy kontrolnej(13 cyfr wymaga prefiksu GS1
978/979, żeby przypadkowe liczby nie wpadaływ gałąź ISBN-ową),
warianty_isbn()— forma kanoniczna plus odpowiedniki ISBN-13 i ISBN-10,isbn_znormalizowany(pole)— wyrażenie ORM normalizujące stronę bazodanową,adnotacje_isbn()/warunek_po_isbn()— para do wyszukiwarek globalnych,filtruj_tytul_lub_isbn()— filtr „tytuł albo ISBN" dla autocomplete'ów.Testy
48 nowych testów: jednostkowe helperów, kształt zapytań do PBN (asercja, że dla
ISBN nie leci
type, a dla tytułu lecą dwa zapytania), lenistwo iteratora,wyszukiwanie lokalne w każdej kombinacji zapisu ISBN-u (myślniki po jednej,
drugiej lub żadnej stronie, spacje, cyfra kontrolna X, ISBN-10 kontra ISBN-13,
e_isbn), oraz regresja na ISBN ze złą sumą kontrolną. Do tego testy kontrolnepilnujące, że wyszukiwanie po tytule dalej działa.
Pełna suita bez Playwrighta: 9502 passed, 4 skipped, 1 xfailed.
Poza zakresem
Wydawnictwo_ZwarteAdminAutocomplete(ogólne monografie, nie pole nadrzędnego)nadal nie rozumie ISBN-u.
🤖 Generated with Claude Code
https://claude.ai/code/session_01FMffMAhZ91hfdoUCc7SsJN