search solr lucene full-text-search tokenize

search - Amazon como la búsqueda con Solr



lucene full-text-search (1)

Descargo de responsabilidad :

He hecho algunas suposiciones sobre el esquema, así que por favor revisa la esencia con el ejemplo de esquema y datos - https://gist.github.com/rchukh/7385672#file-19854599

Por ejemplo, para los taxones he utilizado un campo de texto especial con PathHierarchyTokenizerFactory

Primer problema (búsqueda difusa):

El problema por el cual Inferno no coincide con Infenro es porque no es un error ortográfico fonético. El filtro fotético no está diseñado para ese tipo de coincidencia.

Si está interesado en algunos detalles, aquí hay un artículo bastante bueno sobre los algoritmos soportados por lucene / solr: http://ntz-develop.blogspot.com/2011/03/phonetic-algorithms.html

Probablemente estarás interesado en la función Clasificar de SpellCheck

http://wiki.apache.org/solr/SpellCheckComponent#spellcheck.collate

De la wiki:

Una intercalación es la cadena de consulta original con las mejores sugerencias para cada término reemplazado en ella. Si spellcheck.collate es verdadero, Solr tomará la mejor sugerencia para cada token (si existe) y construirá una nueva consulta a partir de las sugerencias. Por ejemplo, si la consulta de entrada era "jawa class lording" y la mejor sugerencia para "jawa" era "java" y "lording" era "carga", entonces la intercalación resultante sería "carga de clase java".

También puede aprovechar la función de búsqueda difusa en función de los algoritmos de distancia (pero, como entiendo, es más útil para búsquedas de frase, por ejemplo, búsqueda de proximidad ). Aquí hay un ejemplo de la wiki de Solr:

roam~ This search will match terms like foam and roams. It will also match the word "roam" itself.

Así que Infenro~ in query debería coincidir con Inferno en el índice ... pero mi apuesta es ir con el enfoque "google-like":

Es decir: notifique al usuario que los siguientes resultados son para la ortografía correcta, pero también permita que use la ortografía incorrecta (como ocurre, algunas veces el usuario puede tener razón y la máquina puede estar equivocada).

Segundo problema

Este problema se puede resolver con edismax, por ejemplo, si desea buscar por nombre_text Y opciones:

q=shirt%20AND%20red&defType=edismax&qf=name_text%20options

Aquí puede ver el plan de explicación de esta consulta: http://explain.solr.pl/explains/w1qb7zie

El problema con el almacenamiento de opciones como campo multivalor con separador es que la consulta de búsqueda comenzará a coincidir con la clave, por ejemplo, "color".

Por ejemplo, la siguiente solicitud:

q=shirt%20AND%20color&defType=edismax&qf=name_text%20options

coincidirá con todas las camisetas que tienen la opción de "color" - http://explain.solr.pl/explains/pn6fbpfq

Tercer problema

Tengo algunas dudas sobre el uso de FilterFactory después de los stemmers, pero no puedo proporcionar alguna información mala en la actualidad.

Tenemos una tienda en línea donde utilizamos Solr para buscar productos. La configuración básica funciona bien, pero actualmente le faltan algunas características. Busqué algunas tiendas en línea como Amazon, y me gustaron las características que ofrecen. Entonces pensé, ¿cómo podría configurar Solr para ofrecer algunas de las funciones a nuestros usuarios finales?

Nuestros datos de productos consisten en datos un poco estándar para productos como

  • título de un producto
  • descripción
  • un producto está en múltiples categorías y subcategorías
  • un producto puede tener múltiples variantes con opciones, como una camiseta en rojo, azul, verde, S, M, L, XL ... o un iPad con 16 GB, 32 GB ...
  • un producto tiene una marca
  • un producto tiene un minorista

Por ahora, estamos usando este archivo de esquema para indexar y realizar consultas en Solr:

<fieldType name="text" class="solr.TextField" omitNorms="false"> <analyzer type="index"> <tokenizer class="solr.StandardTokenizerFactory"/> <filter class="solr.StandardFilterFactory"/> <filter class="solr.WordDelimiterFilterFactory" catenateWords="1" catenateAll="1" preserveOriginal="1"/> <filter class="solr.LowerCaseFilterFactory"/> <filter class="solr.EdgeNGramFilterFactory" minGramSize="2" maxGramSize="15"/> </analyzer> <analyzer type="query"> <tokenizer class="solr.StandardTokenizerFactory"/> <filter class="solr.StandardFilterFactory"/> <filter class="solr.WordDelimiterFilterFactory" catenateWords="1" catenateAll="1" preserveOriginal="1"/> <filter class="solr.LowerCaseFilterFactory"/> <filter class="solr.PorterStemFilterFactory"/> <filter class="solr.PhoneticFilterFactory" encoder="DoubleMetaphone" inject="true"/> </analyzer> </fieldType>

  • EdgeNGramFilterFactory indexa una palabra como shirt en sh , shi , shir , shirt
  • WordDelimiterFilterFactory divide palabras como wi-fi en wi , fi , wifi
  • PorterStemFilterFactory funciona bien para stemming
  • PhoneticFilterFactory proporciona una búsqueda algo borrosa

Un problema es que la búsqueda difusa no funciona muy bien. Si busco el libro Inferno y lo escribo mal con Infenro , la búsqueda no arroja ningún resultado. He leído sobre el SpellCheckComponent ( http://wiki.apache.org/solr/SpellCheckComponent ), pero no estoy seguro de si esa es la mejor manera de hacer una búsqueda aproximada, o ¿Querías decir? característica.

El segundo problema es que debería ser posible buscar Shirts red para encontrar camisetas rojas (donde el rojo es un valor de opción del color de la opción tipo) o buscar woman shoes o adidas shoes woman . ¿Es posible hacer esto con Solr?

Y el tercer problema es que no estoy seguro de cuál de los tokenizadores y filtros dentro de schema.xml son una buena opción para lograr tales características.

Espero que alguien haya usado tales características con solr y pueda ayudarme en este caso. ¡Gracias!

EDITAR

Aquí hay algunos datos que almacenamos en Solr:

<doc> <str name="id">572</str> <arr name="taxons"> <str>cat1</str> <str>cat1/cat2</str> <str>cat1/cat2/cat3</str> <str>cat1/cat4</str> </arr> <arr name="options"> <str>color_blue</str> <str>color_red</str> <str>size_39</str> <str>size_40</str> </arr> <int name="count_on_hand">321</int> <arr name="name_text"> <str>Riddle-Shirt Tech</str> </arr> <arr name="description_text"> <str>The Riddle Shirt Tech Men''s Hoodie features signature details, along with ultra-lightweight fleece for optimum warmth.</str> </arr> <arr name="brand_text"> <str>Riddle</str> </arr> <arr name="retailer_text"> <str>Supershop</str> </arr> </doc>

No estoy seguro de si los pares clave-valor de options se almacenan de forma adecuada, pero ese es el primer enfoque que se me ocurrió.