tutorial query near examples español lucene solr

query - Cómo hacer coincidir subconjuntos de una cadena de búsqueda en SOLR/lucene



solr query examples (3)

Tengo una situación inusual. Normalmente, cuando busca un índice de texto, busca un número pequeño de palabras clave contra documentos con un mayor número de términos.

Por ejemplo, puede buscar "marrón rápido" y esperar coincidir con "el zorro marrón rápido salta sobre el perro flojo".

Tengo la situación en la que tengo muchas frases pequeñas en mi tienda de documentos y deseo compararlas con una frase de consulta más grande.

Por ejemplo, si tengo una consulta:

  • "el zorro marrón rápido salta sobre el perro flojo"

y los documentos

  • "marrón rápido"
  • "zorro sobre"
  • "Perro perezoso"

Me gustaría encontrar los documentos que tienen una frase que aparece en la consulta. En este caso "marrón rápido" y "perro perezoso" (pero no "zorro sobre" porque aunque los tokens coinciden, no es una frase en la cadena de búsqueda).

¿Este tipo de consulta es posible con SOLR / lucene?


Parece que quieres el parámetro "coincidencia mínima" DisMax. Escribí un artículo de blog sobre el concepto aquí un momento: http://blog.websolr.com/post/1299174416 . También está la wiki de Solr en la partida mínima .

El concepto de "coincidencia mínima" se aplica a todos los términos "opcionales" en su consulta, términos que no se especifican explícitamente, usando +/-, ya sean "+ obligatorios" o "prohibidos". De forma predeterminada, la coincidencia mínima es del 100%, lo que significa que debe estar presente el 100% de los términos opcionales. En otras palabras, todos sus términos se consideran obligatorios.

Esta es la razón por la que su consulta más larga no coincide actualmente con los documentos que contienen fragmentos más cortos de esa frase. Las otras palabras clave en la frase de búsqueda más larga se consideran obligatorias.

Si reduce la coincidencia mínima a 1 , solo se considerará obligatorio uno de sus términos opcionales. En cierto modo, esto es lo contrario del valor predeterminado del 100%. Es como si tu consulta de quick brown fox… se convirtiera en quick OR brown OR fox OR … y así sucesivamente.

Si establece su coincidencia mínima en 2 , su frase de búsqueda se dividirá en grupos de dos términos. Una búsqueda de quick brown fox convierte en (quick brown) OR (brown fox) OR (quick fox) … y así sucesivamente. (Disculpe mi consulta de psuedo allí, confío en que vea el punto).

El parámetro de coincidencia mínima también admite porcentajes, por ejemplo, 20% , y algunas expresiones aún más complejas . Entonces hay una buena cantidad de tweakability.


solo el parámetro de ajuste mm no satisfará sus necesidades ya que

"el zorro marrón rápido salta sobre el perro flojo"

coincidirá con los tres documentos

  • "marrón rápido"
  • "zorro sobre"
  • "Perro perezoso"

y como dijiste:

Me gustaría encontrar los documentos que tienen una frase que aparece en la consulta. En este caso "marrón rápido" y "perro perezoso" (pero no "zorro sobre" porque aunque los tokens coinciden, no es una frase en la cadena de búsqueda).


Parece que desea utilizar ShingleFilter en su análisis, de modo que indexe brácteas de palabras: así que agregue ShingleFilterFactory tanto en tiempo de consulta como de índice.

En el momento del índice, sus documentos se indexan como tales:

  • "marrón rápido" -> quick_brown
  • "zorro sobre" -> fox_over
  • "perro perezoso" -> lazy_dog

En el momento de la consulta, su consulta se convierte en:

  • "el rápido zorro marrón salta sobre el perro perezoso" -> "the_quick quick_brown brown_fox fox_jumps jumps_over over_the the_lazy lazy_dog"

Esto aún no es bueno, por defecto formará una consulta de frase. Por lo tanto, en su analizador de consultas solo agregue PositionFilterFactory después de ShingleFilterFactory. Esto "aplana" las posiciones en la consulta para que el verificador trate el resultado como sinónimos, lo que arrojará una consulta booleana con estos subs (todas las cláusulas SHOULD, por lo que básicamente es una consulta OR):

BooleanQuery:

  • the_quick OR
  • quick_brown O
  • brown_fox O
  • ...

esta debería ser la forma más eficaz, ya que entonces es realmente una consulta booleana de termqueries.