2009-06-27 5 views
4

У меня есть база данных, которую я бы хотел использовать с Zend_Search_Lucene. Однако мне трудно создать для Lucene документ с полной возможностью поиска.zend search lucene

Каждый документ Zend_Search_Lucene извлекает информацию из двух таблиц реляционных баз данных (Table_One и Table_Two). Table_One имеет основную информацию (id, owner_id, title, description, location и т.д.), Table_Two имеет 1 а: N отношение к Table_One (значения, для каждой записи в Table_One, не может быть один или несколько записей в Table_Two). Таблица_Two содержит: id, listing_id, bedrooms, bathrooms, price_min, price_max, date_available. См Рисунок 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) 

Проблема заключается в том, существует несколько Table_Two записей для каждого Table_One записи. [Вопрос 1] Как создать документ Zend_Search_Lucene, где каждое поле уникально? (Смотри рисунок 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. 

Далее, мне нужно, чтобы быть в состоянии сделать Range Query на полях bedrooms, bathrooms, price_min и price_max. (Пример: поиск документов, содержащих от 1 до 3 спален) Zend_Search_Lucene разрешает только поиск в дальнем порядке в одном и том же поле. По моему мнению, это означает, что каждое поле, в котором я хочу выполнить запрос диапазона, может содержать только одно значение (пример: спальни: «1 спальня»);

То, что я сейчас, в рамках Lucene документа является bedrooms, bathrooms, price_min, price_max, date_available полями, пробелами.

Пример:

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 

Образец 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" 

[Вопрос 2] Вы можете сделать поиск Range запрос по bedroom, bathroom, price_min, price_max, date_available поля, как они показаны выше или каждое поле запроса диапазона должно содержать только одно значение (например, «1 спальня»)? Я не смог заставить Range Query работать в его текущей форме. Я теряюсь здесь.

Заранее спасибо.

ответ

2
  1. Предлагаю вам создать отдельный документ Lucene для каждой записи в Table_Two. Это приведет к некоторому дублированию информации Table_One, общей для этих записей, но это не высокая цена за гораздо более легкую структуру индекса в Lucene.
  2. Используйте boolean query, чтобы объединить несколько range queries.Номерные многозначных полей должно быть что-то вроде этого:

bedrooms: 3

price_min: 900

и образец запроса в синтаксисе Lucene будет:

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

Спасибо. Это именно то, что я сделал, и он отлично работает. Спасибо вам. – 2009-07-02 19:19:33