====== 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 === 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) === En opac.xis === Estos son los parámetros relevantes para las búsquedas: '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'/ ... === 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: if a(v2005) then 'AND' fi 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 replace(replace(s(mpu,v3001), /* v3001 es la expresión luego de la limpieza; usamos mpu porque cleanQuery no cambia el case */ 'XXXTRUNCATEXXX','$'), ' AND ',' ') 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, if s(v2022,v2023) = '' then 'SEARCH_EXPR_READY' fi "1600"n2022 "2000"n2023 f(val(v2023) - val(v2022),1,0) if val(v3020) < 0 then 'ZERO_HITS' fi v2022 if val(v3020) = 0 then 'COMPACTAR_FECHAS' fi v3020 1001 Isis_Current 3022 f(val(v3022[1]) + val(v1001),1,0) 3022 @COMPACT-DATES.PFT d3022d3023d3024d3025d3026 v3001,' AND (', |-F=|v3027+| OR |, ')', replace(replace(replace(v3001, '($/(9204)) AND ',''), '(/(9204)) AND ',''), '() AND ',''), {{tag>opacmarc desarrollo}}