Pergunta

Eu tive esse problema de longo prazo por não entender bem como implementar uma classificação ou classificação Lucene decente.Digamos que eu tenha uma lista de cidades e suas populações.Se alguém pesquisar "novo" ou "londres", quero a lista de correspondências de prefixo ordenadas por população, e tenho isso trabalhando com uma pesquisa de prefixo e uma classificação por campo invertida, onde há um campo de população, ou seja, Novo México, Nova York ;ou Londres, Londonderry.

No entanto, também sempre quero que o nome correspondente exato esteja no topo.Portanto, no caso de "Londres", a lista deve mostrar "London, London, Londonderry", onde a primeira Londres está no Reino Unido e a segunda Londres está em Connecticut, mesmo que Londonderry tenha uma população maior que Londres CT.

Alguém tem uma solução de consulta única?

Foi útil?

Solução

dlamblin, deixe-me ver se entendi corretamente:Você deseja fazer uma consulta baseada em prefixo e, em seguida, classificar os resultados por população e talvez combinar a ordem de classificação com preferência por correspondências exatas.Sugiro que você separe a pesquisa da classificação e use um CustomSorter para a classificação:Aqui está uma entrada de blog descrevendo um classificador personalizado. O livro clássico de Lucene descreve isso bem.

Outras dicas

API para

Comparador de classificação

diz

Há um distinto comparável para cada termo exclusivo no campo - se alguns documentos tiverem o mesmo termo no campo, a matriz de cache terá entradas que referenciam o mesmo

Você pode aplicar um

FieldSortedHitQueue

ao sortcomparator que possui um campo Comparator para o qual a API diz ...

Armazena um comparador correspondente a cada campo que está sendo classificado.

Assim, o termo pode ser classificado de acordo

Minha solução atual é criar um pesquisador exato e um pesquisador de prefixo, ambos classificados por população reversa, e depois copiar todos os meus resultados, começando pelos resultados exatos, passando para os resultados do prefixo.Isso torna a paginação dos meus resultados um pouco mais irritante do que eu acho que deveria ser.

Também usei um hash para eliminar duplicatas, mas depois mudei o pesquisador de prefixo para uma consulta booleana de uma pesquisa de prefixo (DEVE) com uma pesquisa exata (NÃO DEVE), para que Lucene remova as duplicatas.Embora isso parecesse ainda mais um desperdício.

Editar:Movido para um comentário (já que o recurso já existe): Yuval F. Obrigado pelo seu post no blog ...Como o comparador de classificação saberia que o campo de nome “londres” corresponde exatamente ao termo de pesquisa “londres” se não puder acessar o termo de pesquisa?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top