2012-08-29 8 views
7

Tengo problemas para hacer que el resaltado funcione con Elasticsearch (y Tire) en una aplicación de Rails. Puedo indexar con éxito archivos PDF adjuntos y consultarlos, pero no puedo hacer que el resaltado funcione.Elasticsearch: Resaltar hits desde el archivo adjunto

No es tan familiar con ES, por lo que no estoy seguro de dónde buscar para solucionar los problemas. Comenzará con asignaciones y una consulta curl, pero no dude en solicitar más información.

class Article < ActiveRecord::Base 
    include Tire::Model::Search 
    include Tire::Model::Callbacks 

    attr_accessible :title, :content, :published_on, :filename 

    mapping do 
    indexes :id, :type =>'integer' 
    indexes :title 
    indexes :content 
    indexes :published_on, :type => 'date' 
    indexes :attachment, :type => 'attachment', 
          :fields => { 
          :name  => { :store => 'yes' }, 
          :content => { :store => 'yes' }, 
          :title  => { :store => 'yes' }, 
          :file  => { :term_vector => 'with_positions_offsets', :store => 'yes' }, 
          :date  => { :store => 'yes' } 
          } 
    end 

    def to_indexed_json 
    to_json(:methods => [:attachment]) 
    end 

    def attachment 
    if filename.present? 
     path_to_pdf = "/Volumes/Calvin/sample_pdfs/#{filename}.pdf" 
     Base64.encode64(open(path_to_pdf) { |pdf| pdf.read }) 
    else 
     Base64.encode64("missing") 
    end 
    end 
end 

Asignaciones (vía Curl):

$ curl -XGET 'http://localhost:9200/_mapping?pretty=true' 
{ 
    "articles" : { 
    "article" : { 
     "properties" : { 
     "attachment" : { 
      "type" : "attachment", 
      "path" : "full", 
      "fields" : { 
      "attachment" : { 
       "type" : "string" 
      }, 
      "title" : { 
       "type" : "string", 
       "store" : "yes" 
      }, 
      "name" : { 
       "type" : "string", 
       "store" : "yes" 
      }, 
      "date" : { 
       "type" : "date", 
       "ignore_malformed" : false, 
       "store" : "yes", 
       "format" : "dateOptionalTime" 
      }, 
      "content_type" : { 
       "type" : "string" 
      } 
      } 
     }, 
     "content" : { 
      "type" : "string" 
     }, 
     "created_at" : { 
      "type" : "date", 
      "ignore_malformed" : false, 
      "format" : "dateOptionalTime" 
     }, 
     "filename" : { 
      "type" : "string" 
     }, 
     "id" : { 
      "type" : "integer", 
      "ignore_malformed" : false 
     }, 
     "published_on" : { 
      "type" : "date", 
      "ignore_malformed" : false, 
      "format" : "dateOptionalTime" 
     }, 
     "title" : { 
      "type" : "string" 
     }, 
     "updated_at" : { 
      "type" : "date", 
      "ignore_malformed" : false, 
      "format" : "dateOptionalTime" 
     } 
     } 
    } 
    } 
}% 

Una consulta con un 'hit' en un 125 PDF página indexada:

$ curl "localhost:9200/_search?pretty=true" -d '{ 
quote> "fields" : ["title"], 
quote> "query" : { 
quote>  "query_string" : { 
quote>  "query" : "xerox" 
quote>  } 
quote> }, 
quote> "highlight" : { 
quote>  "fields" : { 
quote>  "attachment" : {} 
quote>  } 
quote> } 
quote> }' 

{ 
    "took" : 1077, 
    "timed_out" : false, 
    "_shards" : { 
    "total" : 5, 
    "successful" : 5, 
    "failed" : 0 
    }, 
    "hits" : { 
    "total" : 1, 
    "max_score" : 0.036417194, 
    "hits" : [ { 
     "_index" : "articles", 
     "_type" : "article", 
     "_id" : "13", 
     "_score" : 0.036417194, 
     "fields" : { 
     "title" : "F-E12" 
     } 
    } ] 
    } 
}%  

que estaba esperando una sección como:

"highlight" : { 
     "attachment" : [ "\nLast Year <em>Xerox</em> moved their facilities" ] 
    } 

¡Gracias por cualquier ayuda!

Edit2: consulta ajustado (cambiado attachment a attachment.file) fue en vano:

$ curl "localhost:9200/_search?pretty=true" -d '{ 
    "fields" : ["title","attachment"], 
    "query" : {"query_string" : {"query" : "xerox"}}, 
    "highlight" : {"fields" : {"attachment.file" : {}}} 
}' 

