Our search engine tries to offer today's typical web searching experience, as gained with popular search engines such as Google. The nature of bibliographic searching differs from that of a web page searching, though. We provide many extensions to enable a complex and precise structured search, including an combined metadata, fulltext and reference search in one go. This page lists several tips and tricks that you may find useful to this effect.
Notre moteur de recherche propose des fonctionnalités similaires à celles des moteurs de recherche actuellement disponibles sur le Web, tels que Google. La nature des recherches bibliographiques diffère cependant de la recherche de pages web. Nous proposons donc des extensions permettant des recherches structurées complexes et précises, dont une recherche combinée s'effectuant sur les metadonnées, le contenu des fichiers et les références de chaque notice. Cette page répertorie les trucs et astuces pouvant vous être utiles.
Unsere Suchmaschine bietet den heutigen Stand der Web-Such Technologie, die auch von bekannten Suchmaschinen wie zum Beispiel Google angeboten werden. Im Detail unterscheidet sich jedoch die bibliographische Suche von einer Web-Suche. Wir bieten mehrere Erweiterungen an, damit eine komplexe und genau strukturierte Suche möglich wird, inklusiv einer kombinierten Metadatensuche, Volltextsuche und Referenzsuche. Diese Seite stellt Tipps und Tricks vor, die für eine effektive Suche nützlich sind.
El motor de búsqueda de este sistema trata de ofrecer la tecnología más actual de búsqueda web, desarrollada por buscadores tan populares como Google . Sin embargo, la naturaleza de una búsqueda bibliográfica difiere considerablemente de la de una página Web. La alternativa propuesta es la de proporcionar numerosas extensiones que hagan posible búsquedas de estructura compleja y precisa, incluso combinando metadatos, texto completo y citas bibliográficas en una misma consulta. Esta página ofrece una serie consejos útiles para conseguir una búsqueda más eficaz.
El motor de cerca d'aquest sistema tracta d'oferir la tecnologia més actual de cerca web, desenvolupada per cercadors tant populars com Google . La naturalesa d'una cerca bibliogràfica, però, difereix considerablement de la d'una página Web. L'alternativa proposada és la de proporcionar nombroses extensions que permetin cerques d'estructura complexa i precisa, inclosa la combinació de metadades, text complet i referències bibliogràfiques a una mateixa cerca. Aquesta pàgina ofereix una sèrie de consells útils per aconseguir una cerca més eficaç.
The default search mode is simple search that basically provides you with one input box where you can type your query, followed by a possibility to choose one of the common indexes to search within. You would usually simply type the keywords you are interested in and hit return. For example, if you are interested in documents on standard model that are written by (or mention) Ellis, you would type:
and on the search results page you could further add/remove keywords to get more precisely at what you are looking for, as is mentioned below.
Le mode de recherche par défaut est la recherche simple, qui consiste principalement en un seul champ dans lequel vous pouvez saisir votre requête. Vous avez également la possibilité de restreindre la recherche à un champ spécifique. Dans la majorité des cas, vous n'aurez qu'à saisir les mots-clés qui vous intéressent et lancer la recherche. Si, par exemple, vous souhaitez trouver des documents relatifs au standard model écrits (ou mentionnés) par Ellis, votre requête doit être la suivante:
Depuis la page des résultats vous pourrez également ajouter/supprimer des mots-clefs afin de parfaire votre recherche, comme expliqué plus loin.
El modo de búsqueda por defecto es la búsqueda simple que permite, en términos generales, escribir una consulta en el campo de texto, acompañado de la posibilidad de seleccionar uno de los índices comunes sobre los que efectuar la consulta. Se introducen las palabras clave a buscar y se acciona la consulta mediante la tecla de retorno (o intro). Por ejemplo, si interesa recuperar documentos sobre modelos estándar que han sido escritos por (o que mencionan a) Ellis, debemos escribir:
y en la página de resultados de la búsqueda podemos volver a añadir o quitar palabras clave para obtener mayor precisión en los resultados, tal y como se especifica en más adelante.
La cerca per defecte és la cerca simple, que fonamentalment permet escriure la consulta dins un camp de text, seguit de la possibilitat d'escollir un dels índexs comuns sobre els que realitzar la consulta. S'introdueixen les paraules clau a buscar i s'acciona la consulta mitjançant la tecla de retorn (intro). Per exemple, si interessa recuperar documents sobre models estàndard que han estat escrits per (o que fan esment a) Ellis, haurem d'escriure:
i a la pàgina dels resultats de la cerca podem tornar a afegir o treure paraules clau per tal d'obtenir més precisió als resultats, tal i com s'especifica més endavant.
The advanced search interface provides you with explicit tools to play with: you can change the matching type from the default word matching to phrase searching or the regular matching; you can use boolean queries in several indexes, etc. For example, to find all the documents written by Ellis, J spelled exactly that way that contain either of the words muon or neutrino in the title and that were published in 2001, you would type:
Note that Simple Search can provide you basically the same functionality, if you make use of special syntax that is explained in the text below. The simple-versus-advanced does not refer to the functionality that is being provided but rather to the amount of parametrization you can "tweak". We conform to the common use of the simple/advanced terms as found in other search engines.
Much of what follows will deal with a question on "how a power user would use the simple search interface". Recall that you can always go to the Advanced Search for more query assistance.
L'interface de recherche avancée vous offre plus de contrôles: vous pouvez changer le type de correspondance (exacte, expression régulière, phrase partielle); vous pouvez effectuer des recherches booléennes dans différents index, etc. Par exemple pour trouver tous les documents écrits par Ellis, J (écrit exactement ainsi), qui contiennent les mots muon ou neutrino dans le titre et qui ont été publiés en 2001, saisissez:
Notez que la recherche simple peut obtenir le même résultat que la recherche avancée si vous utilisez la syntaxe expliquée plus bas. La différence entre la recherche simple et la recherche avancée ne se fait pas sur les fonctionnalités offertes mais plutôt sur le nombre de paramètres qu'il vous est possible de combiner. Nous nous conformons en ce sens aux modèles de recherches simples/avancées que l'on trouve dans d'autre moteurs de recherche.
Ce qui suit explique principalement la syntaxe qu'un utilisateur expérimenté peut utiliser dans le mode de recherche simple. Rappelez-vous que vous pouvez toujours utiliser la recherche avancée pour parvenir à des résultats ciblés sans avoir à utiliser de syntaxe particulière.
El interfaz de búsqueda avanzada ofrece herramientas específicas con las que configurar la búsqueda: podemos cambiar el tipo de búsqueda por defecto (de alguna palabra a todas, buscar por frase exacta, por expresión regular, etc.); nos permite utilizar las expresiones booleanas combinando varios índices, etc. Por ejemplo, para recuperar todos los documentos escritos por Ellis, J -transcrito exactamente de ese modo- y también las palabras muons o neutrino en el título de la publicación y 2001 en el año, escribiremos lo siguiente:
Obsérvese que si utilizamos una sintaxis especial, la Búsqueda Simple ofrece prácticamente la misma funcionalidad que la avanzada, tal y como se indica en las siguientes secciones de esta guía. Este apartado de búsqueda simple-versus-avanzada no se refiere tanto a las funcionalidades disponibles, sino a la forma de búsqueda que podemos configurar mediante pequeñas modificaciones. El sistema se ha adaptado al uso común de los términos de simple/avanzado que podemos encontrar en otros motores de búsqueda.
En realidad, gran parte de la explicación que sigue a continuación, responde a la cuestión de "cómo un usuario avanzado puede utilizar la interficie de búsqueda simple". Recordamos que en cualquier momento es posible recurrir a la ayuda de la búsqueda avanzada para conseguir más asistencia.
La interficie de cerca avançada ofereix eines específiques amb les que configurar la cerca: podem canviar el tipus de cerca a realitzar per defecte (d'alguna paraula a totes les paraules, cerca per frase exacta, per expressió regular, etc.); ens permet emprar la combinació booleana a nombrosos índexs, etc. Per exemple, per localitzar tots els documents escrits per Ellis, J -transcrit exactament d'aquesta manera- i també les paraules muon o neutrino al títol de la publicació i 2001 a l'any, escriurem:
Observis que si fem servir una sintaxi especial, la Cerca Simple ofereix pràcticament la mateixa funcionalitat que l'avançada, tal i com s'explica a les següents seccions d'aquesta guia. Aquest apartat de cerca simple-versus-avançada no es refereix tant a les funcionalitats disponibles, com a la forma de cerca que podem configurar mitjançant petites modificacions. El sistema s'ha adaptat a l'ús comú dels termes simple/avançat que podem trobar a altres motors de cerca.
En realitat, gran part de l'explicació que segueix a continuació, respòn a la qüestió de "com un usuari avançat pot utilitzar la interficie de cerca simple". Recordem que en qualsevol moment és posible recòrrer a l'ajuda de la cerca avanzada per aconseguir més assistència.
After you submit your query, the search engine will analyze it and will try to always guide you in case no exact match could be found. For example, it would print you a list of closest indexed terms in case of spelling troubles:
Alternative choices will be printed in red. The search engine will similarly warn you when your search terms could not be found, or when they could but your boolean query couldn't be met. The search engine will also silently try to search for alternative forms (e.g. remove punctuation), etc.
Thanks to multiple search stages and the guidance provided at each stage, it is usually sufficient to simple type what you are looking for and see what the system says in return. If you aren't satisfied, you would then add/remove words from your query until the satisfactory reply.
Une fois votre requête envoyée, le moteur de recherche l'analyse et tente de vous aider si aucune correspondance exacte ne peut être trouvée. Il affiche, par exemple, une liste des termes indexés les plus proches en cas d'orthographe approximative:
Les alternatives sont affichées en rouge. Similairement, le moteur de recherche vous avertit lorsque votre requête ne peut aboutir, ou lorsque les éléments de recherche existent mais ne correspondent pas à votre requête booléenne. Le moteur de recherche essaie également de trouver des formes alternatives (suppression de la ponctuation, etc.) en arrière-plan.
Grâce aux multiples étapes de la recherche et à l'assistance fournie à chaque stade, il suffit généralement de saisir les éléments recherchés et de les adapter ensuite en fonction des réponses données par le système. Si vous n'êtes pas satisfait du résultat, il vous est alors possible de corriger votre requête petit à petit.
Gracias al sistema de búsqueda en múltiples etapas y a la ayuda que se proporciona en cada una de estas etapas, por lo general resulta suficiente escribir la palabra de búsqueda y revisar los resultados qué nos devuelve el sistema. Si los resultados no son pertinentes, o son excesivos o insuficientes, es posible añadir o quitar palabras de la consulta hasta conseguir resultados más satisfactorios.
Después de recibir una consulta, el motor de búsqueda la analiza y, en caso de no localizar ninguna coincidencia en la base de datos, el sistema tratará de guiar al usuario. Un ejemplo de ello son las listas de los términos indexados que se encuentran más cercanos al término introducido, en caso de que se produzacan errores ortográficos o de transcripción al efectuar la consulta:
Las opciones alternativas se muestran en rojo. El motor de búsqueda avisa de forma similar cuando detecta que los términos de búsqueda no se encuentran, o cuando detecta que sí que existen pero la fórmula de consulta booleana utilizada no puede localizarlos. Así mismo, el motor de búsqueda también realiza de forma oculta acciones alternativas para mejorar los resultados, como por ejemplo eliminar puntuación, etc.
Gràcies al sistema de cerca en múltiples etapes i a l'ajuda que es va proporcionant a cadascuna d'aquestes etapes, pel general resulta suficient teclejar l'objetcte de cerca i observar que ens retorna el sistema. Si no quedem satisfets, podem afegir/treure paraules de la nostra consulta fins aconseguir uns resultats satisfactoris.
Després de rebre una consulta, el motor de cerca l'analizarà i tractarà sempre de guiar a l'usuari en cas de que no localitzi cap coincidència a la base de dades. Un exemple d'això son les llistes dels termes indexats que es troben més propers al terme introduït a la consulta en cas que no es trobin coincidències per errors ortogràfics o de transcripció:
Les opcions alternatives es mostren en vermell. El motor de cerca avisa de forma similar quan detecta que els termes de cerca no es troben, o quan detecta que si que existeixen però la fórmula de consulta booleana emprada no aconsegueix localitzar-los. Així mateix, el motor de cerca també realitza de forma oculta accions alternatives per a millorar els resultat,s com, per exemple, eliminar puntuació, etc.
The default search mode is a search for words. This means that any whitespace you type is not significant, but is rather interpreted to mean "add an automatic boolean AND between words", like Google does. For example, to find all records that contain both the word ellis and the word muon anywhere in the record, type:
The whitespace would be significant if you include it within quotes. There are two phrase searching modes:The difference between exact and partial phrase searching modes may not be obvious upon first look. While the latter is more similar to what ``phrase search'' usually means in the context of web page search engines, the former one is usually an order of magnitude faster if you know the precise values you are looking for.
Another interesting searching mode besides the word and phrase
searches is the regular expression search, introduced
by slashes instead of quotes. For example, the above partial phrase
query 'muon decay'
is fully equivalent to the regular
expression query /muon decay/
. The regular expression
syntax is very powerful and permits you to construct very complex
queries. For more information, please consult the regular expression section of this guide.
Le mode de recherche par défaut est la recherche de mots. Cela signifie que les espaces entre les mots sont ignorés. Ils sont interpretés dans le sens "ajouter automatiquement un booléen AND (=ET) entre les mots", à la manière de Google. Par exemple, pour trouver toutes les notices qui contiennent à la fois le mot ellis et le mot muon, saisissez:
Les espaces sont significatifs si la requête est placée entre guillemets. Il existe également deux modes de recherche de phrases:La différence entre les modes de recherche de phrases exactes et de phrases partielles n'est pas forcément évidente au premier abord. Alors que le second mode correspond plutôt au mode de recherche tel qu'on l'entend dans le contexte de la recherche de pages Web, le premier mode est habituellement bien plus rapide si vous connaissez la valeur précise de ce que vous cherchez.
Il existe également un autre mode de recherche, celui de
la recherche d'expressions régulières, introduit par
des barres obliques ('/') à la place des guillemets. Par
exemple, la requête 'muon decay'
ci-dessus est
totalement équivalente à la requête par expression
régulière /muon decay/
. La syntaxe des expressions
régulières est très puissante et permet de construire des requêtes
complexes. Pour plus d'informations, veuillez consulter la section de
ce guide concernant les expressions régulières.
El modo de búsqueda por defecto es la búsqueda por palabras. Ello significa que se ignoran los espacios en blanco, pero también que el motor de búsqueda lo interpreta por defecto como "añade automáticamente una Y booleana entre las palabras introducidas", del mismo modo que hace Google. Por ejemplo, para recuperar todos los registros que contengan tanto la palabra ellis como muon en cualquier parte del registro, debemos escribir:
Si queremos que el espacio en blanco sea significativo, debemos escribir la sentencia entrecomillada. Existen dos formas de búsqueda por frases:La diferencia entre buscar por frase exacta o buscar en parte de la frase puede parecer poco obvia en un primer momento. Sin embargo, mientras que la búsqueda en parte de la frase se asemeja a la búsqueda por frase que suele utilizarse en el contexto de los buscadores web, el uso de la búsqueda por frase exacta resulta mucho más efectiva y rápida cuanto más se conocen y especifican los valores a recuperar.
Otro interesante modo de búsqueda aparte de la búsqueda por palabra
o por frase es el uso de la expresión regular de
búsqueda, que se efectúa a partir del uso de parentesis en
lugar de entrecomillado. Por ejemplo, la búsqueda anterior según el
modo de en parte de la frase 'muon decay'
es equivalente a
la expresión regular/muon decay/
. La sintaxis de las
expresiones regulares es muy potente, y permite construir búsquedas
muy complejas. Para obtener más información, recomendamos la consulta
de la sección expresión regular de esta guia.
El mode de cerca per defecte es la cerca per paraules. Aquest mode implica s'ignorian els espais en blanc, però també que el motor de cerca els interpreti per defecte com a "afegeis automàticament una I booleana entre les paraules introduïdes", de la mateixa forma que fa Google. Per exemple, per recuperar tots els registres que continguin tant la paraula ellis com muon a qualsevol part del registre, haurem d'escriure:
Si volem que l'espai en blanc sigui significatiu, hem d'escriure la sentència entre cometes. Existeixen dues formes de cerca per frase:La diferència entre cercar per frase exacta o cercar per part de la frase Pot semblar poc evident a primera vista. Ara bé, mentre que la cerca per part de la frase s’equipara a la cerca per frase que acostuma a aplicar-se dins el context dels cercadors web, l’ús de la cerca per frase exacta resulta molt més efectiva i ràpida com més es coneguin i especifiquin els valors a recuperar.
Un altra interessant forma de cerca apart de la cerca per paraula o
frase, és l’ús de la expressió regular de cerca, que
es realitza a partir del ús de barres inclinades en lloc de cometes.
Per exemple, la cerca anterior segons el mode de ‘part de la frase’ de
l’expressió 'muon decay'
és equivalent a l’expressió
regular/muon decay/
. La sintaxi de les expressions
regulars és molt potent, i permet construir cerques molt complexes.
Per obtenir més informació, recomanem la consulta de la secció expressió regular d’aquesta guia.
+
ANDellis +muon
matches all records that contain both the word ellis and the the word muon ellis muon
ditto, syntactic sugar ellis and muon
ditto, syntactic sugar -
NOTellis -muon
matches all records that contain the word ellis but that do not contain the word muon ellis not muon
ditto, syntactic sugar |
ORellis |muon
matches all records that contain at least one of the words ellis or muon
ditto, syntactic sugar
+
ANDellis +muon
(= ET) cherche toutes les notices contenant à la fois le mot ellis et le mot muon ellis muon
idem (simplification syntaxique) ellis and muon
idem (simplification syntaxique) -
NOTellis -muon
(= NON) cherche toutes les notices qui contiennent le mot ellis mais qui ne contiennent pas le mot muon ellis not muon
idem (simplification syntaxique) |
ORellis |muon
(= OU) cherche toutes les notices qui contiennent au moins l'un des deux mots. ellis or muon
idem (simplification syntaxique)
+
ANDellis +muon
recupera todos los registros que contengan ambas palabras: ellis y la palabra muon ellis muon
ídem, "syntactic sugar"(*ver nota) ellis and muon
ídem, "syntactic sugar" -
NOTellis -muon
recupera todos los registros que contengan la palabra ellis pero que no contenga la palabra muon ellis not muon
ditto, "syntactic sugar" |
ORellis |acelerador
recupera todos los registros que contengan al menos, una de las dos palabras ellis or muon
ídem, "syntactic sugar" (*)Nota de la traducción española: syntactic sugar es una espresión utilizada en inglés para describir "otra forma similar de llamar a una función"
+
ANDellis +muon
Recupera tots els registres que contenen ambdues paraules: ellis i la paraula muon ellis muon
ídem, "syntactic sugar" (*veure nota) ellis and muon
ídem, "syntactic sugar" -
NOTellis -muon
recupera tots els registres que contenen la paraula ellis però que no contenen la paraula muon ellis not muon
ídem, "syntactic sugar" |
ORellis |muon
recupera tots els registres que contenen, com a mínim, una de les dues paraules ellis or muon
ídem, "syntactic sugar" (*)Nota de la traducció catalana: syntactic sugar es una espressió emprada en anglès per a descriure "altre forma similar de cridar una funció"
Logical operations are automatically chained from left to right. For example, if you want to search for documents written by Ellis on muons or kaons, write:
which looks for(muon or kaon) and ellis
. Note that this
gives different results from:
which would search for (ellis and muon) or kaon
.
The left-to-right chaining behaviour permits you to easily refine
your search by adding/removing words with and/not or +/- operators.
For example, to exclude the documents on decay from the above search,
append -decay
:
Les opérations logiques sont chaînées de gauche à droite. Par exemple, si vous cherchez les documents écrits par Ellis sur les muons ou les kaons, écrivez:
qui recherche pour(muon or kaon) and ellis
. Notez que cela donne un résultat différent de:
qui cherche pour (ellis and muon) or kaon
Ce chaînage de gauche à droite permet de facilement améliorer votre
recherche en ajoutant/supprimant des mots avec les opérateurs and/not ou
+/-. Par exemple, pour exclure les documents sur le "decay" de la
recherche ci-dessus, ajoutez -decay
:
Los operadores lógicos se disponen de forma automática de izquierda a derecha. Logical operations are automatically chained from left to right. Por ejemplo, si queremos buscar documentos escritos por Ellis sobre muon o kaon, escribiremos:
ello nos realizará una búsqueda equivalente a(muon O
kaon) Y ellis
. Nótese también que se obtienen
resultados diferentes si introducimos
que si introducimos (ellis AND muon) OR kaon
.
La disposición de los elementos de izquierda a derecha permite
refinar fácilmente una búsqueda añadiendo o quitando palabras
utilizanto los operadores AND/NOT +/-.
Por ejemplo, para excluir los documentos sobre desintegración en la
búsqueda anterior, sólo hay que añadir -decay
:
Els operadors lògics es disposen de forma automàtica d’esquerre a dreta. Per exemple, si es volen recuperar documents escrits per Ellis sobre muon o kaon, escriurem:
es realitzarà una cerca equivalent a(muon OR kaon)
AND ellis
. Notis també que s’obtenen resultats diferents si
s’introdueix
que si s’introdueix (ellis AND muon) OR kaon
.
La disposició dels elements d’esquerre a dreta permet refinar
fàcilment una cerca afegint o traient paraules utilitzant els
operadors AND/NOT +/-.
Per exemple, per excloure els documents sobre desintegració a la cerca
anterior, només cal afegir -decay
:
This query returns records containing either gravity or supergravity, and either ellis or perelstein anywhere in the record.
Note that you can use any number of parentheses in the query, but
nesting of parentheses, such as foo AND (bar OR (fuux NOT quux))
, is not supported.
When indexing words, an attention is paid to index it both with and without punctuation, so that you should be able to search for terms containing special characters, such as C++, verbatim:
For example, to find records containing the LaTeX expression$e^{+}e^{-}$
in the title, type:
For example, to find document with the report number
hep-ph/0204133, type:
Note that the search is case-insensitive:
Lors de l'indexation des mots, nous veillons à les saisir avec et sans ponctuation, afin qu'il soit possible de rechercher des termes contenant des caractères spéciaux, comme dans C++:
Par exemple, pour trouver les notices contenant l'expression LaTeX$e^{+}e^{-}$
dans le titre, saisissez:
Par exemple, pour trouver le rapport avec le
numéro hep-ph/0204133, saisissez:
Notez que la recherche est insensible à la casse:
Cuando se indexan las palabras, se pone especial atención en indexarlas con y sin puntuación. Ello hace posible la búsqueda de términos que contienen caracteres especiales, como por ejemplo C++, textualmente:
Por ejemplo, para recuperar registros que contengan la expresión LaTeX$e^{+}e^{-}$
en el título, debemos escribir:
Por ejemplo, para recuperar un documento con el número de informe
hep-ph/0204133, debemos escribir:
Nótese que esta búsqueda es sensible a las mayúsculas:
Quan s’indexen les paraules, es posa especial atenció en que siguin indexades amb i sense puntuació. Això fa possible la cerca de termes que contenen caràcters especials, com per exemple C++, textualment:
Per exemple, per recuperar registres que contenen l’expresió LaTeX$e^{+}e^{-}$
al títol, cal escriure:
Per exemple, per recuperar un document amb número d'informe
hep-ph/0204133, cal escriure:
Observis que aquesta cerca és sensible a les majúscules:
The search engine works with Unicode UTF-8 so you can type your query strings in any language stored in the database. For example, to find the documents written by (or on) Пушкин, type:
Note that you don't have to type accents to find accented results. For example, typeLemaitre
to find papers by Lemaître:
IMPORTANT NOTE |
---|
Currently, words that include accented characters can only be retrieved by entering accented characters in the query. |
Le moteur de recherche prend en compte les caractères Unicode UTF-8, afin de rendre possible la recherche dans n'importe quelle langue. Par exemple, pour trouver les documents écrits par (ou concernant) Пушкин, saisissez:
Notez que les accents sont optionnels. Par exemple, saisissezLemaitre
pour trouver des articles de Lemaître.
NOTE IMPORTANTE |
---|
Actuellement, les mots qui contiennent des accents ne peuvent être retrouvés qu'en entrant les accents dans la requête. |
El motor de búsqueda se basa en el estandar Unicode UTF-8, lo que hace posible introducir cadenas de búsqueda en cualquier idioma que se encuentre en la base de datos. Por ejemplo, para recuperar documentos escritos por (o sobre) Пушкин, debemos escribir:
Obsérvese que no es necesario introducir acentos para conseguir registros que contienen palabras acentuadas. Por ejemplo, escribiremosLemaitre
para buscar artículos de Lemaître:
NOTA IMPORTANTE |
---|
En estos momentos, las palabras que incluyen caracteres acentuados sólo pueden recuperarse entrando los caracteres acentuados en la consulta. |
El motor de cerca es basa en l’estàndard Unicode UTF-8, lo que fa possible introduir cadenes de cerca en qualsevol llengua que es trobi a la base de dades. Per exemple, per recuperar documents escrits per (o sobre) Пушкин, cal escriure:
Notis que no és necessari introduir accents per aconseguir registres que contenen paraules accentuades. Per exemple, escriuremLemaitre
para recuperar articles de Lemaître:
NOTA IMPORTANT |
---|
En aquests moments, les paraules que inclouen caràcters accentuats només es poden recuperar entrant els caràcters accentuats a la consulta. |
The word truncation is supported via asterisk (*) wildcard character. The wildcard instructs the search engine to match any number of characters in that place. For example, to find records that contain words muon, muons, muonic etc, type:
The wildcard query works both in prefix and infix position. For example, to get all the words that start by CERN-TH and end by 31, type: Note that the wildcard will be ignored if you try to apply it to very short words, such as a*: The wildcard character can be used also in the phrase searching mode. For example, to find all the documents whose title starts by "Neutrino mass", type: Recall that we have introduced exact and partial phrase search modes. Actually, a partial phrase search mode launches an exact search enclosed within wildcards: we could say that'foo bar
baz'
equals to "*foo bar baz*"
. Now you can
see why the partial phrase search is slow: due to the usage of two
asterisks in front and after the text, each and every title in the
database has to be looked up to determine whether it matches or
not. (There are currently no partial phrase indexes.)
La troncature des mots est symbolisée à l'aide d'un caractère de remplacement (un astérisque (*)). Le caractère de remplacement indique au moteur de recherche que le caractère à cet emplacement peut être de n'importe quel type. Par exemple, pour trouver les résultats contenant les mots muon, muons, muonic etc, saisissez:
Les requêtes à l'aide de caractères de remplacement fonctionnent lorsque le caractère est placé en position de préfixe ou d'infixe. Par exemple, pour obtenir tous les termes commençant par CERN-TH et finissant par 31, saisissez: Notez que le caractère de remplacement ne sera pas pris en compte s'il est inséré avant ou après une lettre isolée (a*, par exemple): Le caractère de remplacement peut également être utilisé dans le cadre de la recherche par phrase. Par exemple, pour trouver tous les documents dont le titre commence par "Neutrino mass", saisissez: Nous vous avons déjà expliqué les différences qui existent entre les modes de recherche de phrases exactes et de phrases partielles. On peut dire qu'un mode de recherche de phrases partielles lance une recherche exacte incluse entre des caractères de remplacement:'foo bar baz'
est ainsi l'équivalent
de '*foo bar baz*'
. Vous comprenez maintenant
pourquoi la recherche de phrases partielles est plus lente: en
raison de l'utilisation de deux astérisques au début et à la fin
du texte de recherche, tous les titres de la base de données
doivent être examinés afin de déterminer s'ils correspondent ou
non (il n'existe actuellement pas d'index des phrases
partielles).
El truncamiento de una palabra se efectua a través del uso del asterisco (*). Este comodín indica al motor de búsqueda que retorne cualquier número de carácteres en su lugar. Por ejemplo, para recuperar registros que contengan las palabras muon, muonic, muons etc, debemos escribir:
La búsqueda por comodín puede utilizarse tanto en posición de prefijo como de sufijo. Por ejemplo, para recuperar todas las palabras que comiencen por CERN-TH y acaben con 31, debemos escribir: Obsérvese que el comodín se ignorará si tratamos de utilizarlo en palabras demasiado cortas, como por ejemplo a*: El carácter comodín también puede usarse en el modo de búsqueda por frase. Por ejemplo, para recuperar todos los documentos cuyo título comience con "Neutrino mass", debemos escribir: Recordamos que en esta búsqueda hemos introducido las formas de 'frase exacta' y 'parte de la frase'. En realidad, el modo de búsqueda de 'parte de la frase' lanzará una búsqueda exacta sin necesidad de utilizar los comodines: tanto podemos utilizar'foo bar baz'
como "*foo bar baz*"
.
Esto ayuda a comprender porqué la búsqueda de
palabras en una parte de la frase es lenta: debido al uso de dos
asteriscos delante y detrás del texto, todos y cada de los
registros de la base de datos son comprobados para determinar si se
corresponden a la búsqueda o no. Actualmente no hay ningún índice
de búsqueda que indexe partes de frase.
El truncament d’una paraula es realitza a través de l’ús del símbol asterisc (*). Aquest comodí indica al motor de cerca que retorni qualsevol número de caràcters en el seu lloc. Per exemple, per recuperar registres que continguin les paraules astronomia, astrònoms, astronòmics etc, cal escriure:
La cerca por comodí pot utilitzar-se tant en posició de prefix com de sufix. Per exemple, per recuperar totes les paraules que comencin per CERN-TH i acabin amb 31, cal escriure: Notis que el comodí s’ignora si es tracta d’utilitzar-lo amb paraules massa curtes, com per exemple a*: El caràcter comodí també pot utilitzar-se al mode de cerca per frase. Per exemple, per recuperar tots els documents el títol dels quals comenci per "Neutrino mass", cal escriure: Recordem que a aquesta cerca hem introduït les formes de 'frase exacta' i 'part de la frase'. En realitat, el mode de cerca per 'part de la frase' ens llençarà una cerca exacta sense necessitat de fer servir els comodins: tant podem utilitzar'foo bar
baz'
com "*foo bar baz*"
.
Això ajuda a comprendre perquè la cerca de
paraules a una part de la frase és lenta: degut a l’ús de dos
asteriscs davant i darrera del text, tots i cadascun dels registres
de la base de dades es comproven per determinar si es corresponen o
no amb la cerca introduïda. Actualment no hi ha cap índex de cerca
que indexi parts de frase.
Searching within various bibliograpic fields (such as title,
author) is supported via Google's "site:"
like syntax.
If a search term is preceded by a field name and a colon, then the
term is searched for inside this field only. For example, to find
documents containing the word ellis within author index,
type:
author
, title
,
reportnumber
, abstract
,
keyword
, year
, experiment
,
fulltext
, and reference
.
La recherche au sein de différents champs bibliographiques (titre, auteur, etc.) est prise en charge de manière similaire à la syntaxe de Google. Si un élément de recherche est précédé d'un nom de champ et de deux points, le terme n'est recherché que dans le champ donné. Par exemple, pour trouver les documents contenant le mot ellis dans l'index des auteurs, saisissez:
Pour sélectionner les documents écrits par Ellis dont le titre contient des mots tels que muon, muons, muonic, saisissez: Pour sélectionner les documents écrits par l'expérience NA60 en 2001, saisissez: Les champs les plus fréquemment utilisés sont les suivants:author
(auteur), title
(titre),
reportnumber
(num. de rapport),
abstract
(résumé), keyword
(mot-clef),
year
(année), experiment
(expérience),
fulltext
(contenu), and reference
(référence).
La búsqueda realizada utilizando varios campos bibliográficos
(tales como título, autor) se realiza a través de una sintaxis
similar a la que utiliza Google en sus búsquedas tipo
"site:"
. Si un término de búsqueda es precedido por
un nombre de campo seguido por dos puntos este término se buscará
únicamente en el campo especificado. Por ejemplo, para recuperar
documentos que contienen la palabra ellis dentro del
índice de autores, debemos escribir:
author
, title
,
reportnumber
, abstract
,
keyword
, year
, experiment
,
fulltext
, and reference
.
La cerca realitzada utilitzant diversos camps bibliogràfics (Tals
com títol, autor) es realitza a través d’una sintaxi similar a
l’emprada per Google en les Seves cerques tipus "site:"
.
Si un terme de cerca es precedit per un nom de camp seguit per dos
punts aquest terme es cerca únicament dins el camp especificat. Per
exemple, per recuperar documents que contenen la paraula
ellis dins l’índex d’autors, cal escriure:
author
, title
,
reportnumber
, abstract
,
keyword
, year
, experiment
,
fulltext
, and reference
.
The regular expression searching mode is mostly for the power users acquainted with the traditional Unix/POSIX regexp syntax. In the Simple Search interface you can trigger it by using slashes instead of quotes:
while in the Advanced Search interface you can select the matching type explicitely by using the selection box menu. The above example will find all the titles that start by the letter E, followed by any number of any characters, and end by the letter s.Les expressions régulières sont réservées à l'usage des utilisateurs avancés, familiers de la syntaxe des regexp Unix/POSIX. Dans le mode de Recherche Simple, on définit une expression régulière en substituant le signe / aux guillemets:
alors que dans le mode de Recherche Avancée il est possible de sélectionner explicitement la recherche par expressions régulières dans la liste des types de recherches. L'exemple ci-dessus va trouver tous les titres commençant pas la lettre E, suivi par n'importe quel nombre de caractères et se terminant par la lettre s.El uso del modo de búsqueda por expresión regular está dirigida sobre todo a usuarios avanzados que conocen la sintaxis tradicional Unix/POSIX regexp. En el interfaz de consulta simple se puede forzar este modo usando barras inclinadas en lugar de comillas:
mientras que en el modo de búsqueda Avanzado se puede seleccionar explícitamente este modo de búsqueda seleccionandolo en el menú desplegable. En el ejemplo anterior se recuperarían todos los títulos que comienzan por la letra E, seguida de cualquier número o cualquier carácter, y que terminen por la letra s.L’ ús del mode de cerca per expressió regular està dirigida sobretot a usuaris avançats que coneixen la sintaxi tradicional Unix/POSIX regexp. A l’interficie de consulta simple es pot forçar aquest mode utilitzant les Barres inclinades enlloc de comentes:
Al mode de cerca Avançada es pot seleccionar explícitament aquest mode de cerca seleccionant-lo al menú desplegable. a l’exemple anterior es recuperarien tots els títols que comencen per la lletra E, seguida de qualsevol número o qualsevol caràcter, i que acabin per la lletra s.Another example could be an author search for an author expressed in the database as either Ellis, J or Ellis, John:
Autre exemple: la recherche d'un auteur dont le prénom peut être abrégé ou entier, comme Ellis, J ou Ellis, John:
Otro ejemplo similar es el de la búsqueda por autor de un autor que se ha introducido en la base de datos como Ellis, J o bien como Ellis, John:
Un altre exemple similar és el de la cerca per autor d’un autor que ha estat introduït a la base de dades com Ellis, J o bé com Ellis, John:
The regular expression search enables you to formulate very specific word proximity queries. For example, let us find all titles containing words dense and matter that are separated by at most one word that doesn't contain the letter l:
Une expression régulière vous permet de définir des paramètres de proximité entre plusieurs termes. Par exemple, rechercher tous les titres contenant les mots dense et matter séparés par un seul mot ne contenant pas la lettre l:
La búsqueda por expresión regular permite formular consultas de palabras muy específicas por su proximidad. Por ejemplo, permite recuperar registros cuyos títulos contienen las palabras dense y matter y que estén separadas al menos por una palabra que no contenga la letra l:
La cerca per expressió regular permet formular consultes de paraules Molt específiques per proximitat. Per exemple, permet recuperar registres Els títols dels quals contenen les paraules dense i matter i que estiguin separades, al menys, per una paraula que no contingui la lletra l:
Note that you can also use character intervals such as
[a-k]
and occurrence counts such as {3}
.
For example, let us find all preprints that do not follow the year
cataloguing policy, that is YYYY to denote year, optionally
followed by ? or by another -YYYY:
[:alnum:]
A noter que vous pouvez utiliser des intervalles
comme [a-k]
ou [0-9]
et définir la longueur
du mot, {3}
p.ex., chercher l'ensemble des "Preprints"
dont la date ne suit pas la règle de catalogage, soit YYYY
pour spécifier une l'année de publication, éventuellement suivi
par ? ou une autre année -YYYY (p.ex. 2003-2004 sera
exclus) :
[:alnum:]
Obsérvese que también pueden utilizarse carácteres de intervalo
como [a-k]
y contadores de ocurrencia como
{3}
. Por ejemplo, podemos recuperar todos los pre-prints
que no se corresponden con la política de catalogación AAAA
para describir los años, opcionalmente seguida por ? o por
otro -AAAA:
[:alnum:]
Observis que també poden emprar-se caràcters d’interval com
[a-k]
i contadors de concurrència com {3}
.
Per ejemple, podem recuperar tots els pre-prints que no es
corresponguin amb la política de catalogació AAAA per
descriure anys, opcionalment seguida per ? o per altre
-AAAA:
[:alnum:]
To learn more about POSIX regular expressions, please consult the Wikipedia regexp article and the MySQL regexp documentation.
Pour plus d'informations sur les expressions régulières, voir les articles de Wikipedia et MySQL à ce sujet.
Para conocer más acerca de las expresiones regulares POSIX, se recomienda la consulta de Wikipedia regexp article y MySQL regexp documentation.
Per conèixer més sobre les expressions regulars POSIX, es recomana la Consulta de Wikipedia regexp article i MySQL regexp documentation.
The span query is provided via a ->
sign. For
example, to search for all documents on muon decay published
between 1983 and 1992, type:
La requête de plages est disponible via le signe ->. Par exemple, pour rechercher tous les documents relatifs au muon decay publiés entre 1983 et 1992, saisissez:
Pour trouver tous les documents dont l'orthographe du nom de l'auteur est comprise entre Ellis, J to Ellis, Qqq, saisissez:La consulta por rango se realiza a través del signo
->
. Por ejemplo, para recuperar todos los documentos
sobre par motor publicados entre 1983 y
1992, debemos escribir:
La consulta por rang es realitza a través del signe
->
. Per exemple, per recuperar tots els documents sobre
par motor publicats entre 1983 i 1992, cal
escriure:
It is possible to search in citation network by means
+ of citedby
and refersto
search operators.
+ For example, to find out who cites hep-th/0201100, you can type:
For example, to find out which papers are cited by Klebanov, you can type:
+ + + +To set up a cite alert for new papers citing author I. Klebanov, you can type:
+ + + +Note that refersto
and citedby
search
+ operators work on any regular query. For example, to find all
+ papers that cite papers that are tagged with the gravitino keyword,
+ type:
Note also that these operators can be freely combined with + regular metadata search. For example, to find papers authored by + Klebanov that are cited by Papadimitriou but that do not cite any + of Papadimitriou's papers themselves, type:
+ + + +All the syntax mentioned above can be combined together in one query. For example, to find documents that have the word ellis inside author fields, that do not contain words like muon, 'muonic' etc in any field, that contain the phrase (or the substring, to be more precise) 'dense quark matter' inside abstract fields, and that were published in year starting by digits '200', type:
Note that the default "any field" global index does contain only the metadata terms, not the citation nor fulltext terms. You have to explicitely mentionfulltext
or reference
index to search there. For example, to find the term Higgs
in either metadata, references or fulltext files, type:
This permits an interesting combination of metadata, fulltext and citation search in
the same query. For example, to get all documents written by
Lin whose fulltext files contain the words
Schwarzschild and AdS, and who cite journal
Adv. Theor. Math. Phys., type:
Les syntaxes détaillées ci-dessus peuvent être combinées dans une seule requête. Par exemple, pour trouver les documents dont le champ d'auteur contient le mot ellis, dont aucun des champs ne contient des mots tels que muon, 'muonic' etc. et dont le champ de résumé contient l'expression (ou sous-chaîne, pour être plus précis) 'dense quark matter', et qui ont été publiés dans les années 2000 et plus, saisissez:
Notez que la recherche dans "tous les champs" ne s'effectue que sur les métadonnées, et non pas sur les citations, ni le contenu des documents. Il vous faut explicitement indique une recherche dans les champsfulltext
ou reference
pour chercher dans ces données. Par exemple, pour trouver le terme Higgs dans les métadonnées, les références et le contenu des fichiers, saisissez:
Ceci permet de combiner la recherche dans les métadonnées, le
contenu des fichiers et les citations dans une seule requête. Par
exemple, pour trouver tous les documents écrits par
Lin dont les fichiers contiennent les mots
Schwarzschild et AdS, et citant le journal
Adv. Theor. Math. Phys., saisissez:
Toda la sintaxis mencionada anteriormente se puede combinar en una misma consulta. Por ejemplo, para recuperar documentos que contienen la palabra ellis dentro del campo autor, y que no contienen palabras como muon, 'muonic', etc., en ningún otro campo, y que contienen (o subcadena de palabras, para ser más precisos) ‘dense quark matter’ dentro del campo de resumen, y que han sido publicados dentro de los años que comienzan por los dígitos '200', debe escribirse:
Obsérvese que la opción de índice global “cualquier campo” por defecto contiene únicamente términos de metadatos, no del texto completo ni de las citas bibliográficass. Es necesario especificar explícitamente las opciones de buscar en el índicetexto completo
o de
cita bibliográfica
si se desea buscar en estos campos.
Por ejemplo, para recuperar el término Higgs tanto dentro de
los metadatos, las citas o el texto completo, debe escribirse:
Ello permite una interesante combinación de metadatos, texto completo
y citas dentro de una misma búsqueda. Por ejemplo, para recuperar
todos los documentos escritos por Lin que en el texto
completo contengan las palabras Schwarzschild y AdS,
que citen la revista Adv. Theor. Math. Phys., debe
escribirse:
Tota la sintaxi mencionada anteriorment es pot combinar en una mateixa consulta. Per exemple, per recuperar documents que contenen la paraula ellis dins el camp d’autor, i que no contenen paraules com muon, 'muonic', etc., a cap altre camp, i que contenen la frase (o subcadena de paraules, per ser més precisos) ‘dense quark matter’ dins el camp de resum, i que han estat publicats dins els anys que comencen pels dígits '200', cal escriure:
Observis que l’opció d’índex global “qualsevol camp” per defecte conté només els termes de metadades, no del text complet ni de les referències bibliogràfiques. Cal especificar explícitament les opcions de cercar a l’índextext complet
o de
referència bibliogràfica
si volem cercar per aquests
camps. Per exemple, per recuperar el terme Higgs tant dins
les metadades, les referències o el text complet, cal escriure:
Això permet una interessant combinació de metadades, text complet i
referències dins una mateixe cerca. Per exemple, per recuperar
tots els documents escrits per Lin que en el text complet
continguin les paraules Schwarzschild and AdS,
que citi la revista Adv. Theor. Math. Phys., cal escriure:
black hole
than for "black hole"
.and
, of
, or CERN
.black hole
que "black hole"
.et
, de
ou CERN
.agujero
negro
que por "agujero negro"
.y
,
de
, o siglas como CERN
.forat
negre
que per "forat negre"
.i
, de
, o sigles com
CERN
.You can search for an author in many ways, each having its own advantages and disadvantages.
Ellis
J
within the author index, it means that two queries (for the
words Ellis
and J
) are effected first and a
boolean AND is performed next:
Such a query would match also a document whose first author is Ellis, R and the second author Finch, A J, which is probably not what you wanted. While the search is very fast and you would have found the results for the author you were looking for, such a technique could have returned you many false positives, as the one cited above. Instead of searching for words, a more suitable technique to apply in this case is to search for phrases which will permit you to achieve higher search precisions.
Il existe différentes méthodes de recherche d'un auteur. Chaque méthode a ses avantages et ses inconvénients.
Ellis J
dans le champ de l'auteur, deux requêtes (pour
les mots Ellis
et J
) sont d'abord
effectuées. Le booléen ET n'est utilisé que par la suite:
Une telle requête inclut également les documents dont le premier auteur est Ellis, R et le second Finch, A J. Or il est possible qu'il ne s'agisse pas du résultat que vous recherchez. La recherche est très rapide et peut vous présenter un certain nombre de résultats correspondant à l'auteur recherché. Il est néanmoins également possible qu'une telle technique vous renvoie de nombreuses réponses incorrectes, comme celle susmentionnée. Dans un tel cas, il est plus adapté de rechercher des phrases plutôt que des termes. Vous pouvez ainsi affiner votre recherche.
La búsqueda por autor puede realizarse de diversas formas, cada una de las cuales presenta sus ventajas y desventajas.
Ellis J
dentro del
índice de autores, ello se interpretará como dos consultas (para las
palabras Ellis
y J
) que se efectuarán en
primer lugar, y una booleana Y que se realizará después.
La consulta realizada de este modo recuperará también un documento que presenta como primer autor a Ellis, R y como segundo autor Finch, A J, lo cual, probablemente, no es lo deseado. La búsqueda se ha realizado muy rápidamente y se han recuperado registros sobre el autor requerido, sin embargo, los resultados recuperados siguiendo este método pueden no ser pertinentes, tal y como ocurre en el ejemplo citado anteriormente. En lugar de buscar por palabras, la técnica más conveniente que debe aplicarse en este caso es la búsquda por frase, que permite conseguir mayor precisión.
La cerca per autor es pot realitzar de diverses formes, cadascuna de les quals presenta els seus avantatges i les seves desavantatges.
Ellis J
dins l’índex d’autors, s’interpretarà como a dues
consultes (per a les paraules Ellis
i J
) que
es realitzaran en primer lloc, i una booleana I que es realitzarà
després.
La consulta realitzada d’aquesta forma recuperarà també un document que tingui com a primer autor a Ellis, R i com a segon autor a Finch, A J, fet que, probablement, no es el desitjat. La cerca s’ha realitzat amb molta rapidesa i s’han recuperat registres sobre l’autor requerit, ara bé, els resultats obtinguts seguint aquest métode poden no ser pertinents, tal i com passa a l’exemple citat anteriorment. En lloc de cercar per paraules, la tècnica més convenient que s’ha d’aplicar en aquests casos és la cerca per frase, que permet aconseguir major grau de precisió.
This way of searching gives you the highest precision and no false positives. (Assuming there are no other authors whose names are spelled Ellis, J, an assumption that is often false*.) The search is very fast.
This way of searching still keeps the highest precision and no false positives. (Assuming there are no other authors whose names are spelled Ellis, J or Ellis, John, an assumption that is often false*.) The search is fast.
It would match all author names that start by the text
Ellis, J
, i.e. not only the wanted forms Ellis,
J and Ellis, John, but also Ellis, Jim, or
Ellis, John Rolfe, or Ellis, Jonathan Richard.
This way of searching returns you more results, which may be suitable in case you don't know how the names are spelled in the database. But you also risk the eventuality of getting false positives. The search is relatively fast.
It would find not only all the authors mentioned above, but also
the ones whose names contain the expression Ellis, J
anywhere inside the name, such as De Lellis, Jim. It thus
gives you the largest possible number of hits at the largest risk of
false positives. The search is relatively slow.
(Note though that this way of searching may be very handy in case of compound family names such Pepe-Altarelli, M or 't Hooft, G where a casual user query for Hooft, G would match the wanted author, unlike the methods mentioned above.)
*NOTE:
If you produce your own list of publications and you notice that
sometimes your first name is spelled abbreviated and sometimes in
full, or if you want to identify your publications among several
authors with the same abbreviation, please contact the administrators of
Cette méthode de recherche vous permet de procéder à une recherche très précise et d'éviter les réponses incorrectes (si l'on part du principe, souvent erroné, qu'aucun autre auteur dont le nom est orthographié Ellis, J existe dans la base de données). La recherche est très rapide.
Cette méthode de recherche vous permet toujours de procéder à une recherche très précise et d'éviter les réponses incorrectes (si l'on part du principe, souvent erroné, qu'aucun autre auteur dont le nom est orthographié Ellis, J ou Ellis, John existe dans la base de données *). La recherche est rapide.
L'ensemble des noms d'auteurs qui commencent par
Ellis, J
, i.e. non seulement les formes recherchées Ellis,
J et Ellis, John, mais aussi Ellis, Jim, ou
Ellis, John Rolfe, ou Ellis, Jonathan Richard est affiché.
Ce mode de recherche permet d'obtenir plus de résultats. Il peut être utile lorsque vous ne connaissez pas l'orthographe des noms dans la base de données. Vous risquez néanmoins d'obtenir des réponses incorrectes. La recherche est relativement rapide.
Ce mode permet non seulement de trouver tous les auteurs mentionnés
ci-dessus mais également ceux contenant l'expression Ellis,
J
au sein du nom, tels que De Lellis, Jim. Vous
disposez ainsi du plus grand nombre possible de résultats. Le risque
de réponses incorrectes est néanmoins très élevé. La recherche est
relativement lente.
(Notez que cette méthode de recherche peut néanmoins s'avérer très utile lors de la recherche de noms de famille composés tels que Pepe-Altarelli, M or 't Hooft, G, où une requête normale pour Hooft, G permet de trouver l'auteur recherché, contrairement aux méthodes susmentionnées).
*Remarque: si
vous créez votre propre liste de publications et remarquez que le
prénom est parfois épelé de manière abrégée et d'autres fois de
manière complète ou si vous souhaitez identifier vos publications
parmi celles de différents auteurs disposant du même nom en abrégé,
veuillez contacter les
administrateurs de
Esta técnica de búsqueda confiere mayor precisión y evita falsos resultados aparentemente positivos. (La presunción de que no existen otros autores cuyo nombre se escriba como Ellis, J, en ocasiones puede no ser cierta*.) La búsqueda se realizará con mucha rapidez.
Este modo de búsqueda nos ofrece aún mayor precisión y evita falsos resultados positivos (o no pertinentes). (La presunción de que no hay más autores que se escriban como Ellis, J O Ellis, John, en ocasiones puede no ser cierta *.) La búsqueda es muy rápida.
Ello recuperará todos los nombres de autor que comienzan con el
texto Ellis, J
, no sólo con las formas requeridas en el
ejemplo Ellis, J y Ellis, John, sino también
Ellis, Jim, o Ellis, John Rolfe, o Ellis,
Jonathan Richard.
Esta búsqueda retornará muchos más resultados, pero puede resultar conveniente en el caso en que se desconozca la forma de introducción de los nombres en la base de datos. Sin embargo, aumenta el riesgo de obtener resultados poco pertinentes. La búsqueda es relativamente rápida.
Esta búsqueda recupera no sólo todos los autores mencionados, sino
también todos aquellos cuyos nombres contengan la expresión
Ellis, J
en cualquier parte de su nombre, como por
ejemplo De Lellis, Jim. Ello aumenta enormemente las
posibilidades de obtener registros con un alto riesgo de ser poco
pertinentes. La búsqueda es relativamente lenta.
(Obsérvese que este modo de búsqueda puede resultar muy práctico para apellidos compuestos tales como Pepe-Altarelli, M o 't Hooft, G en la que una consulta puntual de usuario por Hooft, G recuperará el autor requerido, a diferencia de los métodos mencionados anteriormente.)
*NOTA:
Si es autor de su propia lista de publicaciones y detecta que algunas
veces su nombre se escribe de forma abreviada y a veces completo, o si
desea identificar sus publicaciones entre diversos autores con la
misma forma abreviada, por favor contacte con losadministradores de
Aquesta tècnica de cerca confereix major grau de precisió i evita falsos resultats aparentement positius. (La presumpció de que no existeixen altres autores els noms dels quals s’escrigui com Ellis, J, en ocasions pot no ser certa*.) La cerca es realitzarà con amb molta rapidesa.
Aquest mode de cerca ens ofereix encara major grau de precisió i evita falsos resultats positius (o no pertinents). (La presumpció de que no hi ha més autors que s’escriguin com Ellis, J O Ellis, John, en ocasions pot no ser certa *.) La cerca és molt ràpida.
Això recuperarà tots els noms d’autor que comencen amb el text
Ellis, J
, no només amb les formes requerides a l’exemple
Ellis, J i Ellis, John, sinó també Ellis,
Jim, o Ellis, John Rolfe, o Ellis,Jonathan
Richard.
Aquesta cerca retornarà molts més resultats, però pot resultar convenient en el cas que es desconegui la forma d’introducció dels noms a la base de dades. Ara bé, augmenta el risc d’obtenir resultats poc pertinents. La cerca és relativament ràpida.
Aquesta cerca recupera no només tots els autors mencionats, sinó
també tots aquells els noms dels quals continguin l’expresió
Ellis, J
a qualsevol part del seu nom, com per exemple
De Lellis, Jim. Això augmenta enormement les possibilitats
d’obtenir registres amb un alt risc de ser poc pertinents. La cerca
és relativament lenta.
(Observis que aquest mode de cerca pot resultar molt pràctic per a cognoms compostos, tals com Pepe-Altarelli, M o 't Hooft, G en els que una consulta d’una consulta puntual de usuario por Hooft, G recuperarà l’autor requerit, a diferència dels mètodes mencionats anteriorment.)
*NOTA:
Si es autor de la seva pròpia llista de publicacions i detecta que
algunes vegades el seu nom s’escriu de forma abreujada i de vegades
complet, o si desitja identificar les seves publicacions entre
diversos autors amb la mateixa forma abreujada, sis plau, contacti amb
els administradors de
You may select a certain field according to which sort the search results, for example to sort the results by main title. However, sometimes you may want to sort by a report number and it happens that your documents have several of them. For example, the report numbers hep-ph/0204140, CERN-TH-2002-069 and RM3-TH-02-4 all denote the same document. Now if you sort your search results set containing this document, the system will take into consideration the first report number, that may be either of these three. Sometimes you may want to classify this document under its hep-ph number, sometimes under its CERN number, depending on whether you produce a list of CERN or hep-ph publications. How can you influence the search engine to prefer one report number rather than the other?
In other words, the search engine by default answers a query
like "sort by first author" or "sort by first report number", but
sometimes you may want to ask the search engine to "sort by first
report number that starts by the text CERN-". The latter
possibility is available via a "silent" sort parameter called
sp
(for "sort pattern") that sorts preferentially
according to the given textual pattern if they can be found. The
parameter is "silent" in a way that it is not present in the search
interface, you have to add it manually to your search URL.
For example, to get all CERN-TH publications of the year 2001
sorted by their CERN-TH numbers, you would search for
CERN-TH-2001*
within reportnumber
index,
and on the search results page, being satisfied with the results,
you would add &sp=CERN-TH
to the URL to sort the
results preferentially by CERN-TH report numbers, to get a nicely
sorted list of all CERN-TH 2001 publications.
Il est possible de sélectionner le critère d'après lequel les résultats de la recherche sont ordrés, par exemple pour trier les résultats par titre. Cependant, il arrive parfois que l'on cherche à trier selon le numéro de rapport, alors que certains documents en ont plusieurs. Par exemple, les numéros de rapport hep-ph/0204140, CERN-TH-2002-069 et RM3-TH-02-4 appartiennent tous au même document. Si ce document se trouve dans vos résultats, le système ne prendra en compte qu' seul de ces numéros pour le tri. Il arrive que l'on cherche à trier parfois selon la référence hep-ph, et d'autres fois selon la référence CERN, selon que l'on veuille produire une liste des publications CERN ou hep-ph. Comment demander au moteur de recherche d'utiliser un des numéros plutôt que les autres?
En d'autres termes, par défaut le moteur de recherche répond à
une requête "trier par le premier auteur" ou "trier par le
premier numéro de rapport", mais il arrive qu'il soit nécessaire
de demander "trier par le premier numéro de rapport qui commence
par le texte CERN-". Cette dernière requête peut être
formulée via un paramètre de tri "silencieux"
appelé sp
(pour "search pattern", motif de
tri) qui trie de préférence selon le motif textuel qui lui
est fourni. Ce paramètre est "silencieux" dans le sens qu'il
n'est pas disponible dans l'interface web, mais doit être ajouté
manuellement à l'URL
Par exemple, pour obtenir toutes les publications de l'année
2001 triées d'après leur référence CERN-TH, il faut
chercher CERN-TH-2001*
dans
l'index reportnumber
, et sur la page des résultats
(une fois que ceux-ci sont satisfaisants), ajouter
&sp=CERN-TH
à l'URL pour obtenir
la liste
triée selon ce paramètre.
Es posible seleccionar un campo determinado en función del tipo de ordenación de los resultados de búsqueda, por ejemplo para ordenarse los resultados por el título principal. De este modo, en ocasiones puede ocurrir que se desee ordenar los documentos por el código de referencia y que un mismo documento tenga más de uno. Por ejemplo, los códigos hep-ph/0204140, CERN-TH-2002-069 y RM3-TH-02-4 apuntan todos al mismo documento. Si se ordena el conjunto de resultados de búsqueda contenidos en el documento, el sistema tendrá en cuenta el primer número de informe, que puede ser cualquiera de los tres. En ocasiones se puede desear clasificar un documento según un determinado código de referencia hep-ph , u otro CERN> según si se ha publicado en una colección de publicaciones de CERN o hep-ph. ¿Como se puede influir en el motor de búsqueda para priorizar un código antes que otro?
En otras palabras, el motor de búsqueda responde por defecto a
una pregunta similar a “ordena por el primer autor” u “ordena por
el primer código de informe”, pero en ocasiones se desea instar al
buscador para que ordene por el “primer código de informe que
comience por el texto CERN-". Esta opción es posible a
través del uso de un paràmetre de ordenación “invisible” denominado
sp
(para a "ordenar según un patrón") que permite
ordenar siguiendo un patron de preferencia dado. Este parámetro es
“invisible” desde el punto de vista de que no está presente en el
interfaz de búsqueda, sino que debe ser añadido manualmente en el
URL de la búsqueda.
Por ejemplo, para recuperar todas las publicaciones del CERN-TH del
año 2001 ordenados por su código, debe buscarse por
CERN-TH-2001*
dentro del índice código de
informe
, y en la página de resultados de búsqueda, cuando
esté satisfecho con los resultados obtenidos, añadir
&sp=CERN-TH
en el URL a fin de ordenar los resultados
sgún los códigos de informe CERN-TH, y conseguir una correcta
ordenación del listado de todas las publicaciones CERN-TH del
2001.
Es possible seleccionar un camp determinat en funció del tipus d’ordenació dels resultats de la cerca, per exemple per ordenar els resultats pel títol principal. D’aquesta forma, en ocasions pot passar que es desitgi ordenar els documents pel codi de referència i que un mateix document en tingui més d’un. Per exemple, els codis hep-ph/0204140, CERN-TH-2002-069 i RM3-TH-02-4 apunten tots al mateix document. Si s’ordena el conjunt de resultats de cerca que conté el document, el sistema tindrà en consideració el primer número d’informe, que pot ser qualsevol dels tres. En ocasions es desitja classificar un document segons un determinat codi de referència hep-ph , o altre CERN> segons si ha estat publicat a una col•lecció de publicacions CERN o hep-ph. Com es pot influir en el motor de cerca per prioritzar un codi abans de l’altre?
En altres paraules, el motor de cerca respon per defecte a una
pregunta semblant a “ordena pel primer autor” o “ordena pel primer
codi d’informe”, però en ocasions es pot desitjar instar al
cercador per tal que ordeni pel “primer codi d’informe que comenci
pel text CERN-". Aquesta darrera opció és possible a
través d’un paràmetre d’ordenació “invisible” denominat
sp
(per a "ordenar segons un patró") que permet
ordenar segons un patró de preferència donat. Aquest paràmetre és
“invisible” des del punt de vista que no és present a l’interfície
de cerca, sinó que ha d’afegir-se manualment a la URL de cerca.
Per exemple, per recuperar totes les publicacions del CERN-TH de
l’any 2001 ordenats pel seu codi, cal cercar per
CERN-TH-2001*
dins l’índex de códi
d’informe
, i a la pàgina de resultats de cerca, quan
s’estigui satisfet amb els resultats obtinguts, afegir
&sp=CERN-TH
a la URL per tal d’ordenar els resultats
segons els codis d’informe CERN-TH, i aconseguir una correcta
ordenació de la llista de totes les publicacions CERN-TH del
2001.
On the search results page, links to other servers like Google, SPIRES or KEK are automatically proposed in a box entitled "Try your search on". You can simply click on the proposed links to run your query on these search engines.
Note that the links aren't printed if the search engine doesn't support it. For example, SPIRES or KEK cannot search for terms within "any field", so we don't link to them in these cases.
Sur la page des résultats, des liens vers d'autres serveurs tels que Google, SPIRES ou KEK sont automatiquement proposés dans une zone appelée "Essayez votre requête sur ...". Il suffit de cliquer sur ces liens pour obtenir les réponses de ces moteurs.
Notez que ces liens ne sont pas toujours imprimés pour tous les moteurs de recherche. Par exemple, SPIRES et KEK ne supportent pas la recherche par mot dans "tous les champs".
A la pàgina de resultats de cerca, s'ofereixen automàticament enllaços a altres servidors com Google, SPIRES o KEK sota el nom de "Proveu la vostra cerca a...". Amb un simple clic sobre els enllaços proposats es pot enviar la cerca realitzada en aquests cercadors.
Observis que els enllaços a altres cercadors no es mostren si el cercador no suporta la cerca. Per exemple, SPIRES o KEK no poden cercar termes dintre del camp "qualsevol camp", de forma que en aquests casos, el sistema no els enllaçarà.
En la página de resultadoss de búsqueda, se oferecen automáticament enlaces a otros servidores tales como Google, SPIRES o KEK bajo el nombre de "Intentar la búsqueda en...". Con un simple cic sobre los enlaces propuestos se puede enviar la búsqueda realizada en dichos buscadores.
Obsérvese que los enlaces a otros cercadores no se muestran si el buscador no soporta el tipo de búsqueda. Por ejemplo, SPIRES o KEK no pueden buscar términos dentro del campo "cualquier campo", de forma que en estos casos, el sistema no los enlazará.
If a metadata record contains some associated fulltext files, fulltext
index.
To search for all records that contain the term e- in their fulltext files,
type:
Si une notice a des fichiers associés,
Si un registre de metadades té arxius a text complet associats
text complet
separat. Per
recuperar tots els documents que contenen el terme e-al text
complet dels seus documents associats, cal escriure:
Si un registro de metadatos contiene archivos a texto completo
asociados, texto
completo
separado. Para recuperar todos los documentos que
contienen el término e- en el texto completo de sus
documentos asociados, debemos escribir:
If a metadata record contains an associated fulltext file, reference
index. To search for
all records that cite Ellis in their reference lists,
type:
Si les métadonnées d'une notice contiennent un texte complet
associé, references
. Pour
chercher tous les documents qui citent Ellis, saisissez:
Si un registro de metadatos contiene un fichero de texto asociado,
citas
. Para
recuperar todos los registros que citan a Ellis en sus
listados de citas bibliogáficas, escribiremos:
Si un registre de metadades conté un fitxer de text associat,
referències
.
Para recuperar tots els registres que citen a Ellis en els
seus llistats de referències bibliogràfiques, escriurem:
|
|
|
|
|
|
|
|
|
|
_(or)_:
|
|
|
|
|
|
|
|
'_(year)_:' followed by value.'_(year)_:' suivi de l'année.'_(year)_:' seguito dall'anno. |
|
|
+ + | +
+ |
+
+ + | +
+ |
+
+ + | +
+ |
+
_(any field)_ field._(any field)_ ._(any field)_ . |
|
|
|
|
|
|
No match close to %s found in given collections. #Please try different term.
Displaying matches in any collection...""" % p_orig)
## try to get nbhits for these phrases in any collection:
for phrase in browsed_phrases:
browsed_phrases_in_colls.append([phrase, get_nbhits_in_bibxxx(phrase, f)])
## display results now:
out = websearch_templates.tmpl_browse_pattern(
f=f,
fn=get_field_i18nname(get_field_name(f) or f, ln, False),
ln=ln,
browsed_phrases_in_colls=browsed_phrases_in_colls,
colls=colls,
rg=rg,
)
req.write(out)
return
def browse_in_bibwords(req, p, f, ln=CFG_SITE_LANG):
"""Browse inside words indexes."""
if not p:
return
_ = gettext_set_language(ln)
urlargd = {}
urlargd.update(req.argd)
urlargd['action'] = 'search'
nearest_box = create_nearest_terms_box(urlargd, p, f, 'w', ln=ln, intro_text_p=0)
req.write(websearch_templates.tmpl_search_in_bibwords(
p = p,
f = f,
ln = ln,
nearest_box = nearest_box
))
return
def search_pattern(req=None, p=None, f=None, m=None, ap=0, of="id", verbose=0, ln=CFG_SITE_LANG, display_nearest_terms_box=True):
"""Search for complex pattern 'p' within field 'f' according to
matching type 'm'. Return hitset of recIDs.
The function uses multi-stage searching algorithm in case of no
exact match found. See the Search Internals document for
detailed description.
The 'ap' argument governs whether an alternative patterns are to
be used in case there is no direct hit for (p,f,m). For
example, whether to replace non-alphanumeric characters by
spaces if it would give some hits. See the Search Internals
document for detailed description. (ap=0 forbits the
alternative pattern usage, ap=1 permits it.)
The 'of' argument governs whether to print or not some
information to the user in case of no match found. (Usually it
prints the information in case of HTML formats, otherwise it's
silent).
The 'verbose' argument controls the level of debugging information
to be printed (0=least, 9=most).
All the parameters are assumed to have been previously washed.
This function is suitable as a mid-level API.
"""
_ = gettext_set_language(ln)
hitset_empty = HitSet()
# sanity check:
if not p:
hitset_full = HitSet(trailing_bits=1)
hitset_full.discard(0)
# no pattern, so return all universe
return hitset_full
# search stage 1: break up arguments into basic search units:
if verbose and of.startswith("h"):
t1 = os.times()[4]
basic_search_units = create_basic_search_units(req, p, f, m, of)
if verbose and of.startswith("h"):
t2 = os.times()[4]
print_warning(req, "Search stage 1: basic search units are: %s" % cgi.escape(repr(basic_search_units)))
print_warning(req, "Search stage 1: execution took %.2f seconds." % (t2 - t1))
# search stage 2: do search for each search unit and verify hit presence:
if verbose and of.startswith("h"):
t1 = os.times()[4]
basic_search_units_hitsets = []
#prepare hiddenfield-related..
myhiddens = CFG_BIBFORMAT_HIDDEN_TAGS
can_see_hidden = False
if req:
user_info = collect_user_info(req)
can_see_hidden = (acc_authorize_action(user_info, 'runbibedit')[0] == 0)
if can_see_hidden:
myhiddens = []
for idx_unit in xrange(len(basic_search_units)):
bsu_o, bsu_p, bsu_f, bsu_m = basic_search_units[idx_unit]
basic_search_unit_hitset = search_unit(bsu_p, bsu_f, bsu_m)
#check that the user is allowed to search with this tag
#if he/she tries it
if bsu_f and len(bsu_f) > 1 and bsu_f[0].isdigit() and bsu_f[1].isdigit():
for htag in myhiddens:
ltag = len(htag)
samelenfield = bsu_f[0:ltag]
if samelenfield == htag: #user searches by a hidden tag
#we won't show you anything..
basic_search_unit_hitset = HitSet()
if verbose >= 9 and of.startswith("h"):
print_warning(req, "Pattern %s hitlist omitted since \
it queries in a hidden tag %s" %
(repr(bsu_p), repr(myhiddens)))
display_nearest_terms_box=False #..and stop spying, too.
if verbose >= 9 and of.startswith("h"):
print_warning(req, "Search stage 1: pattern %s gave hitlist %s" % (cgi.escape(bsu_p), basic_search_unit_hitset))
if len(basic_search_unit_hitset) > 0 or \
ap==0 or \
bsu_o=="|" or \
((idx_unit+1) clear search results cache""" % CFG_SITE_URL
out += " Date: %d " % yyyymmdd)
req.write("""
', epilogue='
'):
"Prints warning message and flushes output."
if req and msg:
req.write(websearch_templates.tmpl_print_warning(
msg = msg,
type = type,
prologue = prologue,
epilogue = epilogue,
))
return
def print_search_info(p, f, sf, so, sp, rm, of, ot, collection=CFG_SITE_NAME, nb_found=-1, jrec=1, rg=10,
aas=0, ln=CFG_SITE_LANG, p1="", p2="", p3="", f1="", f2="", f3="", m1="", m2="", m3="", op1="", op2="",
sc=1, pl_in_url="",
d1y=0, d1m=0, d1d=0, d2y=0, d2m=0, d2d=0, dt="",
cpu_time=-1, middle_only=0):
"""Prints stripe with the information on 'collection' and 'nb_found' results and CPU time.
Also, prints navigation links (beg/next/prev/end) inside the results set.
If middle_only is set to 1, it will only print the middle box information (beg/netx/prev/end/etc) links.
This is suitable for displaying navigation links at the bottom of the search results page."""
out = ""
# sanity check:
if jrec < 1:
jrec = 1
if jrec > nb_found:
jrec = max(nb_found-rg+1, 1)
return websearch_templates.tmpl_print_search_info(
ln = ln,
collection = collection,
aas = aas,
collection_name = get_coll_i18nname(collection, ln, False),
collection_id = get_colID(collection),
middle_only = middle_only,
rg = rg,
nb_found = nb_found,
sf = sf,
so = so,
rm = rm,
of = of,
ot = ot,
p = p,
f = f,
p1 = p1,
p2 = p2,
p3 = p3,
f1 = f1,
f2 = f2,
f3 = f3,
m1 = m1,
m2 = m2,
m3 = m3,
op1 = op1,
op2 = op2,
pl_in_url = pl_in_url,
d1y = d1y,
d1m = d1m,
d1d = d1d,
d2y = d2y,
d2m = d2m,
d2d = d2d,
dt = dt,
jrec = jrec,
sc = sc,
sp = sp,
all_fieldcodes = get_fieldcodes(),
cpu_time = cpu_time,
)
def print_hosted_search_info(p, f, sf, so, sp, rm, of, ot, collection=CFG_SITE_NAME, nb_found=-1, jrec=1, rg=10,
aas=0, ln=CFG_SITE_LANG, p1="", p2="", p3="", f1="", f2="", f3="", m1="", m2="", m3="", op1="", op2="",
sc=1, pl_in_url="",
d1y=0, d1m=0, d1d=0, d2y=0, d2m=0, d2d=0, dt="",
cpu_time=-1, middle_only=0):
"""Prints stripe with the information on 'collection' and 'nb_found' results and CPU time.
Also, prints navigation links (beg/next/prev/end) inside the results set.
If middle_only is set to 1, it will only print the middle box information (beg/netx/prev/end/etc) links.
This is suitable for displaying navigation links at the bottom of the search results page."""
out = ""
# sanity check:
if jrec < 1:
jrec = 1
if jrec > nb_found:
jrec = max(nb_found-rg+1, 1)
return websearch_templates.tmpl_print_hosted_search_info(
ln = ln,
collection = collection,
aas = aas,
collection_name = get_coll_i18nname(collection, ln, False),
collection_id = get_colID(collection),
middle_only = middle_only,
rg = rg,
nb_found = nb_found,
sf = sf,
so = so,
rm = rm,
of = of,
ot = ot,
p = p,
f = f,
p1 = p1,
p2 = p2,
p3 = p3,
f1 = f1,
f2 = f2,
f3 = f3,
m1 = m1,
m2 = m2,
m3 = m3,
op1 = op1,
op2 = op2,
pl_in_url = pl_in_url,
d1y = d1y,
d1m = d1m,
d1d = d1d,
d2y = d2y,
d2m = d2m,
d2d = d2d,
dt = dt,
jrec = jrec,
sc = sc,
sp = sp,
all_fieldcodes = get_fieldcodes(),
cpu_time = cpu_time,
)
def print_results_overview(req, colls, results_final_nb_total, results_final_nb, cpu_time, ln=CFG_SITE_LANG, ec=[], hosted_colls_potential_results_p=False):
"""Prints results overview box with links to particular collections below."""
out = ""
new_colls = []
for coll in colls:
new_colls.append({
'id': get_colID(coll),
'code': coll,
'name': get_coll_i18nname(coll, ln, False),
})
return websearch_templates.tmpl_print_results_overview(
ln = ln,
results_final_nb_total = results_final_nb_total,
results_final_nb = results_final_nb,
cpu_time = cpu_time,
colls = new_colls,
ec = ec,
hosted_colls_potential_results_p = hosted_colls_potential_results_p,
)
def print_hosted_results(url_and_engine, ln=CFG_SITE_LANG, of=None, req=None, no_records_found=False, search_timed_out=False, limit=CFG_EXTERNAL_COLLECTION_MAXRESULTS):
"""Prints the full results of a hosted collection"""
if of.startswith("h"):
if no_records_found:
return "
No results found."
if search_timed_out:
return "
The search engine did not respond in time."
return websearch_templates.tmpl_print_hosted_results(
url_and_engine=url_and_engine,
ln=ln,
of=of,
req=req,
limit=limit
)
def sort_records(req, recIDs, sort_field='', sort_order='d', sort_pattern='', verbose=0, of='hb', ln=CFG_SITE_LANG):
"""Sort records in 'recIDs' list according sort field 'sort_field' in order 'sort_order'.
If more than one instance of 'sort_field' is found for a given record, try to choose that that is given by
'sort pattern', for example "sort by report number that starts by CERN-PS".
Note that 'sort_field' can be field code like 'author' or MARC tag like '100__a' directly."""
_ = gettext_set_language(ln)
## check arguments:
if not sort_field:
return recIDs
if len(recIDs) > CFG_WEBSEARCH_NB_RECORDS_TO_SORT:
if of.startswith('h'):
print_warning(req, _("Sorry, sorting is allowed on sets of up to %d records only. Using default sort order.") % CFG_WEBSEARCH_NB_RECORDS_TO_SORT, "Warning")
return recIDs
sort_fields = string.split(sort_field, ",")
recIDs_dict = {}
recIDs_out = []
## first deduce sorting MARC tag out of the 'sort_field' argument:
tags = []
for sort_field in sort_fields:
if sort_field and str(sort_field[0:2]).isdigit():
# sort_field starts by two digits, so this is probably a MARC tag already
tags.append(sort_field)
else:
# let us check the 'field' table
query = """SELECT DISTINCT(t.value) FROM tag AS t, field_tag AS ft, field AS f
WHERE f.code=%s AND ft.id_field=f.id AND t.id=ft.id_tag
ORDER BY ft.score DESC"""
res = run_sql(query, (sort_field, ))
if res:
for row in res:
tags.append(row[0])
else:
if of.startswith('h'):
print_warning(req, _("Sorry, %s does not seem to be a valid sort option. Choosing title sort instead.") % cgi.escape(sort_field), "Error")
tags.append("245__a")
if verbose >= 3:
print_warning(req, "Sorting by tags %s." % cgi.escape(repr(tags)))
if sort_pattern:
print_warning(req, "Sorting preferentially by %s." % cgi.escape(sort_pattern))
## check if we have sorting tag defined:
if tags:
# fetch the necessary field values:
for recID in recIDs:
val = "" # will hold value for recID according to which sort
vals = [] # will hold all values found in sorting tag for recID
for tag in tags:
vals.extend(get_fieldvalues(recID, tag))
if sort_pattern:
# try to pick that tag value that corresponds to sort pattern
bingo = 0
for v in vals:
if v.lower().startswith(sort_pattern.lower()): # bingo!
bingo = 1
val = v
break
if not bingo: # sort_pattern not present, so add other vals after spaces
val = sort_pattern + " " + string.join(vals)
else:
# no sort pattern defined, so join them all together
val = string.join(vals)
val = strip_accents(val.lower()) # sort values regardless of accents and case
if recIDs_dict.has_key(val):
recIDs_dict[val].append(recID)
else:
recIDs_dict[val] = [recID]
# sort them:
recIDs_dict_keys = recIDs_dict.keys()
recIDs_dict_keys.sort()
# now that keys are sorted, create output array:
for k in recIDs_dict_keys:
for s in recIDs_dict[k]:
recIDs_out.append(s)
# ascending or descending?
if sort_order == 'a':
recIDs_out.reverse()
# okay, we are done
return recIDs_out
else:
# good, no sort needed
return recIDs
def print_records(req, recIDs, jrec=1, rg=10, format='hb', ot='', ln=CFG_SITE_LANG, relevances=[], relevances_prologue="(", relevances_epilogue="%%)", decompress=zlib.decompress, search_pattern='', print_records_prologue_p=True, print_records_epilogue_p=True, verbose=0, tab=''):
"""
Prints list of records 'recIDs' formatted according to 'format' in
groups of 'rg' starting from 'jrec'.
Assumes that the input list 'recIDs' is sorted in reverse order,
so it counts records from tail to head.
A value of 'rg=-9999' means to print all records: to be used with care.
Print also list of RELEVANCES for each record (if defined), in
between RELEVANCE_PROLOGUE and RELEVANCE_EPILOGUE.
Print prologue and/or epilogue specific to 'format' if
'print_records_prologue_p' and/or print_records_epilogue_p' are
True.
"""
# load the right message language
_ = gettext_set_language(ln)
# sanity checking:
if req is None:
return
# get user_info (for formatting based on user)
if isinstance(req, cStringIO.OutputType):
user_info = {}
else:
user_info = collect_user_info(req)
if len(recIDs):
nb_found = len(recIDs)
if rg == -9999: # print all records
rg = nb_found
else:
rg = abs(rg)
if jrec < 1: # sanity checks
jrec = 1
if jrec > nb_found:
jrec = max(nb_found-rg+1, 1)
# will print records from irec_max to irec_min excluded:
irec_max = nb_found - jrec
irec_min = nb_found - jrec - rg
if irec_min < 0:
irec_min = -1
if irec_max >= nb_found:
irec_max = nb_found - 1
#req.write("%s:%d-%d" % (recIDs, irec_min, irec_max))
if format.startswith('x'):
# print header if needed
if print_records_prologue_p:
print_records_prologue(req, format)
# print records
recIDs_to_print = [recIDs[x] for x in range(irec_max, irec_min, -1)]
format_records(recIDs_to_print,
format,
ln=ln,
search_pattern=search_pattern,
record_separator="\n",
user_info=user_info,
req=req)
# print footer if needed
if print_records_epilogue_p:
print_records_epilogue(req, format)
elif format.startswith('t') or str(format[0:3]).isdigit():
# we are doing plain text output:
for irec in range(irec_max, irec_min, -1):
x = print_record(recIDs[irec], format, ot, ln, search_pattern=search_pattern,
user_info=user_info, verbose=verbose)
req.write(x)
if x:
req.write('\n')
elif format == 'excel':
recIDs_to_print = [recIDs[x] for x in range(irec_max, irec_min, -1)]
create_excel(recIDs=recIDs_to_print, req=req, ln=ln, ot=ot)
else:
# we are doing HTML output:
if format == 'hp' or format.startswith("hb_") or format.startswith("hd_"):
# portfolio and on-the-fly formats:
for irec in range(irec_max, irec_min, -1):
req.write(print_record(recIDs[irec], format, ot, ln, search_pattern=search_pattern,
user_info=user_info, verbose=verbose))
elif format.startswith("hb"):
# HTML brief format:
display_add_to_basket = True
if user_info:
if user_info['email'] == 'guest':
if CFG_ACCESS_CONTROL_LEVEL_ACCOUNTS > 4:
display_add_to_basket = False
else:
if not user_info['precached_usebaskets']:
display_add_to_basket = False
req.write(websearch_templates.tmpl_record_format_htmlbrief_header(
ln = ln))
for irec in range(irec_max, irec_min, -1):
row_number = jrec+irec_max-irec
recid = recIDs[irec]
if relevances and relevances[irec]:
relevance = relevances[irec]
else:
relevance = ''
record = print_record(recIDs[irec], format, ot, ln, search_pattern=search_pattern,
user_info=user_info, verbose=verbose)
req.write(websearch_templates.tmpl_record_format_htmlbrief_body(
ln = ln,
recid = recid,
row_number = row_number,
relevance = relevance,
record = record,
relevances_prologue = relevances_prologue,
relevances_epilogue = relevances_epilogue,
display_add_to_basket = display_add_to_basket
))
req.write(websearch_templates.tmpl_record_format_htmlbrief_footer(
ln = ln,
display_add_to_basket = display_add_to_basket))
elif format.startswith("hd"):
# HTML detailed format:
for irec in range(irec_max, irec_min, -1):
if record_exists(recIDs[irec]) == -1:
print_warning(req, _("The record has been deleted."))
continue
unordered_tabs = get_detailed_page_tabs(get_colID(guess_primary_collection_of_a_record(recIDs[irec])),
recIDs[irec], ln=ln)
ordered_tabs_id = [(tab_id, values['order']) for (tab_id, values) in unordered_tabs.iteritems()]
ordered_tabs_id.sort(lambda x,y: cmp(x[1],y[1]))
link_ln = ''
if ln != CFG_SITE_LANG:
link_ln = '?ln=%s' % ln
recid = recIDs[irec]
recid_to_display = recid # Record ID used to build the URL.
if CFG_WEBSEARCH_USE_ALEPH_SYSNOS:
try:
recid_to_display = get_fieldvalues(recid,
CFG_BIBUPLOAD_EXTERNAL_SYSNO_TAG)[0]
except IndexError:
# No external sysno is available, keep using
# internal recid.
pass
citedbynum = 0 #num of citations, to be shown in the cit tab
references = -1 #num of references
citedbynum = get_cited_by_count(recid)
reftag = ""
reftags = get_field_tags("reference")
if reftags:
reftag = reftags[0]
tmprec = get_record(recid)
if reftag and len(reftag) > 4:
references = len(record_get_field_instances(tmprec, reftag[0:3], reftag[3], reftag[4]))
tabs = [(unordered_tabs[tab_id]['label'], \
'%s/record/%s/%s%s' % (CFG_SITE_URL, recid_to_display, tab_id, link_ln), \
tab_id == tab,
unordered_tabs[tab_id]['enabled']) \
for (tab_id, order) in ordered_tabs_id
if unordered_tabs[tab_id]['visible'] == True]
# load content
if tab == 'usage':
req.write(webstyle_templates.detailed_record_container_top(recIDs[irec],
tabs,
ln,
citationnum=citedbynum,
referencenum=references))
r = calculate_reading_similarity_list(recIDs[irec], "downloads")
downloadsimilarity = None
downloadhistory = None
#if r:
# downloadsimilarity = r
if CFG_BIBRANK_SHOW_DOWNLOAD_GRAPHS:
downloadhistory = create_download_history_graph_and_box(recIDs[irec], ln)
r = calculate_reading_similarity_list(recIDs[irec], "pageviews")
viewsimilarity = None
if r: viewsimilarity = r
content = websearch_templates.tmpl_detailed_record_statistics(recIDs[irec],
ln,
downloadsimilarity=downloadsimilarity,
downloadhistory=downloadhistory,
viewsimilarity=viewsimilarity)
req.write(content)
req.write(webstyle_templates.detailed_record_container_bottom(recIDs[irec],
tabs,
ln))
elif tab == 'citations':
recid = recIDs[irec]
req.write(webstyle_templates.detailed_record_container_top(recid,
tabs,
ln,
citationnum=citedbynum,
referencenum=references))
req.write(websearch_templates.tmpl_detailed_record_citations_prologue(recid, ln))
# Citing
citinglist = calculate_cited_by_list(recid)
req.write(websearch_templates.tmpl_detailed_record_citations_citing_list(recid,
ln,
citinglist=citinglist))
# Self-cited
selfcited = get_self_cited_by(recid)
req.write(websearch_templates.tmpl_detailed_record_citations_self_cited(recid,
ln, selfcited=selfcited, citinglist=citinglist))
# Co-cited
s = calculate_co_cited_with_list(recid)
cociting = None
if s:
cociting = s
req.write(websearch_templates.tmpl_detailed_record_citations_co_citing(recid,
ln,
cociting=cociting))
# Citation history, if needed
citationhistory = None
if citinglist:
citationhistory = create_citation_history_graph_and_box(recid, ln)
#debug
if verbose > 3:
print_warning(req, "Citation graph debug: " + \
str(len(citationhistory)))
req.write(websearch_templates.tmpl_detailed_record_citations_citation_history(recid, ln, citationhistory))
req.write(websearch_templates.tmpl_detailed_record_citations_epilogue(recid, ln))
req.write(webstyle_templates.detailed_record_container_bottom(recid,
tabs,
ln))
elif tab == 'references':
req.write(webstyle_templates.detailed_record_container_top(recIDs[irec],
tabs,
ln,
citationnum=citedbynum,
referencenum=references))
req.write(format_record(recIDs[irec], 'HDREF', ln=ln, user_info=user_info, verbose=verbose))
req.write(webstyle_templates.detailed_record_container_bottom(recIDs[irec],
tabs,
ln))
elif tab == 'keywords':
from invenio.bibclassify_webinterface import \
record_get_keywords, get_sorting_options, \
generate_keywords, get_keywords_body
from invenio.webinterface_handler import wash_urlargd
form = req.form
argd = wash_urlargd(form, {
'generate': (str, 'no'),
'sort': (str, 'occurrences'),
'type': (str, 'tagcloud'),
'numbering': (str, 'off'),
})
recid = recIDs[irec]
req.write(webstyle_templates.detailed_record_container_top(recid,
tabs, ln, citationnum=citedbynum, referencenum=references))
if argd['generate'] == 'yes':
# The user asked to generate the keywords.
keywords = generate_keywords(req, recid)
else:
# Get the keywords contained in the MARC.
keywords = record_get_keywords(recid, argd)
if keywords:
req.write(get_sorting_options(argd, keywords))
elif argd['sort'] == 'related' and not keywords:
req.write('You may want to run BibIndex.')
# Output the keywords or the generate button.
get_keywords_body(keywords, req, recid, argd)
req.write(webstyle_templates.detailed_record_container_bottom(recid,
tabs, ln))
else:
# Metadata tab
req.write(webstyle_templates.detailed_record_container_top(recIDs[irec],
tabs,
ln,
show_short_rec_p=False,
citationnum=citedbynum, referencenum=references))
creationdate = None
modificationdate = None
if record_exists(recIDs[irec]) == 1:
creationdate = get_creation_date(recIDs[irec])
modificationdate = get_modification_date(recIDs[irec])
content = print_record(recIDs[irec], format, ot, ln,
search_pattern=search_pattern,
user_info=user_info, verbose=verbose)
content = websearch_templates.tmpl_detailed_record_metadata(
recID = recIDs[irec],
ln = ln,
format = format,
creationdate = creationdate,
modificationdate = modificationdate,
content = content)
req.write(content)
req.write(webstyle_templates.detailed_record_container_bottom(recIDs[irec],
tabs,
ln,
creationdate=creationdate,
modificationdate=modificationdate,
show_short_rec_p=False))
if len(tabs) > 0:
# Add the mini box at bottom of the page
if CFG_WEBCOMMENT_ALLOW_REVIEWS:
from invenio.webcomment import get_mini_reviews
reviews = get_mini_reviews(recid = recIDs[irec], ln=ln)
else:
reviews = ''
actions = format_record(recIDs[irec], 'HDACT', ln=ln, user_info=user_info, verbose=verbose)
files = format_record(recIDs[irec], 'HDFILE', ln=ln, user_info=user_info, verbose=verbose)
req.write(webstyle_templates.detailed_record_mini_panel(recIDs[irec],
ln,
format,
files=files,
reviews=reviews,
actions=actions))
else:
# Other formats
for irec in range(irec_max, irec_min, -1):
req.write(print_record(recIDs[irec], format, ot, ln,
search_pattern=search_pattern,
user_info=user_info, verbose=verbose))
else:
print_warning(req, _("Use different search terms."))
def print_records_prologue(req, format):
"""
Print the appropriate prologue for list of records in the given
format.
"""
prologue = "" # no prologue needed for HTML or Text formats
if format.startswith('xm'):
prologue = websearch_templates.tmpl_xml_marc_prologue()
elif format.startswith('xn'):
prologue = websearch_templates.tmpl_xml_nlm_prologue()
elif format.startswith('xw'):
prologue = websearch_templates.tmpl_xml_refworks_prologue()
elif format.startswith('xr'):
prologue = websearch_templates.tmpl_xml_rss_prologue()
elif format.startswith('xe'):
prologue = websearch_templates.tmpl_xml_endnote_prologue()
elif format.startswith('xo'):
prologue = websearch_templates.tmpl_xml_mods_prologue()
elif format.startswith('x'):
prologue = websearch_templates.tmpl_xml_default_prologue()
req.write(prologue)
def print_records_epilogue(req, format):
"""
Print the appropriate epilogue for list of records in the given
format.
"""
epilogue = "" # no epilogue needed for HTML or Text formats
if format.startswith('xm'):
epilogue = websearch_templates.tmpl_xml_marc_epilogue()
elif format.startswith('xn'):
epilogue = websearch_templates.tmpl_xml_nlm_epilogue()
elif format.startswith('xw'):
epilogue = websearch_templates.tmpl_xml_refworks_epilogue()
elif format.startswith('xr'):
epilogue = websearch_templates.tmpl_xml_rss_epilogue()
elif format.startswith('xe'):
epilogue = websearch_templates.tmpl_xml_endnote_epilogue()
elif format.startswith('xo'):
epilogue = websearch_templates.tmpl_xml_mods_epilogue()
elif format.startswith('x'):
epilogue = websearch_templates.tmpl_xml_default_epilogue()
req.write(epilogue)
def get_record(recid):
"""Directly the record object corresponding to the recid."""
if CFG_BIBUPLOAD_SERIALIZE_RECORD_STRUCTURE:
value = run_sql("SELECT value FROM bibfmt WHERE id_bibrec=%s AND FORMAT='recstruct'", (recid, ))
if value:
try:
return deserialize_via_marshal(value[0][0])
except:
### In case of corruption, let's rebuild it!
pass
return create_record(print_record(recid, 'xm'))[0]
def print_record(recID, format='hb', ot='', ln=CFG_SITE_LANG, decompress=zlib.decompress,
search_pattern=None, user_info=None, verbose=0):
"""Prints record 'recID' formatted according to 'format'."""
if format == 'recstruct':
return get_record(recID)
_ = gettext_set_language(ln)
#check from user information if the user has the right to see hidden fields/tags in the
#records as well
can_see_hidden = (acc_authorize_action(user_info, 'runbibedit')[0] == 0)
out = ""
# sanity check:
record_exist_p = record_exists(recID)
if record_exist_p == 0: # doesn't exist
return out
# New Python BibFormat procedure for formatting
# Old procedure follows further below
# We must still check some special formats, but these
# should disappear when BibFormat improves.
if not (CFG_BIBFORMAT_USE_OLD_BIBFORMAT \
or format.lower().startswith('t') \
or format.lower().startswith('hm') \
or str(format[0:3]).isdigit() \
or ot):
# Unspecified format is hd
if format == '':
format = 'hd'
if record_exist_p == -1 and get_output_format_content_type(format) == 'text/html':
# HTML output displays a default value for deleted records.
# Other format have to deal with it.
out += _("The record has been deleted.")
else:
out += call_bibformat(recID, format, ln, search_pattern=search_pattern,
user_info=user_info, verbose=verbose)
# at the end of HTML brief mode, print the "Detailed record" functionality:
if format.lower().startswith('hb') and \
format.lower() != 'hb_p':
out += websearch_templates.tmpl_print_record_brief_links(
ln = ln,
recID = recID,
)
return out
# Old PHP BibFormat procedure for formatting
# print record opening tags, if needed:
if format == "marcxml" or format == "oai_dc":
out += " " + cgi.escape(get_fieldvalues_alephseq_like(recID, ["001", CFG_OAI_ID_FIELD, "980"], can_see_hidden)) + "
"
else:
out += "\n" + cgi.escape(get_fieldvalues_alephseq_like(recID, ot, can_see_hidden)) + "
"
elif format.startswith("h") and ot:
## user directly asked for some tags to be displayed only
if record_exist_p == -1:
out += "\n" + get_fieldvalues_alephseq_like(recID, ["001", CFG_OAI_ID_FIELD, "980"], can_see_hidden) + "
"
else:
out += "\n" + get_fieldvalues_alephseq_like(recID, ot, can_see_hidden) + "
"
elif format == "hd":
# HTML detailed format
if record_exist_p == -1:
out += _("The record has been deleted.")
else:
# look for detailed format existence:
query = "SELECT value FROM bibfmt WHERE id_bibrec=%s AND format=%s"
res = run_sql(query, (recID, format), 1)
if res:
# record 'recID' is formatted in 'format', so print it
out += "%s" % decompress(res[0][0])
else:
# record 'recID' is not formatted in 'format', so try to call BibFormat on the fly or use default format:
out_record_in_format = call_bibformat(recID, format, ln, search_pattern=search_pattern,
user_info=user_info, verbose=verbose)
if out_record_in_format:
out += out_record_in_format
else:
out += websearch_templates.tmpl_print_record_detailed(
ln = ln,
recID = recID,
)
elif format.startswith("hb_") or format.startswith("hd_"):
# underscore means that HTML brief/detailed formats should be called on-the-fly; suitable for testing formats
if record_exist_p == -1:
out += _("The record has been deleted.")
else:
out += call_bibformat(recID, format, ln, search_pattern=search_pattern,
user_info=user_info, verbose=verbose)
elif format.startswith("hx"):
# BibTeX format, called on the fly:
if record_exist_p == -1:
out += _("The record has been deleted.")
else:
out += call_bibformat(recID, format, ln, search_pattern=search_pattern,
user_info=user_info, verbose=verbose)
elif format.startswith("hs"):
# for citation/download similarity navigation links:
if record_exist_p == -1:
out += _("The record has been deleted.")
else:
out += '' % websearch_templates.build_search_url(recid=recID, ln=ln)
# firstly, title:
titles = get_fieldvalues(recID, "245__a")
if titles:
for title in titles:
out += "%s" % title
else:
# usual title not found, try conference title:
titles = get_fieldvalues(recID, "111__a")
if titles:
for title in titles:
out += "%s" % title
else:
# just print record ID:
out += "%s %d" % (get_field_i18nname("record ID", ln, False), recID)
out += ""
# secondly, authors:
authors = get_fieldvalues(recID, "100__a") + get_fieldvalues(recID, "700__a")
if authors:
out += " - %s" % authors[0]
if len(authors) > 1:
out += " et al"
# thirdly publication info:
publinfos = get_fieldvalues(recID, "773__s")
if not publinfos:
publinfos = get_fieldvalues(recID, "909C4s")
if not publinfos:
publinfos = get_fieldvalues(recID, "037__a")
if not publinfos:
publinfos = get_fieldvalues(recID, "088__a")
if publinfos:
out += " - %s" % publinfos[0]
else:
# fourthly publication year (if not publication info):
years = get_fieldvalues(recID, "773__y")
if not years:
years = get_fieldvalues(recID, "909C4y")
if not years:
years = get_fieldvalues(recID, "260__c")
if years:
out += " (%s)" % years[0]
else:
# HTML brief format by default
if record_exist_p == -1:
out += _("The record has been deleted.")
else:
query = "SELECT value FROM bibfmt WHERE id_bibrec=%s AND format=%s"
res = run_sql(query, (recID, format))
if res:
# record 'recID' is formatted in 'format', so print it
out += "%s" % decompress(res[0][0])
else:
# record 'recID' is not formatted in 'format', so try to call BibFormat on the fly: or use default format:
if CFG_WEBSEARCH_CALL_BIBFORMAT:
out_record_in_format = call_bibformat(recID, format, ln, search_pattern=search_pattern,
user_info=user_info, verbose=verbose)
if out_record_in_format:
out += out_record_in_format
else:
out += websearch_templates.tmpl_print_record_brief(
ln = ln,
recID = recID,
)
else:
out += websearch_templates.tmpl_print_record_brief(
ln = ln,
recID = recID,
)
# at the end of HTML brief mode, print the "Detailed record" functionality:
if format == 'hp' or format.startswith("hb_") or format.startswith("hd_"):
pass # do nothing for portfolio and on-the-fly formats
else:
out += websearch_templates.tmpl_print_record_brief_links(
ln = ln,
recID = recID,
)
# print record closing tags, if needed:
if format == "marcxml" or format == "oai_dc":
out += " Search Cache
"
# clear cache if requested:
if action == "clear":
search_results_cache.clear()
req.write(out)
# show collection reclist cache:
out = "Collection reclist cache
"
out += "- collection table last updated: %s" % get_table_update_time('collection')
out += "
- reclist cache timestamp: %s" % collection_reclist_cache.timestamp
out += "
- reclist cache contents:"
out += ""
for coll in collection_reclist_cache.cache.keys():
if collection_reclist_cache.cache[coll]:
out += "%s (%d)
"
req.write(out)
# show search results cache:
out = "
" % (coll, len(collection_reclist_cache.cache[coll]))
out += "Search Cache
"
out += "- search cache usage: %d queries cached (max. ~%d)" % \
(len(search_results_cache.cache), CFG_WEBSEARCH_SEARCH_CACHE_SIZE)
if len(search_results_cache.cache):
out += "
- search cache contents:"
out += ""
for query, hitset in search_results_cache.cache.items():
out += "
"
req.write(out)
# show field i18nname cache:
out = "
%s ... %s" % (query, hitset)
out += """Field I18N names cache
"
out += "- fieldname table last updated: %s" % get_table_update_time('fieldname')
out += "
- i18nname cache timestamp: %s" % field_i18nname_cache.timestamp
out += "
- i18nname cache contents:"
out += ""
for field in field_i18nname_cache.cache.keys():
for ln in field_i18nname_cache.cache[field].keys():
out += "%s, %s = %s
"
req.write(out)
# show collection i18nname cache:
out = "
" % (field, ln, field_i18nname_cache.cache[field][ln])
out += "Collection I18N names cache
"
out += "- collectionname table last updated: %s" % get_table_update_time('collectionname')
out += "
- i18nname cache timestamp: %s" % collection_i18nname_cache.timestamp
out += "
- i18nname cache contents:"
out += ""
for coll in collection_i18nname_cache.cache.keys():
for ln in collection_i18nname_cache.cache[coll].keys():
out += "%s, %s = %s
"
req.write(out)
req.write("")
return "\n"
def perform_request_log(req, date=""):
"""Display search log information for given date."""
req.content_type = "text/html"
req.send_http_header()
req.write("")
req.write("
" % (coll, ln, collection_i18nname_cache.cache[coll][ln])
out += "Search Log
")
if date: # case A: display stats for a day
yyyymmdd = string.atoi(date)
req.write("""")
req.write("
")
else: # case B: display summary stats per day
yyyymm01 = int(time.strftime("%Y%m01", time.localtime()))
yyyymmdd = int(time.strftime("%Y%m%d", time.localtime()))
req.write(""" " % ("No.", "Time", "Pattern", "Field", "Collection", "Number of Hits"))
# read file:
p = os.popen("grep ^%d %s/search.log" % (yyyymmdd, CFG_LOGDIR), 'r')
lines = p.readlines()
p.close()
# process lines:
i = 0
for line in lines:
try:
datetime, aas, p, f, c, nbhits = string.split(line,"#")
i += 1
req.write("%s %s %s %s %s %s " \
% (i, datetime[8:10], datetime[10:12], datetime[12:], p, f, c, nbhits))
except:
pass # ignore eventual wrong log lines
req.write("#%d %s:%s:%s %s %s %s %s """)
req.write("
")
req.write("")
return "\n"
def get_most_popular_field_values(recids, tags, exclude_values=None, count_repetitive_values=True):
"""
Analyze RECIDS and look for TAGS and return most popular values
and the frequency with which they occur sorted according to
descending frequency.
If a value is found in EXCLUDE_VALUES, then do not count it.
If COUNT_REPETITIVE_VALUES is True, then we count every occurrence
of value in the tags. If False, then we count the value only once
regardless of the number of times it may appear in a record.
(But, if the same value occurs in another record, we count it, of
course.)
Example:
>>> get_most_popular_field_values(range(11,20), '980__a')
(('PREPRINT', 10), ('THESIS', 7), ...)
>>> get_most_popular_field_values(range(11,20), ('100__a', '700__a'))
(('Ellis, J', 10), ('Ellis, N', 7), ...)
>>> get_most_popular_field_values(range(11,20), ('100__a', '700__a'), ('Ellis, J'))
(('Ellis, N', 7), ...)
"""
def _get_most_popular_field_values_helper_sorter(val1, val2):
"Compare VAL1 and VAL2 according to, firstly, frequency, then secondly, alphabetically."
compared_via_frequencies = cmp(valuefreqdict[val2], valuefreqdict[val1])
if compared_via_frequencies == 0:
return cmp(val1.lower(), val2.lower())
else:
return compared_via_frequencies
valuefreqdict = {}
## sanity check:
if not exclude_values:
exclude_values = []
if isinstance(tags, str):
tags = (tags,)
## find values to count:
vals_to_count = []
displaytmp = {}
if count_repetitive_values:
# counting technique A: can look up many records at once: (very fast)
for tag in tags:
vals_to_count.extend(get_fieldvalues(recids, tag))
else:
# counting technique B: must count record-by-record: (slow)
for recid in recids:
vals_in_rec = []
for tag in tags:
for val in get_fieldvalues(recid, tag, False):
vals_in_rec.append(val)
# do not count repetitive values within this record
# (even across various tags, so need to unify again):
dtmp = {}
for val in vals_in_rec:
dtmp[val.lower()] = 1
displaytmp[val.lower()] = val
vals_in_rec = dtmp.keys()
vals_to_count.extend(vals_in_rec)
## are we to exclude some of found values?
for val in vals_to_count:
if val not in exclude_values:
if valuefreqdict.has_key(val):
valuefreqdict[val] += 1
else:
valuefreqdict[val] = 1
## sort by descending frequency of values:
out = ()
vals = valuefreqdict.keys()
vals.sort(_get_most_popular_field_values_helper_sorter)
for val in vals:
tmpdisplv = ''
if displaytmp.has_key(val):
tmpdisplv = displaytmp[val]
else:
tmpdisplv = val
out += (tmpdisplv, valuefreqdict[val]),
return out
def profile(p="", f="", c=CFG_SITE_NAME):
"""Profile search time."""
import profile
import pstats
profile.run("perform_request_search(p='%s',f='%s', c='%s')" % (p, f, c), "perform_request_search_profile")
p = pstats.Stats("perform_request_search_profile")
p.strip_dirs().sort_stats("cumulative").print_stats()
return 0
## test cases:
#print wash_colls(CFG_SITE_NAME,"Library Catalogue", 0)
#print wash_colls("Periodicals & Progress Reports",["Periodicals","Progress Reports"], 0)
#print wash_field("wau")
#print print_record(20,"tm","001,245")
#print create_opft_search_units(None, "PHE-87-13","reportnumber")
#print ":"+wash_pattern("* and % doo * %")+":\n"
#print ":"+wash_pattern("*")+":\n"
#print ":"+wash_pattern("ellis* ell* e*%")+":\n"
#print run_sql("SELECT name,dbquery from collection")
#print get_index_id("author")
#print get_coll_ancestors("Theses")
#print get_coll_sons("Articles & Preprints")
#print get_coll_real_descendants("Articles & Preprints")
#print get_collection_reclist("Theses")
#print log(sys.stdin)
#print search_unit_in_bibrec('2002-12-01','2002-12-12')
#print get_nearest_terms_in_bibxxx("ellis", "author", 5, 5)
#print call_bibformat(68, "HB_FLY")
#print get_fieldvalues(10, "980__a")
#print get_fieldvalues_alephseq_like(10,"001___")
#print get_fieldvalues_alephseq_like(10,"980__a")
#print get_fieldvalues_alephseq_like(10,"foo")
#print get_fieldvalues_alephseq_like(10,"-1")
#print get_fieldvalues_alephseq_like(10,"99")
#print get_fieldvalues_alephseq_like(10,["001", "980"])
## profiling:
#profile("of the this")
#print perform_request_search(p="ellis")
diff --git a/modules/websearch/lib/websearch_regression_tests.py b/modules/websearch/lib/websearch_regression_tests.py
index 6bb88ccff..36d1742a4 100644
--- a/modules/websearch/lib/websearch_regression_tests.py
+++ b/modules/websearch/lib/websearch_regression_tests.py
@@ -1,1621 +1,1674 @@
# -*- coding: utf-8 -*-
##
## This file is part of CDS Invenio.
## Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008 CERN.
##
## CDS Invenio is free software; you can redistribute it and/or
## modify it under the terms of the GNU General Public License as
## published by the Free Software Foundation; either version 2 of the
## License, or (at your option) any later version.
##
## CDS Invenio is distributed in the hope that it will be useful, but
## WITHOUT ANY WARRANTY; without even the implied warranty of
## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
## General Public License for more details.
##
## You should have received a copy of the GNU General Public License
## along with CDS Invenio; if not, write to the Free Software Foundation, Inc.,
## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
# pylint: disable=C0301
# pylint: disable=E1102
"""WebSearch module regression tests."""
__revision__ = "$Id$"
import unittest
import re
import urlparse, cgi
import sys
if sys.hexversion < 0x2040000:
# pylint: disable=W0622
from sets import Set as set
# pylint: enable=W0622
from mechanize import Browser, LinkNotFoundError
from invenio.config import CFG_SITE_URL, CFG_SITE_NAME, CFG_SITE_LANG
from invenio.testutils import make_test_suite, \
run_test_suite, \
make_url, test_web_page_content, \
merge_error_messages
from invenio.urlutils import same_urls_p
from invenio.search_engine import perform_request_search, \
guess_primary_collection_of_a_record, guess_collection_of_a_record, \
collection_restricted_p, get_permitted_restricted_collections, \
get_fieldvalues
def parse_url(url):
parts = urlparse.urlparse(url)
query = cgi.parse_qs(parts[4], True)
return parts[2].split('/')[1:], query
class WebSearchWebPagesAvailabilityTest(unittest.TestCase):
"""Check WebSearch web pages whether they are up or not."""
def test_search_interface_pages_availability(self):
"""websearch - availability of search interface pages"""
baseurl = CFG_SITE_URL + '/'
_exports = ['', 'collection/Poetry', 'collection/Poetry?as=1']
error_messages = []
for url in [baseurl + page for page in _exports]:
error_messages.extend(test_web_page_content(url))
if error_messages:
self.fail(merge_error_messages(error_messages))
return
def test_search_results_pages_availability(self):
"""websearch - availability of search results pages"""
baseurl = CFG_SITE_URL + '/search'
_exports = ['', '?c=Poetry', '?p=ellis', '/cache', '/log']
error_messages = []
for url in [baseurl + page for page in _exports]:
error_messages.extend(test_web_page_content(url))
if error_messages:
self.fail(merge_error_messages(error_messages))
return
def test_search_detailed_record_pages_availability(self):
"""websearch - availability of search detailed record pages"""
baseurl = CFG_SITE_URL + '/record/'
_exports = ['', '1', '1/', '1/files', '1/files/']
error_messages = []
for url in [baseurl + page for page in _exports]:
error_messages.extend(test_web_page_content(url))
if error_messages:
self.fail(merge_error_messages(error_messages))
return
def test_browse_results_pages_availability(self):
"""websearch - availability of browse results pages"""
baseurl = CFG_SITE_URL + '/search'
_exports = ['?p=ellis&f=author&action_browse=Browse']
error_messages = []
for url in [baseurl + page for page in _exports]:
error_messages.extend(test_web_page_content(url))
if error_messages:
self.fail(merge_error_messages(error_messages))
return
def test_help_page_availability(self):
"""websearch - availability of Help Central page"""
self.assertEqual([],
test_web_page_content(CFG_SITE_URL + '/help',
expected_text="Help Central"))
self.assertEqual([],
test_web_page_content(CFG_SITE_URL + '/help/?ln=fr',
expected_text="Centre d'aide"))
def test_search_tips_page_availability(self):
"""websearch - availability of Search Tips"""
self.assertEqual([],
test_web_page_content(CFG_SITE_URL + '/help/search-tips',
expected_text="Search Tips"))
self.assertEqual([],
test_web_page_content(CFG_SITE_URL + '/help/search-tips?ln=fr',
expected_text="Conseils de recherche"))
def test_search_guide_page_availability(self):
"""websearch - availability of Search Guide"""
self.assertEqual([],
test_web_page_content(CFG_SITE_URL + '/help/search-guide',
expected_text="Search Guide"))
self.assertEqual([],
test_web_page_content(CFG_SITE_URL + '/help/search-guide?ln=fr',
expected_text="Guide de recherche"))
class WebSearchTestLegacyURLs(unittest.TestCase):
""" Check that the application still responds to legacy URLs for
navigating, searching and browsing."""
def test_legacy_collections(self):
""" websearch - collections handle legacy urls """
browser = Browser()
def check(legacy, new, browser=browser):
browser.open(legacy)
got = browser.geturl()
self.failUnless(same_urls_p(got, new), got)
# Use the root URL unless we need more
check(make_url('/', c=CFG_SITE_NAME),
make_url('/', ln=CFG_SITE_LANG))
# Other collections are redirected in the /collection area
check(make_url('/', c='Poetry'),
make_url('/collection/Poetry', ln=CFG_SITE_LANG))
# Drop unnecessary arguments, like ln and as (when they are
# the default value)
args = {'as': 0}
check(make_url('/', c='Poetry', **args),
make_url('/collection/Poetry', ln=CFG_SITE_LANG))
# Otherwise, keep them
args = {'as': 1, 'ln': CFG_SITE_LANG}
check(make_url('/', c='Poetry', **args),
make_url('/collection/Poetry', **args))
# Support the /index.py addressing too
check(make_url('/index.py', c='Poetry'),
make_url('/collection/Poetry', ln=CFG_SITE_LANG))
def test_legacy_search(self):
""" websearch - search queries handle legacy urls """
browser = Browser()
def check(legacy, new, browser=browser):
browser.open(legacy)
got = browser.geturl()
self.failUnless(same_urls_p(got, new), got)
# /search.py is redirected on /search
# Note that `as' is a reserved word in Python 2.5
check(make_url('/search.py', p='nuclear', ln='en') + 'as=1',
make_url('/search', p='nuclear', ln='en') + 'as=1')
# direct recid searches are redirected to /record
check(make_url('/search.py', recid=1, ln='es'),
make_url('/record/1', ln='es'))
def test_legacy_search_help_link(self):
"""websearch - legacy Search Help page link"""
self.assertEqual([],
test_web_page_content(CFG_SITE_URL + '/help/search/index.en.html',
expected_text="Help Central"))
def test_legacy_search_tips_link(self):
"""websearch - legacy Search Tips page link"""
self.assertEqual([],
test_web_page_content(CFG_SITE_URL + '/help/search/tips.fr.html',
expected_text="Conseils de recherche"))
def test_legacy_search_guide_link(self):
"""websearch - legacy Search Guide page link"""
self.assertEqual([],
test_web_page_content(CFG_SITE_URL + '/help/search/guide.en.html',
expected_text="Search Guide"))
class WebSearchTestRecord(unittest.TestCase):
""" Check the interface of the /record results """
def test_format_links(self):
""" websearch - check format links for records """
browser = Browser()
# We open the record in all known HTML formats
for hformat in ('hd', 'hx', 'hm'):
browser.open(make_url('/record/1', of=hformat))
if hformat == 'hd':
# hd format should have a link to the following
# formats
for oformat in ('hx', 'hm', 'xm', 'xd'):
target = make_url('/record/1/export/%s?ln=en' % oformat)
try:
browser.find_link(url=target)
except LinkNotFoundError:
self.fail('link %r should be in page' % target)
else:
# non-hd HTML formats should have a link back to
# the main detailed record
target = make_url('/record/1')
try:
browser.find_link(url=target)
except LinkNotFoundError:
self.fail('link %r should be in page' % target)
return
def test_exported_formats(self):
""" websearch - check formats exported through /record/1/export/ URLs"""
browser = Browser()
self.assertEqual([],
test_web_page_content(make_url('/record/1/export/hm'),
expected_text='245__ $$aALEPH experiment'))
self.assertEqual([],
test_web_page_content(make_url('/record/1/export/hd'),
expected_text='ALEPH experiment'))
self.assertEqual([],
test_web_page_content(make_url('/record/1/export/xm'),
expected_text=' " % ("Day", "Number of Queries"))
for day in range(yyyymm01, yyyymmdd + 1):
p = os.popen("grep -c ^%d %s/search.log" % (day, CFG_LOGDIR), 'r')
for line in p.readlines():
req.write("""%s %s """ % \
(day, CFG_SITE_URL, day, line))
p.close()
req.write("%s %s