Pergunta

Estou construindo uma função de pesquisa para um site php usando Zend Lucene e eu estou tendo um problema. Meu site é um diretor Loja (algo parecido).

Por exemplo, eu tenho uma loja chamada "FooBar" mas meus visitantes seach para "Foo Bar" e obter zero resultados. Além disso, se uma loja é chamado de "Foo Bar" e seaches visitante "FooBar" nada é encontrado.

Eu tentei da pesquisa para "foobar ~" (da pesquisa difusa), mas não encontrou artigos com o nome "Foo Bar"

Existe uma maneira speciar para construir o índice ou fazer a consulta?

Foi útil?

Solução

Opção 1: quebrar a seqüência de consulta de entrada em duas partes em vários pontos e procurá-los. por exemplo. Neste caso consulta seria (+ + fo bar) ou (+ + foo bar) ou (+ foob + ar) O problema é o uso de token assume existem duas fichas em cadeia de pesquisa de entrada. Além disso, você pode obter extra, possivelmente irrelevante, resultados como resultados de (+ foob + ar)

Opção 2: Uso n-gram tokenization enquanto indexação e consulta. Enquanto indexar as fichas para "barra foo" seria fo, oo, ba, AR. Embora a pesquisa com ola, fichas seria fo, oo, ob, ba, AR. Pesquisando com o OU como operador irá dar-lhe os documentos com partidas máximo n-gram no topo. Isto pode alcançado com NGramTokenizer

Outras dicas

manualmente as entradas de índice adicional para a maioria das confusões de nomes comuns. Obter seus clientes para digitá-los em um formulário especial.

Você tentou "* foo * E * * bar" ou "* foo * OR * * bar"? Ele funciona em Ferret e eu lê-lo é baseado em Lucene.

Se você não se preocupam com o desempenho, o uso WildcardQuery (desempenho é significativamente pior):

new WildcardQuery( new Term( "propertyName", "Foo?Bar" ) );

Para zero ou mais caracteres, use '*', por zero ou um caractere, use '?'

Se o desempenho é importante, tente usar BooleanQuery.

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