Pregunta

Tengo una base de datos que me gustaría aprovechar Zend_Search_Lucene.Sin embargo, tengo dificultades para crear un documento "totalmente apto para búsquedas" para Lucene.

Cada Zend_Search_Lucene El documento extrae información de dos tablas de bases de datos relacionales (Table_One y Table_Two). Table_One tiene información básica (id, owner_id, title, description, location, etc.), Table_Two tiene una relación 1:N con Table_One (es decir, para cada entrada en Table_One, podría haber una o más entradas en Table_Two).Tabla_Dos contiene:identificación, listing_id, bedrooms, bathrooms, price_min, price_max, date_available.Ver Figura 1.

Figura 1

Table_One
    id (Primary Key)
    owner_id
    title
    description
    location
    etc...

Table_Two
    id (Primary Key)
    listing_id (Foreign Key to Table_One)
    bedrooms (int)
    bathrooms (int)
    price_min (int)
    price_max (int)
    date_available (datetime)

El problema es que hay múltiples Table_Two entradas para cada Table_One entrada.[Pregunta 1] Cómo crear un Zend_Search_Lucene documento donde cada campo es único?(Ver Figura 2)

Figura 2

Lucene Document
    id:Keyword
    owner_id:Keyword
    title:UnStored
    description:UnStored
    location: UnStored
    date_registered:Keyword
    ... (other Table_One information)
    bedrooms: UnStored
    bathrooms: UnStored
    price_min: UnStored
    price_max: UnStored
    date_available: Keyword
    bedrooms_1: <- Would prefer not to have do this as this makes the bedrooms harder to search.

A continuación, necesito poder realizar una consulta de rango en el bedrooms, bathrooms, price_min y price_max campos.(Ejemplo:encontrar documentos que tengan entre 1 y 3 dormitorios) Zend_Search_Lucene sólo permitirá búsquedas a distancia en el mismo campo.Según tengo entendido, esto significa que cada campo en el que quiero realizar una consulta de rango solo puede contener un valor (ejemplo:dormitorios:"1 dormitorio");

Lo que tengo ahora, dentro del Documento Lucene, es el bedrooms, bathrooms, price_min, price_max, date_available los campos están delimitados por espacios.

Ejemplo:

Sample Table_One Entry: 
    | 5 | 2 | "Sample Title" | "Sample Description" | "Sample Location" | 2008-01-12

Sample Table_Two Entries:
    | 10 | 5 | 3 | 1 | 900 | 1000 | 2009-10-01
    | 11 | 5 | 2 | 1 | 800 | 850 | 2009-08-11
    | 12 | 5 | 1 | 1 | 650 | 650 | 2009-09-15 

Documento de muestra de Lucene

id:5
owner_id:2
title: "Sample Title"
description: "Sample Description"
location: "Sample Location"
date_registered: [datetime stamp YYYY-MM-DD]
bedrooms: "3 bedroom 2 bedroom 1 bedroom" 
bathrooms: "1 bathroom 1 bathroom 1 bathroom"
price_min: "900 800 650"
price_max: "1000 850 650"
date_available: "2009-10-01 2009-08-11 2009-09-15"

[Pregunta 2] ¿Puedes hacer una búsqueda de consulta de rango en el bedroom, bathroom, price_min, price_max, date_available campos como se muestran arriba o cada campo de consulta de rango debe contener solo un valor (p. ej."1 dormitorio")?No he podido hacer que la consulta de rango funcione en su forma actual.Estoy perdido aquí.

Gracias de antemano.

¿Fue útil?

Solución

  1. Le sugiero que cree un documento Lucene separado para cada entrada en Table_Two. Esto provocará cierta duplicación de la información de Table_One común a estas entradas, pero este no es un precio alto a pagar por una estructura de índice mucho más fácil en Lucene.
  2. Utilice un consulta booleana para combinar varias consultas de rango . Los campos con valores numéricos deberían ser algo como esto:

bedrooms: 3

price_min: 900

y una consulta de muestra en sintaxis de Lucene será:

date_available:[20100101 TO 20100301] AND price_min:[600 TO 1000]
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top