This shows you the differences between two versions of the page.
— |
busqueda_avanzada_en_opacmarc [12/05/2009 00:00] (current) |
||
---|---|---|---|
Line 1: | Line 1: | ||
+ | ====== Búsqueda avanzada en OpacMarc ====== | ||
+ | En abril de 2008, la mejor versión del formulario avanzado se encuentra en el **[[http://www.museomitre.gov.ar/cgi-bin/opacmarc/wxis?IsisScript=opac/xis/opac.xis&db=mitre&showForm=advanced|Catálogo del Museo Mitre]]** (en desarrollo). | ||
+ | |||
+ | |||
+ | |||
+ | ==== Análisis ==== | ||
+ | |||
+ | |||
+ | |||
+ | === En form-advanced.htm === | ||
+ | |||
+ | |||
+ | <file> | ||
+ | HIDDEN | ||
+ | advanced = 1 | ||
+ | |||
+ | "Encontrar registros que tengan..." | ||
+ | filter1 : [libre] | ||
+ | filterType1 : TITLE | ||
+ | | NAME | ||
+ | | SUBJ | ||
+ | | PUB_NAME | ||
+ | | PUB_PLACE | ||
+ | | NOTE | ||
+ | | SN | ||
+ | | ACCESSION | ||
+ | | ANY | ||
+ | oper : AND | ||
+ | | OR | ||
+ | filter2 : [libre] | ||
+ | filterType2 : TITLE | ||
+ | | NAME | ||
+ | | SUBJ | ||
+ | | PUB_NAME | ||
+ | | PUB_PLACE | ||
+ | | NOTE | ||
+ | | SN | ||
+ | | ACCESSION | ||
+ | | ANY | ||
+ | |||
+ | "Pero excluir registros que tengan..." | ||
+ | exclude : [libre] | ||
+ | excludeType : TITLE | ||
+ | | NAME | ||
+ | | SUBJ | ||
+ | | PUB_NAME | ||
+ | | PUB_PLACE | ||
+ | | NOTE | ||
+ | | SN | ||
+ | | ACCESSION | ||
+ | | ANY | ||
+ | | ||
+ | "Otras características de los registros" | ||
+ | date1 : [libre] | ||
+ | date2 : [libre] | ||
+ | lang : [opciones de menú] | ||
+ | trans : [opciones de menú] | ||
+ | m (material, medio) : [opciones de menú] | ||
+ | litForm : [opciones de menú] | ||
+ | biogr : [opciones de menú] | ||
+ | fest : [opciones de menú] | ||
+ | |||
+ | "Opciones para presentar los resultados" | ||
+ | sortBy | ||
+ | count (records per page) | ||
+ | </file> | ||
+ | |||
+ | |||
+ | |||
+ | === En opac.xis === | ||
+ | |||
+ | Estos son los parámetros relevantes para las búsquedas: | ||
+ | |||
+ | <code xml> | ||
+ | <cgitable><pft> | ||
+ | '2001 query'/ /* puede tener más de una occ, si viene desde un índice */ | ||
+ | '2002 searchType'/ | ||
+ | |||
+ | '2005 oper'/ | ||
+ | |||
+ | '2012 lang'/ | ||
+ | '2013 pub'/ | ||
+ | '2014 place'/ | ||
+ | '2015 format'/ | ||
+ | '2016 sortBy'/ | ||
+ | |||
+ | '2019 litForm'/ | ||
+ | '2020 biogr'/ | ||
+ | '2021 trans'/ | ||
+ | '2022 fecha1'/ | ||
+ | '2023 fecha2'/ | ||
+ | '2024 fest'/ /* Festchrift */ | ||
+ | |||
+ | '2028 rpp'/ /* bib. records per page */ | ||
+ | |||
+ | '2050 advanced'/ /* uso de form avanzado */ | ||
+ | |||
+ | /* Búsqueda combinando campos */ | ||
+ | '2051 query1'/ | ||
+ | '2052 query2'/ | ||
+ | '2053 searchType1'/ | ||
+ | '2054 searchType2'/ | ||
+ | ... | ||
+ | </pft></cgitable> | ||
+ | </code> | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | === En keyword-match-in-bib-record.xis === | ||
+ | |||
+ | Los pasos son los siguientes: | ||
+ | |||
+ | * definir el operador booleano a emplear | ||
+ | * proteger el operador de truncamiento ** * ** (para que no se pierda en el próximo paso) | ||
+ | * limpiar las expresiones recibidas, usando //cleanQuery// (resultado en v3001) | ||
+ | * eliminar ' AND ' | ||
+ | * reemplazar el operador de truncamiento por **$** | ||
+ | * si es **búsqueda simple** | ||
+ | * insertar operador AND entre términos | ||
+ | * añadir prefijo (e.g. ''-SN='') o sufijo (e.g. ''/(9204)'') a cada término, según el tipo de búsqueda (v2002) | ||
+ | * si es **búsqueda avanzada** | ||
+ | * insertar operador AND entre términos (en filter1, filter2, exclude) | ||
+ | * añadir sufijos/prefijos según el tipo de búsqueda (filterType1, filterType2, excludeType) | ||
+ | * conectar filter1 y filter2 con el operador elegido | ||
+ | * añadir un filtro (AND PREFIJO=valor) por cada característica adicional | ||
+ | * si la búsqueda incluye fechas, realizar ciertas operaciones sobre ellas | ||
+ | * realizar una limpieza final | ||
+ | |||
+ | |||
+ | Este es el código utilizado: | ||
+ | |||
+ | <code xml> | ||
+ | <!-- Operador booleano por defecto --> | ||
+ | <field action="replace" tag="2005"><pft>if a(v2005) then 'AND' fi</pft></field> | ||
+ | |||
+ | <!-- Limpiamos la expresión recibida; el resultado queda en v3001 --> | ||
+ | <call name="cleanQuery"><pft> | ||
+ | if 'TITLE~ANY' : v2002 then | ||
+ | replace(v2001,'*','XXXTRUNCATEXXX'), /* XXXTRUNCATEXXX es un string (alfabético) improbable, para evitar que el símbolo de truncación se pierda durante la limpieza */ | ||
+ | fi | ||
+ | </pft></call> | ||
+ | <!-- ATENCION: clean query1 & query2 ??? --> | ||
+ | |||
+ | <!-- Armamos la search expression --> | ||
+ | <field action="replace" tag="3001"><pft> | ||
+ | replace(replace(s(mpu,v3001), /* v3001 es la expresión luego de la limpieza; usamos mpu porque cleanQuery no cambia el case */ | ||
+ | 'XXXTRUNCATEXXX','$'), | ||
+ | ' AND ',' ') | ||
+ | </pft></field> | ||
+ | |||
+ | <field action="replace" tag="3001"><pft> | ||
+ | if p(v2001) then | ||
+ | /* Búsqueda simple */ | ||
+ | select v2002 | ||
+ | case 'TITLE' : replace(v3001,' ',s('/(9204)',x1,v2005,x1)), '/(9204)', | ||
+ | ' OR ', | ||
+ | replace(v3001,' ',s('/(9404)',x1,v2005,x1)), '/(9404)', /* incluimos las series. TO-DO: revisar cada lugar donde diga "9204" */ | ||
+ | case 'SN' : /* originalmente sólo ISBN e ISSN; lo extendemos a otros identificadores numéricos */ | ||
+ | '-SN=',v2001, | ||
+ | ' OR -SN=',replace(v2001,'-',''), /* aceptamos un ISBN que traiga guiones */ | ||
+ | ' OR -INV=',v2001, /* nros. de inventario */ | ||
+ | ' OR -NC=',v2001, /* nros. de control */ | ||
+ | case 'ANY' : replace(v3001,' ',s(x1,v2005,x1)), | ||
+ | endsel, | ||
+ | else | ||
+ | /* Búsqueda avanzada */ | ||
+ | /* TO-DO: truncamiento */ | ||
+ | '(', | ||
+ | if p(v2051) then | ||
+ | replace(v2051,' ',s(v2006,'/',v2053,x1,v2005,x1)), v2006, | ||
+ | select v2053 | ||
+ | case 'TITLE': '/(9204)', | ||
+ | case 'NAME' : '/(9104)', | ||
+ | case 'SUBJ' : '/(9604)', | ||
+ | endsel, | ||
+ | fi, | ||
+ | if p(v2051) and p(v2052) then x1,v2005,x1, fi, | ||
+ | if p(v2052) then | ||
+ | replace(v2052,' ',s(v2006,'/',v2054,x1,v2005,x1)), v2006, | ||
+ | select v2054 | ||
+ | case 'TITLE': '/(9204)', | ||
+ | case 'NAME' : '/(9104)', | ||
+ | case 'SUBJ' : '/(9604)', | ||
+ | endsel, | ||
+ | fi, | ||
+ | ')', | ||
+ | fi, | ||
+ | |||
+ | if p(v2013) then ' AND ',replace(v2013,' ','$/(9261) AND '),'$/(9261)', fi, | ||
+ | if p(v2014) then ' AND ',replace(v2014,' ','$/(9260) AND '),'$/(9260)', fi, | ||
+ | " AND -LANG="v2012^*, | ||
+ | " AND -BIB="v2018, | ||
+ | " AND -FICTION="v2019, | ||
+ | " AND -BIOGR=YES"d2020, | ||
+ | " AND -TRANS="v2021, | ||
+ | " AND -FEST"d2024, | ||
+ | </pft></field> | ||
+ | |||
+ | <!-- Si no se usaron fechas, la expresión de búsqueda está (casi) lista --> | ||
+ | <flow action="jump"><pft> | ||
+ | if s(v2022,v2023) = '' then 'SEARCH_EXPR_READY' fi | ||
+ | </pft></flow> | ||
+ | |||
+ | <!-- Pero si hay fechas, tenemos que manipularlas para incorporarlas a la expresión --> | ||
+ | |||
+ | <!-- No queremos fechas en blanco --> | ||
+ | <field action="replace" tag="2022"><pft>"1600"n2022</pft></field> | ||
+ | <field action="replace" tag="2023"><pft>"2000"n2023</pft></field> | ||
+ | |||
+ | <!-- v3020: distancia entre fechas --> | ||
+ | <field action="replace" tag="3020"><pft>f(val(v2023) - val(v2022),1,0)</pft></field> | ||
+ | |||
+ | <!-- ATENCION: este error debería producir un mensaje bien específico, | ||
+ | o quizás debería el sistema invertir el orden de las fechas?? --> | ||
+ | <flow action="jump"><pft>if val(v3020) < 0 then 'ZERO_HITS' fi</pft></flow> | ||
+ | |||
+ | <field action="replace" tag="3022"><pft>v2022</pft></field> | ||
+ | <flow action="jump"><pft>if val(v3020) = 0 then 'COMPACTAR_FECHAS' fi</pft></flow> | ||
+ | |||
+ | <!-- v3022: la secuencia de años --> | ||
+ | <do> | ||
+ | <parm name="count"><pft>v3020</pft></parm> | ||
+ | <define>1001 Isis_Current</define> | ||
+ | <loop> | ||
+ | <field action="import" tag="list">3022</field> | ||
+ | <field action="add" tag="3022"><pft>f(val(v3022[1]) + val(v1001),1,0)</pft></field> | ||
+ | <field action="export" tag="list">3022</field> | ||
+ | </loop> | ||
+ | </do> | ||
+ | |||
+ | |||
+ | <!-- ================================================== --> | ||
+ | <label>COMPACTAR_FECHAS</label> | ||
+ | <!-- ================================================== --> | ||
+ | <!--display><pft>ALL</pft></display--> | ||
+ | <display><pft>@COMPACT-DATES.PFT</pft></display> | ||
+ | <proc>d3022d3023d3024d3025d3026</proc> | ||
+ | |||
+ | <!-- Añadimos las fechas a la expresión de búsqueda --> | ||
+ | <field action="replace" tag="3001"><pft> | ||
+ | v3001,' AND (', |-F=|v3027+| OR |, ')', | ||
+ | </pft></field> | ||
+ | |||
+ | |||
+ | <!-- ================================================== --> | ||
+ | <label>SEARCH_EXPR_READY</label> | ||
+ | <!-- ================================================== --> | ||
+ | <!-- Finalmente, quitamos un posible '$/(9204)' de la expresión de búsqueda --> | ||
+ | <field action="replace" tag="3001"><pft> | ||
+ | replace(replace(replace(v3001, | ||
+ | '($/(9204)) AND ',''), | ||
+ | '(/(9204)) AND ',''), | ||
+ | '() AND ',''), | ||
+ | </pft></field> | ||
+ | </code> | ||
+ | |||
+ | |||
+ | |||
+ | {{tag>opacmarc desarrollo}} |