Zend Search Lucene - PullRequest
       18

Zend Search Lucene

4 голосов
/ 27 июня 2009

У меня есть база данных, которую я хотел бы использовать с Zend_Search_Lucene. Однако у меня возникают трудности при создании документа с полным поиском для 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). Table_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_One существует несколько Table_Two записей. [Вопрос 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 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] Можете ли вы выполнить поиск по диапазону в полях bedroom, bathroom, price_min, price_max, date_available, как показано выше, или каждое поле запроса диапазона должно содержать только одно значение (например, «1 спальня»)? Мне не удалось заставить Range Range Query работать в его текущей форме. Я в растерянности.

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

1 Ответ

2 голосов
/ 01 июля 2009
  1. Я предлагаю вам создать отдельный документ Lucene для каждой записи в Table_Two. Это приведет к некоторому дублированию информации Table_One, общей для этих записей, но это невысокая цена за гораздо более простую структуру индекса в Lucene.
  2. Используйте логический запрос , чтобы объединить несколько запросов диапазона . Числовые поля должны быть примерно такими:

bedrooms: 3

price_min: 900

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

date_available:[20100101 TO 20100301] AND price_min:[600 TO 1000]
...