Recherche textuelle dans des documents


#1

Bonjour,

Je souhaite pourvoir faire de la recherche de texte dans des documents
(pdf, txt, word), savez vous s’il y a des gems qui existent? Quelle
est à votre avis la meilleure façon de procéder?

Merci d’avance pour vos suggestions
Nicolas


#2

Hello,

Un démon Sphinx [1] et la gem thinking_sphinx [2] dervaient pourvoir Ã
ton
bonheur.

[1] Homepage Sphinx : http://sphinxsearch.com/
[2] Homepage thinking-sphinx : http://freelancing-god.github.com/ts/en/

2010/3/18 Tranquiliste removed_email_address@domain.invalid


#3

Un démon Sphinx [1] et la gem thinking_sphinx [2] dervaient pourvoir Ã
ton bonheur.

Puisqu’on en parle, je croyais que Sphinx causait directement à la DB
(contrairement à Ferret, par exemple).

Il serait donc possible d’indexer des documents non contenus dans un
champ
DB ?

Par ailleurs, comment sphinx filtre-t-il le formattage (.doc, .pdf,
etc.) et
même le HTML d’ailleurs, pour n’indexer que du texte ?

(Oui, je sais, RTFM, mais si qqun à déjà fait le tour de la question ça
gagne du temps :wink:


#4

Yo. Deux manière pour remplir Sphinx : BDD (les classiques MySQL,
Postgre) et XML. Regarder la doc officielle de Sphinx (Thinking Sphinx
aidera peut dans ce dernier cas).

Nicolas.

2010/3/18 cyrilmougel removed_email_address@domain.invalid:


#5

Le 18/03/10 09:22, philippe lachaise a écrit :

Un démon Sphinx [1] et la gem thinking_sphinx [2] dervaient
pourvoir à ton bonheur.

Puisqu’on en parle, je croyais que Sphinx causait directement à la DB
(contrairement à Ferret, par exemple).

Il serait donc possible d’indexer des documents non contenus dans un
champ DB ?

Oui en fait il a une liaison avec la BDD pour gérer les index. Mais tu
lui donnes les infos dans son système de stockage propre.

removed_email_address@domain.invalid
Pour résilier votre abonnement envoyez un e-mail à l’adresse
removed_email_address@domain.invalid


Cyril M.
http://blog.shingara.fr


#6

Il y a aussi Xapian (voici mon expérience sur le sujet :
http://www.algorithmique.net/Dev/2009/12/29/creer-son-moteur-de-recherche-avec-ruby-et-xapian.html)
qui supporte HTML, PHP, PDF, PostScript, OpenOffice/StarOffice,
OpenDocument, Microsoft Word/Excel/Powerpoint/Works, Word Perfect,
AbiWord, RTF, DVI, Perl POD documentation, and plain text.

Greg

Le 18 mars 2010 13:48, Nicolas B. removed_email_address@domain.invalid a écrit :


#7

Et plus personne ne semble parler de Ferret. C’est mort ?


#8

Il est mort le 13 mars 2010 à Aubenas en Ardèche.

++

yk

Le 18 mars 2010 17:37, philippe lachaise removed_email_address@domain.invalid a
écrit :


#9

A priori Solr a l’air d’être le mieux placé pour ça (lorsqu’on ne veut
indexer que du contenu BDD on préféère Sphinx par ici).

++

yk

Le 18 mars 2010 07:41, Tranquiliste removed_email_address@domain.invalid a
écrit
:


#10

Bonjour Nicolas,

J’ai réalisé récemment pour un client une base de connaissance.
L’objectif était de donner la possibilité à l’utilisateur de créer un
article accompagné ou non d’un fichier joint (DOC, PDF, XLS…).

Pour l’indexation de contenu, j’ai utilisé Xapian couplé à Xapit et pour
extraire le contenu des fichiers joints, j’ai utilisé PDFReader car
j’avais pour obligation de mettre en place un processus de
transformation vers du PDF.

La mise en place de Xapian/Xapit est relativement simple, et c’est très
puissant notamment au travers des facets (bien que j’ai été obligé de
faire un monkey patch).

En point négatif, c’est que la synchronisation de la base ne fonctionne
pas correctement avec Passenger de base, mais au moyen d’un petit patch
tu peux la reconstruire de manière différentielle à intervalle de temps
régulier.

En espérant que ça puisse t’aider,

Julien

Tranquiliste wrote:

Merci à tous pour vos réponses. Je vais jeter un coup d’oeil à tout ça
(et je reviens vers vous avec de nouvelles questions;))

Nicolas


Vous avez reçu ce message, car vous êtes abonné au groupe “Railsfrance” de
Google G…
Pour transmettre des messages à ce groupe, envoyez un e-mail à l’adresse
removed_email_address@domain.invalid
Pour résilier votre abonnement envoyez un e-mail à l’adresse
removed_email_address@domain.invalid

To unsubscribe from this group, send email to
railsfrance+unsubscribegooglegroups.com or reply to this email with the
words “REMOVE ME” as the subject.


#11

Merci à tous pour vos réponses. Je vais jeter un coup d’oeil à tout
ça(et je reviens vers vous avec de nouvelles questions;))

