query near examples example search lucene solr proximity

search - near - solr like query syntax



La proximidad de Solr ordenada versus desordenada (3)

¿Estás seguro de que ya no funciona así? No hay nada en la documentación que diga que está ''ordenado'':

Se puede hacer una búsqueda de proximidad con una consulta de frase descuidada. Cuanto más juntos aparezcan los dos términos en el documento, mayor será el puntaje. Una consulta de frase descuidada especifica un "slop" máximo, o el número de tokens de posiciones que se deben mover para obtener una coincidencia.

Este ejemplo para el manejador de solicitudes estándar encontrará todos los documentos donde aparece "batman" dentro de las 100 palabras de "película":

http://wiki.apache.org/solr/SolrRelevancyFAQ#How_can_I_search_for_one_term_near_another_term_.28say.2C_.22batman.22_and_.22movie.22.29

En Solr puede realizar una búsqueda de proximidad ordenada utilizando la sintaxis

"word1 word2"~10

Por orden quiero decir que palabra1 siempre vendrá antes que palabra2 en el documento. Me gustaría saber si hay una manera fácil de realizar una búsqueda de proximidad desordenada, es decir. word1 y word2 ocurren dentro de las 10 palabras entre sí y no importa cuál viene primero.

Una forma de hacer esto sería:

"word1 word2"~10 OR "word2 word1"~10

Lo anterior funcionará, pero estoy buscando algo más simple, si es posible

Gracias en Advance Ruth


Desde Solr 4 es posible con SurroundQueryParser .

Por ejemplo, para hacer una búsqueda ordenada (consulta donde "frase dos" sigue a "frase uno" no más de 3 palabras después):

3W(phrase W one, phrase W two)

Para hacer una búsqueda desordenada (consulta "frase dos" en proximidad de 5 palabras de "frase uno"):

5N(phrase W one, phrase W two)


Slop significa cuántas transposiciones de palabras pueden ocurrir. Entonces "ab" va a ser diferente a "ba" porque se permite un número diferente de transposiciones.

  • a foo b tiene posiciones (a, 1), (foo, 2), (b, 3). Para emparejar (a, 1), (b, 2) requerirá un cambio: (b, 2) => (b, 3)
  • Sin embargo, para unir (b, 1), (a, 2) necesitará (a, 2) => (a, 1) y (b, 1) => (b, 3), para un total de tres posiciones movimientos

En general, si "ab"~n coincide con algo, entonces "ba"~(n+2) coincidirá también.

EDITAR: Creo que nunca di una respuesta. Veo dos opciones:

  1. Si quieres una pendiente de n, increméntala a n + 2
  2. Desvincular manualmente su búsqueda como sugirió

Creo que el # 2 es probablemente mejor, a menos que tu slop sea muy grande para empezar.