Pergunta

Eu estou tentando fazer pesquisa de texto completo no PostgreSQL 8.3. É trabalhou esplendidamente, portanto, I adicionado em correspondência sinónimos (por exemplo, 'bob' == 'Robert') usando um dicionário de sinónimos. Isso funciona muito bem também. Mas tenho notado que, aparentemente, só permite que uma palavra tenha um sinônimo. Isto é, 'al' não pode ser 'Albert' e 'allen'.

Isso é correto? Existe alguma maneira de ter vários jogos dicionário em uma PostgreSQL sinônimo dicionário?

Para referência, aqui é o meu arquivo de dicionário de exemplo:

bob    robert
bobby  robert
al     alan
al     albert
al     allen

E o SQL que cria a pesquisa de texto completo de configuração:

CREATE TEXT SEARCH DICTIONARY nickname (TEMPLATE = synonym, SYNONYMS = nickname);
CREATE TEXT SEARCH CONFIGURATION dxp_name (COPY = simple);
ALTER TEXT SEARCH CONFIGURATION dxp_name ALTER MAPPING FOR asciiword WITH nickname, simple;

O que estou fazendo de errado? Obrigado!

Foi útil?

Solução

Isso é uma limitação na forma como os sinônimos trabalhar. O que você pode fazer é dar a volta como em:

bob    robert
bobby  robert
alan   al
albert al
allen  al

Deve dar o mesmo resultado final, o que é que uma busca por qualquer um desses irá corresponder a mesma coisa.

Outras dicas

Um dicionário deve definir uma relação funcional entre palavras e lexemes caso contrário ele não vai saber qual palavra para retornar quando você lexize. No seu exemplo, al mapeia para três valores diferentes definindo assim uma função multi-valorizados e a função lexize não sabe o que para voltar. Como mostra a Magnus, você pode lexize do nomes próprios alan, albert, allen ao al apelido.

Lembre-se no entanto, que o ponto de um dicionário STF não é realizar transformações em si, mas para permitir a indexação eficiente em palavras semanticamente relevantes. Isto significa que o lexema não precisa se assemelham a entrada original em nenhum sentido linguística. Embora você está certo de que um relacionamento muitos-para-muitos é impossível definir, você realmente precisa? Por exemplo, para resolver o exemplo vin:

vin        vin
vincent    vin
vincenzo   vin
vinnie     vin

mas você também pode fazer isso:

vin        grob
vincent    grob
vincenzo   grob
vinnie     grob

e obter o mesmo efeito (embora por que você iria querer é outra história).

Assim, se você fosse para analisar um documento com digamos 11 versões do nome Vincent, em seguida, a função to_tsvector voltaria vin:11 no primeiro caso e grob:11 no último.

Na documentação 8,4, que fala sobre um dicionário de sinónimos de substituição, talvez isso será útil?

http://www.postgresql.org/docs/8.4 /interactive/dict-xsyn.html

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