Várias correspondências dicionário de sinónimos em PostgreSQL pesquisa de texto completo
-
05-07-2019 - |
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!
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