{ 
    "took" : 221, 
    "timed_out" : false, 
    "_shards" : { 
    "total" : 5, 
    "successful" : 5, 
    "failed" : 0 
    }, 
    "hits" : { 
    "total" : 1, 
    "max_score" : 0.036417194, 
    "hits" : [ { 
     "_index" : "articles", 
     "_type" : "article", 
     "_id" : "13", 
     "_score" : 0.036417194, 
     "fields" : { 
     "title" : "F-E12", 
     "attachment" : "JVBERi0xLjYNJeLjz9MNCjk4NSAwIG9iag08PC9MaW5lYXJpemVkIDEvTCA...\n" 
     } 
    } ] 
    } 
} 

Edit3 (quitar "campos"):

$ curl "localhost:9200/_search?pretty=true" -d '{ 
> "query" : {"query_string" : {"query" : "xerox"}}, 
> "highlight" : {"fields" : {"attachment" : {}}} 
> }' 

{ 
    "took" : 1078, 
    "timed_out" : false, 
    "_shards" : { 
    "total" : 5, 
    "successful" : 5, 
    "failed" : 0 
    }, 
    "hits" : { 
    "total" : 1, 
    "max_score" : 0.036417194, 
    "hits" : [ { 
     "_index" : "articles", 
     "_type" : "article", 
     "_id" : "13", 
     "_score" : 0.036417194, "_source" : {"content":"Real report","created_at":"2012-08-28T22:44:08Z","filename":"F-E12","id":13,"published_on":"2007-12-28","title":"F-E12","updated_at":"2012-08-28T22:44:08Z","attachment":"JVBERi0xLjYNJeLjz9MNCjk4NSAwIG9iag08PC9MaW5lYXJpemVkID...\n" 
     } 
    } ] 
    } 
} 

Edit4 (mapeo de Tipo adjuntos en Acción tutorial):

$ curl -XGET 'http://localhost:9200/test/_mapping?pretty=true' 
{ 
    "test" : { 
    "attachment" : { 
     "properties" : { 
     "file" : { 
      "type" : "attachment", 
      "path" : "full", 
      "fields" : { 
      "file" : {    #<== This appears to be missing 
       "type" : "string",  #<== from my Articles mapping 
       "store" : "yes",  #<== 
       "term_vector" : "with_positions_offsets" #<== 
      }, 
      "author" : { 
       "type" : "string" 
      }, 
      "title" : { 
       "type" : "string", 
       "store" : "yes" 
      }, 
      "name" : { 
       "type" : "string" 
      }, 
      "date" : { 
       "type" : "date", 
       "ignore_malformed" : false, 
       "format" : "dateOptionalTime" 
      }, 
      "keywords" : { 
       "type" : "string" 
      }, 
      "content_type" : { 
       "type" : "string" 
      } 
      } 
     } 
     } 
    } 
    } 
} 
+0

Me temo que la asignación que ha publicado está relacionada con un tipo diferente: es un archivo adjunto, no un artículo. ¿Estás seguro de que la asignación del artículo es correcta? ¿Podría también agregar el adjunto de campo a la salida? – javanna

+0

No estoy seguro * cualquier cosa * es correcta, así que haga sugerencias. He agregado el método 'attachment 'que solicitó. ¡Aprecio tu ayuda! – Meltemi

+0

Disculpa, ¡no me di cuenta de que estabas usando el tipo de campo de adjuntos! ¡El mapeo se ve bien! Creo que deberías tratar de resaltar el campo 'attachment.file' en lugar de' attachment'. ¡Déjame saber cómo fue! – javanna

Respuesta

8

¡Lo descubrí! Finalmente ...

problema con mi sintaxis de mapeo en la clase Artículo. Necesario para cambiar el nombre de ": archivo" a ": archivo adjunto".

tire.mapping do 
    indexes :id, :type =>'integer' 
    indexes :title 
    indexes :content 
    indexes :published_on, :type => 'date' 
    indexes :attachment, :type => 'attachment', #:null_value => 'missing_file', 
          :fields => { 
          :name  => { :store => 'yes' }, # exists?!? 
          :content => { :store => 'yes' }, 
          :title  => { :store => 'yes' }, 
    # WRONG! see next line => :file  => { :term_vector => 'with_positions_offsets', :store => 'yes' }, 
          :attachment => { :term_vector => 'with_positions_offsets', :store => 'yes' }, 
          :date  => { :store => 'yes' } 
          } 
+1

¡Buena captura! Me alegro de saber que has resuelto! – javanna

+0

Imagino que esto cambió (volver) a 'archivo' a partir de la versión ES 0.90.0 – divadpoc

+0

¿Alguna idea sobre cómo hacer esto a través de curl o python? – Craneum

Cuestiones relacionadas