Zend Lucene search
-
20-08-2019 - |
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.
Solução
- 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.
- 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]