Pregunta

Digamos que tengo un FirstName> MiddleName> jerarquía Apellido (~ filas 10k, por el bien de la cuestión). Esto significa que podría tener "John> Mary-Anne> Eddy" o "Eddy> John> Jacob" fila. El punto es que la jerarquía no tiene mucho sentido y es muy extraño para el usuario (a diferencia de, digamos, un País> Estado> estructura de la ciudad).

Debido a su tan estructurado y confusa, quiero proporcionar al usuario un cuadro de entrada de auto completo. A medida que escriba, debe buscar posibles coincidencias de subcadenas, y cuando "raíz" de su cadena de búsqueda en un nivel, que serán entonces restringir los resultados por debajo de ese nivel.

Ahora, porque hay un montón de personas de nombre "Juan", no tiene mucho sentido que si escribe "John" sólo volver resultados como

  • John> Allen> Alexander
  • John> Allen> Burschawitz
  • John> Allen ... repetir 100 veces ...

Debido a que nunca verán la fila única "Jason> John> Smith".

En cambio, deben volver a algo así como ( "*" es sólo un indicador arbitraria al usuario de "bueno, mucho más filas por debajo de este existir"):

  • John> Allen> *
  • Jason> John> Smith
  • Mike> John> *
  • María> Elena> Johnason

Si se escribe "John> Al" a continuación, los resultados se limitan a cualquier cosa bajo "John>", pero deben ser agrupados de manera similar a la anterior.

Espero que la explicación es clara. Los requisitos son un poco floja. Sólo unos razonables para que una persona puede buscar a través del árbol y encontrar lo que buscan.

En este momento, tengo algo de SQL interesante que busca el término de búsqueda en la fila, se da cuenta de su posición, hace algunos substring'ing, apartaderos de grupo, y el orden de conseguir los resultados anteriores, pero no es lo suficientemente bien realizar .

Estoy tratando de resolver este problema en una pila típica LAMP (excepto con Oracle). No es alojamiento compartido, por lo que tiene el control total sobre el servidor. Los datos cambian pequeñas cantidades cada pocas semanas, y los resultados de la búsqueda se puede quedar obsoleta por una cantidad razonable de tiempo (por ejemplo, un cron que actualiza el índice de búsqueda no está fuera de la cuestión).

¿Fue útil?

Solución

Argh. Lo siento, no era capaz de describir mi problema. De todas formas, aquí está la solución que se me ocurrió.

Básicamente, crear una segunda tabla de la mesa 3-columna que contiene todos los valores distintos para cada nivel sucesivo de la jerarquía, así como una columna para indicar la profundidad de esa fila en la jerarquía.

por ejemplo. De mytable(A, B, C), crear search_t(A, B, C, level)

Por lo tanto, con "One> dos> Tres", se crea 3 filas (A, B, C, nivel):

  • "One", null, null, 1
  • "uno", "Two", null, 2
  • "uno", "dos", "tres", 3

Durante la búsqueda, puede limitar el nivel escogiendo un valor para el nivel y la disponibilidad valores para las columnas de nivel superior:

WHERE A='One' and level > 1 and (B like '%t%' or C like '%t')

Puede ser un poco simplificado y genérico si se crea una columna search_str y realizar el emparejamiento contra LIKE en su lugar.

WHERE A='One' and level > 1 and search_str like '%t%'

En retrospectiva, esto probablemente habría sido más evidente si los datos ya estaban en un modelo de adyacencia lista.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top