Domanda

Ho un database che vorrei sfruttare con Zend_Search_Lucene. Tuttavia, ho difficoltà a creare un & Quot; quot <<>> completamente ricercabile; documento per Lucene.

Ogni Table_One documento estrae informazioni da due tabelle di database relazionali (Table_Two e id). owner_id ha informazioni di base (title, description, location, listing_id, bedrooms, ecc.), bathrooms ha una relazione 1: N con price_min (che significa, per ogni voce in price_max, potrebbero esserci una o più voci in date_available). Table_Two contiene: id, bedroom, bathroom, <=>, <=>, <=>, <=>. Vedi 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)

Il problema è che ci sono più <=> voci per ogni <=> voce. [Domanda 1] Come creare un <=> documento in cui ciascun campo è unico? (Vedi 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.

Successivamente, devo essere in grado di eseguire una query di intervallo sui campi <=>, <=>, <=> e <=>. (Esempio: ricerca di documenti che hanno tra 1 e 3 camere da letto) <=> consentirà solo ricerche a distanza nello stesso campo. Da quanto ho capito, questo significa che ogni campo su cui voglio fare una query a distanza può contenere solo un valore (esempio: camere da letto: & Quot; 1 camera da letto & Quot;);

Quello che ho ora, all'interno del Documento Lucene, sono i campi <=>, <=>, <=>, <=>, <=> delimitati da spazi.

Esempio:

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 

Esempio di documento 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"

[Domanda 2] È possibile eseguire una ricerca con intervallo sui campi <=>, <=>, <=>, <=>, <=> come sono mostrati sopra o ogni campo di query dell'intervallo deve contenere solo un valore (ad es. " 1 camera da letto ")? Non sono stato in grado di far funzionare la Range Query nella sua forma attuale. Sono in perdita qui.

Grazie in anticipo.

È stato utile?

Soluzione

  1. Ti suggerisco di creare un documento Lucene separato per ogni voce in Table_Two. Ciò causerà una duplicazione delle informazioni Table_One comuni a queste voci, ma questo non è un prezzo elevato da pagare per una struttura dell'indice molto più semplice in Lucene.
  2. Utilizza un query booleana per combinare diverse query di intervallo . I campi con valori numerici dovrebbero essere qualcosa del genere:

bedrooms: 3

price_min: 900

e una query di esempio nella sintassi di Lucene sarà:

date_available:[20100101 TO 20100301] AND price_min:[600 TO 1000]
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top