2009-06-27 7 views
4

J'ai une base de données que j'aimerais utiliser avec Zend_Search_Lucene. Cependant, j'ai de la difficulté à créer un document «entièrement consultable» pour Lucene. Chaque document Zend_Search_Lucene extrait des informations de deux tables de base de données relationnelles (Table_One et Table_Two). Table_One a des informations de base (id, owner_id, title, description, location, etc.), a Table_Two 1: relation N à Table_One (ce qui signifie, pour chaque entrée Table_One, il pourrait y avoir une ou plusieurs entrées dans Table_Two). Le Tableau 2 contient: id, listing_id, bedrooms, bathrooms, price_min, price_max, date_available. Voir Figure 1.zend search lucene

Figure 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) 

Le problème est, il y a plusieurs Table_Two entrées pour chaque entrée Table_One. [Question 1] Comment créer un document Zend_Search_Lucene où chaque champ est unique? (Voir la figure 2)

Figure 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. 

Ensuite, je dois pouvoir faire une requête sur le Range bedrooms, bathrooms, price_min et price_max champs. (Exemple: trouver des documents qui ont entre 1 et 3 chambres à coucher) Zend_Search_Lucene permettra seulement des recherches à distance sur le même champ. D'après ce que je comprends, cela signifie que chaque champ que je veux faire une requête à distance ne peut contenir qu'une seule valeur (exemple: chambres: "1 chambre");

Ce que j'ai maintenant, dans le document Lucene est le bedrooms, bathrooms, price_min, price_max, date_available champs étant l'espace délimité.

Exemple:

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 

Exemple Lucene document

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" 

[Question 2] Pouvez-vous faire une requête de recherche Plage sur la bedroom, bathroom, price_min, price_max, date_available champs tels qu'ils apparaissent ci-dessus ou est-ce que chaque champ de requête de plage doit contenir une seule valeur (par exemple "1 chambre")? Je n'ai pas réussi à faire fonctionner le Range Query sous sa forme actuelle. Je suis à perdre ici.

Merci d'avance.

Répondre

2
  1. Je vous suggère de créer un document Lucene distinct pour chaque entrée de Table_Two. Cela entraînera une duplication des informations Table_One communes à ces entrées, mais ce n'est pas un prix élevé à payer pour une structure d'index beaucoup plus simple dans Lucene.
  2. Utilisez un boolean query pour combiner plusieurs range queries.Les champs contenant en nombre devrait être quelque chose comme ceci:

bedrooms: 3

price_min: 900

et un exemple de requête dans la syntaxe Lucene sera:

date_available:[20100101 TO 20100301] AND price_min:[600 TO 1000] 
+0

Merci. C'est exactement ce que j'ai fait et cela fonctionne très bien. Merci. –