zend Suche Lucene
-
20-08-2019 - |
Frage
Ich habe eine Datenbank, die ich mit Zend_Search_Lucene
nutzen möchte. Aber ich habe Schwierigkeiten ein „vollständig durchsuchbare“ Dokument für Lucene zu schaffen.
Jedes Zend_Search_Lucene
Dokument zieht Informationen aus zwei Tabellen relationaler Datenbanken (Table_One
und Table_Two
). Table_One
hat grundlegende Informationen (id
, owner_id
, title
, description
, location
, etc.), hat Table_Two
eine 1: n-Beziehung (das heißt, für jeden Eintrag in Table_One
, könnte es ein oder mehr Einträge in Table_One
sein) Table_Two
. Table_Two enthält: id, listing_id
, bedrooms
, bathrooms
, price_min
, price_max
, date_available
. Siehe Abbildung 1.
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)
Das Problem ist, gibt es mehrere Table_Two
Einträge für jeden Table_One
Eintrag. [Frage 1] Wie ein Zend_Search_Lucene
Dokument erstellen, in dem jedes Feld eindeutig ist? (Siehe Abbildung 2)
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.
Als nächstes muss ich der Lage sein, ein Range-Abfrage auf den bedrooms
, bathrooms
, price_min
und price_max
Felder zu tun. (Beispiel: Dokumente zu finden, die zwischen 1 und 3 Schlafzimmer haben) Zend_Search_Lucene
nur reichte erlauben sucht auf dem gleichen Feld. Von meinem Verständnis bedeutet dies jedes Feld ich auf eine Fern Abfrage tun will nur einen Wert enthalten kann (Beispiel: Schlafzimmer: „1 Schlafzimmer“);
Was habe ich jetzt, im Lucene Dokument ist die bedrooms
, bathrooms
, price_min
, price_max
, date_available
Felder Raum begrenzt ist.
Beispiel:
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
Beispiel 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"
[Frage 2] Können Sie ein Range-Abfrage-Suche auf dem bedroom
, bathroom
, price_min
, price_max
, date_available
Felder, wie sie oben dargestellt sind oder tut jeder Bereich Abfragefeld nur einen Wert enthalten haben (zB „1 Schlafzimmer“) ? Ich habe nicht in der Lage, die Bereichsabfrage an der Arbeit in seiner jetzigen Form zu erhalten. Ich bin an einem verlieren hier.
Vielen Dank im Voraus.
Lösung
- Ich schlage vor, Sie ein separates Dokument Lucene in Table_Two für jeden Eintrag erstellen. Dies wird einige Duplizierung der Table_One Informationen gemeinsam diese Einträge verursacht, aber das ist nicht ein hoher Preis für viele einfache Indexstruktur in Lucene zu zahlen.
- Verwenden Sie ein boolean Abfrage kombinieren mehrere Bereichsabfragen . Die Zahl bewerten Felder sollten wie folgt sein:
bedrooms: 3
price_min: 900
und eine Beispielabfrage in Lucene Syntax wird:
date_available:[20100101 TO 20100301] AND price_min:[600 TO 1000]