2010-04-22 31 views
6

Los últimos días estamos pensando en utilizar Solr como nuestro motor de búsqueda preferido. La mayoría de las características que necesitamos están listas para usar o pueden configurarse fácilmente. Sin embargo, hay una característica que necesitamos absolutamente que parece estar bien oculta (o falta) en Solr.Asociaciones de Solr

Trataré de explicarlo con un ejemplo. Tenemos un montón de documentos que son en realidad las empresas:

<document> 
    <name>Apache</name> 
    <cat>1</cat> 
    ... 
</document> 
<document> 
    <name>McDonalds</name> 
    <cat>2</cat> 
    ... 
</document> 

Además tenemos otro archivo XML con todas las categorías y sinónimos:

<cat id=1> 
    <name>software</name> 
    <synonym>IT<synonym> 
</cat> 
<cat id=2> 
    <name>fast food</name> 
    <synonym>restaurant<synonym> 
</cat> 

Queremos asociar las empresas y categorías para que podamos buscar usando el nombre y/o sinónimos de la categoría. Pero no queremos fusionar estos archivos en el momento de la indexación porque deberíamos actualizar las categorías (agregar sinónimos ... sin volver a indexar todas las empresas).

¿Hay algo en Solr que haga este tipo de asociaciones o tenemos que desarrollar algunas piezas específicas?

Todos los comentarios y sugerencias son bienvenidos.

Gracias de antemano, Tom

Respuesta

0

No se puede encontrar las piezas no indexados de información, a menos que implemente algún tipo de consulta traducción/expansión que se traduce algunos términos de la consulta en su equivalente indexado antes de enviar la consulta.

Por lo tanto, si el usuario escribe "restaurante", su consulta se traduce para incluir un filtro por cat = 1.

Por lo que sé Solr no incluye esta característica, por lo que debe implementarlo solo o adaptar un módulo adecuado (como http://lucene-qe.sourceforge.net/).

4

Básicamente, usted tiene una decisión de diseño aquí. Lo que la gente suele hacer con los índices de Solr es desnormalizarlos, es decir, explotar la definición de categoría en el documento de la empresa. Como no desea hacer esto, sugiero mantener dos tipos de documentos, uno para las empresas y otro para las categorías. Puede mantener ambos en el mismo índice, ya que Solr no requiere que todos los documentos tengan los mismos campos. Los documentos comerciales parecen sencillos, pero tiene que hacerlos buscar tanto por el nombre de la empresa como por la identificación de la categoría. Sugiero crear un documento de categoría para cada sinónimo, donde busca por sinónimo y encuentra el id (y el nombre de la categoría).

Para búsqueda utilizando sinónimos, tendrá una doble búsqueda -

  • Búsqueda de ID de categoría utilizando el texto del nombre.
  • Busque empresas que utilicen la identificación de categoría.
2

En realidad, existe una clase de filtro llamada solr.SynonymFilterFactory.

Esto debería permitirle a asignar los números de gato a sus 2 equivalentes de texto, si lo usa en el analizador de consultas solamente, algo así como lo siguiente:

<fieldType name="category" class="solr.TextField" positionIncrementGap="100"> 
    <analyzer type="index"> 
    <tokenizer class="solr.WhitespaceTokenizerFactory"/> 
    <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1" catenateAll="0" splitOnCaseChange="1"/> 
    <filter class="solr.LowerCaseFilterFactory"/> 
    </analyzer> 
    <analyzer type="query"> 
    <tokenizer class="solr.WhitespaceTokenizerFactory"/> 
    <filter class="solr.SynonymFilterFactory" synonyms="category_Synonyms.txt" ignoreCase="true" expand="false"/> 
    <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="0" catenateNumbers="0" catenateAll="0" splitOnCaseChange="1"/> 
    <filter class="solr.LowerCaseFilterFactory"/> 
    </analyzer> 
</fieldType> 

De esa manera usted puede indexar sólo la categoría ID .Esto significa que no tendrá tiene que enviar todas las empresas a Solr nuevamente. Además, si alguien consulta "software" o "TI" se asignará a la categoría

Su category_Synonyms.txt debe tener líneas como las siguientes:

1, software, TI

La única desventaja aquí es que tendrás que encontrar la forma de editar el documento de texto cuando cambies los nombres o sinónimos. ¿Entonces supongo que esto solo ayudará si cambias los nombres de las categorías con poca frecuencia? A menos que alguien más sepa de una manera que esto pueda hacerse fácilmente.

De hecho, me añade el anterior a mi propia Solr y corrió la herramienta Analyser en él .. aquí está el resultado:

alt text

Como se puede ver se ha girado software en

Tenga en cuenta que debe establecer el

ampliar

parámetro para

falsa

espero que esto ayude.

de Dave

0

Aparte de algunas de las excelentes ideas ofrecidas anteriormente, también puede mirar a un campos de varios valores. Por lo tanto, su campo de categoría puede contener cualquier cantidad de valores (y actualizarse cuando sea necesario), cuando realiza una búsqueda, consulta todos los valores.