Nicolas


#12

Merci Julien,

Dis moi quand tu fais une recherche cela te renvoie quel niveau
d’information le nom du document, la page ou se trouve le mot,…

Nicolas


Vous avez reçu ce message, car vous êtes abonné au groupe “Railsfrance” de
Google G…
Pour transmettre des messages à ce groupe, envoyez un e-mail à l’adresse
removed_email_address@domain.invalid
Pour résilier votre abonnement envoyez un e-mail à l’adresse
removed_email_address@domain.invalid

To unsubscribe from this group, send email to
railsfrance+unsubscribegooglegroups.com or reply to this email with the
words “REMOVE ME” as the subject.


#13

Lorsque tu fais une recherche avec Xapit
(http://github.com/ryanb/xapit), il te renvoie une Xapit::Collection qui
est un objet qui encapsule les facets, les facets appliquées, les
suggestions et la collection de résultats comme le fait classiquement
les AR::Base.find . Par ailleurs, cet objet implémente aussi “les
méthodes qui vont bien” pour will_paginate.

Tranquiliste wrote:

Merci Julien,

Dis moi quand tu fais une recherche cela te renvoie quel niveau
d’information le nom du document, la page ou se trouve le mot,…

Nicolas


Vous avez reçu ce message, car vous êtes abonné au groupe “Railsfrance” de
Google G…
Pour transmettre des messages à ce groupe, envoyez un e-mail à l’adresse
removed_email_address@domain.invalid
Pour résilier votre abonnement envoyez un e-mail à l’adresse
removed_email_address@domain.invalid

To unsubscribe from this group, send email to
railsfrance+unsubscribegooglegroups.com or reply to this email with the
words “REMOVE ME” as the subject.


#14

Pas sur de comprendre ce que c’est que les facet. Mais j’ai prévu de
faire une série de tests dans le prochains jours pour comprendre ce
que ça donne et ce que je peux faire

Nicolas


Vous avez reçu ce message, car vous êtes abonné au groupe “Railsfrance” de
Google G…
Pour transmettre des messages à ce groupe, envoyez un e-mail à l’adresse
removed_email_address@domain.invalid
Pour résilier votre abonnement envoyez un e-mail à l’adresse
removed_email_address@domain.invalid

To unsubscribe from this group, send email to
railsfrance+unsubscribegooglegroups.com or reply to this email with the
words “REMOVE ME” as the subject.


#15

Bonjour,

Je suis en train de faire des tests avec Xapian/Xapit et je me pose
plusieurs questions:

1- comment passer un document à indexer, sachant que j’utilise
paperclip.
Pour l’instant j’ai fait un truc comme suit
xapit do |index|
index.text :title, :txt_document
end

et
def txt_document
if document_content_type == ‘application/pdf’ or
document_content_type == ‘text/plain’
return File.new(RAILS_ROOT+’/public’+document.url)
end
end

Mais ça ne donne pas vraiment de résultat (j’ai aussi essayé avec
File.open).

2- avez vous noté que quand on utilise une wildcard (*), s’il n’y a
pas de résultat c’est l’ensemble de la base qui est donnée comme
résultat

3- y a-t-il une option pour rendre xapian insensible aux accents ou
faut il que je le gère au niveau de mon modèle?

Merci d’avance.
Nicolas


Vous avez reçu ce message, car vous êtes abonné au groupe “Railsfrance” de
Google G…
Pour transmettre des messages à ce groupe, envoyez un e-mail à l’adresse
removed_email_address@domain.invalid
Pour résilier votre abonnement envoyez un e-mail à l’adresse
removed_email_address@domain.invalid

Subscription settings:
http://groups.google.com/group/railsfrance/subscribe?hl=fr


#16

Les facets sont ce que l’on pourrait appeler des critères discriminants
à ta
recherche.

Je prends l’exemple d’une base de données qui recence des chiens, tu
tapes
le mot clef ‘kiki’.

Tu obtiens 30 résultats et les facets suivantes :

poids [5-10kg (10), 10-15kg (20)]
race [caniche (10), colley (1), yorkshire (19)]

Ces facets vont te permettre d’affiner ta recherche en appliquant un
critère
supplémentaire (comme ici la race) et d’avoir ainsi une recherche de
plus en
plus précise au fur et à mesure que tu appliques des facets. Au final,
tu
pourras avoir le ‘kiki’ qui t’intéresse plus rapidement que s’il n’y
avait
pas de facets.

Le 23 mars 2010 09:52, Tranquiliste removed_email_address@domain.invalid a
écrit
:

Pour transmettre des messages à ce groupe, envoyez un e-mail à l’adresse
removed_email_address@domain.invalid
Pour résilier votre abonnement envoyez un e-mail à l’adresse
removed_email_address@domain.invalid

To unsubscribe from this group, send email to railsfrance+
unsubscribegooglegroups.com or reply to this email with the words “REMOVE
ME” as the subject.


Vous avez reçu ce message, car vous êtes abonné au groupe “Railsfrance”
de Google G…
Pour transmettre des messages à ce groupe, envoyez un e-mail à l’adresse
removed_email_address@domain.invalid
Pour résilier votre abonnement envoyez un e-mail à l’adresse
removed_email_address@domain.invalid

To unsubscribe from this group, send email to
railsfrance+unsubscribegooglegroups.com or reply to this email with the
words “REMOVE ME” as the subject.


#17

Bonjour, je suis en train de faire des tests avec Xapian/Xapit et je
me demandais comment passer un document à indexer, sachant que
j’utilise paperclip.
Pour l’instant j’ai fait un truc comme suit
xapit do |index|
index.text :title, :txt_document
end

et
def txt_document
if document_content_type == ‘application/pdf’ or
document_content_type == ‘text/plain’
return File.new(RAILS_ROOT+’/public’+document.url)
end
end

Mais ça ne donne pas vraiment de résultat (j’ai aussi essayé avec
File.open).

Merci d’avance
Nicolas


Vous avez reçu ce message, car vous êtes abonné au groupe “Railsfrance” de
Google G…
Pour transmettre des messages à ce groupe, envoyez un e-mail à l’adresse
removed_email_address@domain.invalid
Pour résilier votre abonnement envoyez un e-mail à l’adresse
removed_email_address@domain.invalid

Subscription settings:
http://groups.google.com/group/railsfrance/subscribe?hl=fr


#18

J’ai l’impression que contrairement à ce que je croyais, xapian ne
sait pas lire directement des pdf, j’arrive à indexer du rtf et du txt
en faisant

  return File.new(RAILS_ROOT+'/public'+document.url).read

Mais pas un pdf. Pouvez vous me le confirmer?


Vous avez reçu ce message, car vous êtes abonné au groupe “Railsfrance” de
Google G…
Pour transmettre des messages à ce groupe, envoyez un e-mail à l’adresse
removed_email_address@domain.invalid
Pour résilier votre abonnement envoyez un e-mail à l’adresse
removed_email_address@domain.invalid

Subscription settings:
http://groups.google.com/group/railsfrance/subscribe?hl=fr


#19

Merci Julien, c’est très sympa de me répondre de façon aussi
détaillée.

Nicolas


Vous avez reçu ce message, car vous êtes abonné au groupe “Railsfrance” de
Google G…
Pour transmettre des messages à ce groupe, envoyez un e-mail à l’adresse
removed_email_address@domain.invalid
Pour résilier votre abonnement envoyez un e-mail à l’adresse
removed_email_address@domain.invalid

Subscription settings:
http://groups.google.com/group/railsfrance/subscribe?hl=fr


#20

Bonjour,

Il faut utiliser pour cela la gem pdf-reader
(http://github.com/yob/pdf-reader) afin d’extraire le texte brut :

receiver = PageTextReceiver.new
PDF::Reader.file(document.path, receiver)
receiver.content.join(’ ')

avec PageTextReceiver :

require “pdf/reader”

class PageTextReceiver
attr_accessor :content

def initialize
@content = []
end

Called when page parsing starts

def begin_page(arg = nil)
@content << “”
end

record text that is drawn on the page

def show_text(string, *params)
@content.last << string.strip
end

there’s a few text callbacks, so make sure we process them all

alias :super_show_text :show_text
alias :move_to_next_line_and_show_text :show_text
alias :set_spacing_next_line_show_text :show_text

this final text callback takes slightly different arguments

def show_text_with_positioning(*params)
params = params.first
params.each { |str| show_text(str) if str.kind_of?(String)}
end
end

Pour les fichiers TXT :

File.read(document.path)

Pour le RTF, je pense qu’il faudrait enlever tout ce qui concerne la
mise en forme, car cela risque de polluer tes données.

Sinon un petit conseil avec Paperclip tu as la méthode path sur les
assets, donc au lieu de :

RAILS_ROOT+’/public’+document.url

tu as :

document.path

Julien

On 16/04/10 11:37, Tranquiliste wrote:

J’ai l’impression que contrairement à ce que je croyais, xapian ne
sait pas lire directement des pdf, j’arrive à indexer du rtf et du txt
en faisant

   return File.new(RAILS_ROOT+'/public'+document.url).read

Mais pas un pdf. Pouvez vous me le confirmer?


Vous avez reçu ce message, car vous êtes abonné au groupe “Railsfrance” de
Google G…
Pour transmettre des messages à ce groupe, envoyez un e-mail à l’adresse
removed_email_address@domain.invalid
Pour résilier votre abonnement envoyez un e-mail à l’adresse
removed_email_address@domain.invalid

Subscription settings:
http://groups.google.com/group/railsfrance/subscribe?hl=fr