Pergunta

Eu tenho um banco de dados que eu gostaria de alavancagem com Zend_Search_Lucene. No entanto, estou tendo dificuldade em criar um documento "totalmente pesquisável" para Lucene.

Cada documento Zend_Search_Lucene puxa informações de duas tabelas de banco de dados relacionais (Table_One e Table_Two). Table_One tem informação básica (id, owner_id, title, description, location, etc), Table_Two tem uma relação de 1: N para Table_One (o que significa, para cada entrada na Table_One, pode haver uma ou mais entradas na Table_Two). Table_Two contém: id, listing_id, bedrooms, bathrooms, price_min, price_max, date_available. Veja 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)

O problema é que há várias entradas Table_Two para cada entrada Table_One. [Pergunta 1] Como criar um documento Zend_Search_Lucene onde cada campo é único? (Ver 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.

Em seguida, eu preciso ser capaz de fazer uma consulta Faixa nos campos bedrooms, bathrooms, price_min e price_max. (Exemplo: encontrar documentos que têm entre 1 e 3 quartos) Zend_Search_Lucene só irá permitir pesquisas sobre o mesmo campo variou. No meu entendimento, isso significa que cada campo eu quero fazer uma consulta variou em só pode conter um valor (por exemplo: quartos: "1 quarto");

O que eu tenho agora, dentro do documento Lucene é o bedrooms, bathrooms, price_min, price_max, campos date_available sendo espaço delimitado.

Exemplo:

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 

Amostra Lucene Documento

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"

[Pergunta 2] Can você fizer uma pesquisa Faixa de consulta sobre os campos bedroom, bathroom, price_min, price_max, date_available como eles são mostrados acima ou faz cada campo de consulta gama têm de conter apenas um valor (por exemplo, "T1") ? Eu não tenho sido capaz de obter a consulta Faixa de trabalho na sua forma actual. Estou em um perder aqui.

Agradecemos antecipadamente.

Foi útil?

Solução

  1. Sugiro que você crie um documento Lucene separado para cada entrada no Table_Two. Isso fará com que alguma duplicação do comum informações Table_One a essas entradas, mas este não é um preço alto a pagar por estrutura de índice muito mais fácil no Lucene.
  2. Use um boolean query para combinar vários consulta de intervalo . Os campos de valor de número deve ser algo como isto:

bedrooms: 3

price_min: 900

e uma consulta de exemplo na sintaxe Lucene será:

date_available:[20100101 TO 20100301] AND price_min:[600 TO 1000]
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top