Ir para conteúdo
Fórum Script Brasil
  • 0

Fazer consulta por nome independente da ordem das palavras


Liah

Pergunta

Boa tarde

Bom, gostaria de saber se alguém sabe alguma forma de retornar um dado independente da ordem que eu digite o nome.

Exemplo:

Ao procurar pela descrição 'CABO ACELERADOR GOL' não irá encontrar um produto que tenha no conteúdo a descrição 'CABO ACELERADOR PARA GOL 1.0 E 1.6', preciso de alguma função que retorne esse produto independente da forma como eu procure, seja 'CABO ACELERADOR GOL' ou 'ACELERADOR CABO GOL' mas retorne o produto 'CABO ACELERADOR PARA GOL 1.0 E 1.6', ou seja, uma função que procure somente pelas palavras e não pelas palavras e a ordem das mesmas.

Desculpe se não fui clara o suficiente, é meio difícil de explicar, mas é isso, se alguém puder me ajudar ficarei grata.

Obrigada. ^_^

Link para o comentário
Compartilhar em outros sites

14 respostass a esta questão

Posts Recomendados

  • 0

A consulta precisa retornar as descrições que tenham todas as palavras da frase ou basta uma delas? Qual é a versão do postgresql? Vou tentar responder amanhã. Por enquanto você pode dar uma pesquisada em "text search". No manual (inglês):

http://www.postgresql.org/docs/current/sta...textsearch.html

http://www.postgresql.org/docs/current/sta...textsearch.html

Link para o comentário
Compartilhar em outros sites

  • 0
A consulta precisa retornar as descrições que tenham todas as palavras da frase ou basta uma delas? Qual é a versão do postgresql? Vou tentar responder amanhã. Por enquanto você pode dar uma pesquisada em "text search". No manual (inglês):

http://www.postgresql.org/docs/current/sta...textsearch.html

http://www.postgresql.org/docs/current/sta...textsearch.html

Preciso que busque por todas as palavras digitadas, ou seja, retorne somente os registros que contenham todas as palavras digitadas, se for uma palavra só, busca todos os registros que contenham aquela palavra, se forem 3 palavras, busca os registros que contenham todas as 3 palavras...

A versão do meu postgresql é a 1.4

Editado por Liah
Link para o comentário
Compartilhar em outros sites

  • 0

Testei com esta tabela:

create table ts (descricao text);
insert into ts values
    ('ACELERADOR CABO CARRO GOL'),
    ('FREIO CARRO GOL'),
    ('acelerador cabo gol');
Substitua 'CABO ACELERADOR GOL' pelos termos procurados:
select *
from ts
where lower(descricao) like all (string_to_array(
    '%' ||
    regexp_replace(lower('CABO ACELERADOR   GOL'), '\s+', '% %', 'g')
    || '%', ' '));
         descricao         
---------------------------
 ACELERADOR CABO CARRO GOL
 acelerador cabo gol

Para algo mais sofisticado tem que usar os tipos, funções e operadores de text search.

Link para o comentário
Compartilhar em outros sites

  • 0
Testei com esta tabela:

create table ts (descricao text);
insert into ts values
    ('ACELERADOR CABO CARRO GOL'),
    ('FREIO CARRO GOL'),
    ('acelerador cabo gol');
Substitua 'CABO ACELERADOR GOL' pelos termos procurados:
select *
from ts
where lower(descricao) like all (string_to_array(
    '%' ||
    regexp_replace(lower('CABO ACELERADOR   GOL'), '\s+', '% %', 'g')
    || '%', ' '));
         descricao         
---------------------------
 ACELERADOR CABO CARRO GOL
 acelerador cabo gol

Para algo mais sofisticado tem que usar os tipos, funções e operadores de text search.

Kakao fiz o que você indicou, mas ocorreu o seguinte erro:

ERROR: function nregexp_replace(text, "unknown", "unknown", "unknown") does not exist

HINT: No function matches the given name and argument types. You may need to add explicit type casts.

Estou pesquisando sobre essa função nregexp_replace, mas não encontrei nada que possa me ajudar ainda :(

Link para o comentário
Compartilhar em outros sites

  • 0
Não é nregexp. É regexp sem o n.

Ah sim, hehe, percebi esse equivoco enquanto estive pesquisando a função, mas mesmo assim, ele só retorna o resultado quando digito uma palavra, se for mais de uma não retorna nenhum registro, tem algo a ver com isso ('\s+', '% %', 'g') ?

Fiz o sequinte Select

SELECT * FROM PCCDAPL0 WHERE UPPER(APLICA) LIKE ALL (STRING_TO_ARRAY('%' || REGEXP_REPLACE(UPPER('CABO FREIO'), '\s+', '% %', 'g') || '%', ' '))
E não retornou nada, mas se eu faço o seguinte select
SELECT * FROM PCCDAPL0 WHERE UPPER(APLICA) LIKE ALL (STRING_TO_ARRAY('%' || REGEXP_REPLACE(UPPER('FREIO'), '\s+', '% %', 'g') || '%', ' '))

Retorna os 4 registros.

Como faço para retornar os registros quando digitado mais que uma palavra?

Link para o comentário
Compartilhar em outros sites

  • 0

Qual é o valor de APLICA nestes 4 registros para eu poder testar aqui? Eu testei com o valor 'cabo freio' e funcionou (retornou as linhas). Testei assim:

drop table PCCDAPL0;
create table PCCDAPL0 (APLICA text);
insert into PCCDAPL0 values
    ('cabo freio'),
    ('cabo grande do freio'),
    ('cabo freio corsa'),
    ('conjunt de cabo do freio'),
    ('ACELERADOR CABO CARRO GOL'),
    ('FREIO CARRO GOL'),
    ('acelerador cabo gol');

SELECT *
FROM PCCDAPL0
WHERE UPPER(APLICA) LIKE ALL (STRING_TO_ARRAY(
    '%' ||
    REGEXP_REPLACE(UPPER('CABO FREIO'), '\s+', '% %', 'g')
    || '%', ' '))
;
          aplica          
--------------------------
 cabo freio
 cabo grande do freio
 cabo freio corsa
 conjunt de cabo do freio
(4 rows)

Editado por Kakao
Link para o comentário
Compartilhar em outros sites

  • 0

Só um deles tem as duas palavras cabo e freio. Eu entendi que você queria que voltasse só aqueles que tivessem todas as palavras. Foi a primeira coisa que perguntei. A consulta que eu postei só retorna aquelas descrições que contenham todas as palavras pesquisadas. Confirme se é isso mesmo ou se você quer que volte aqueles que tenham pelo menos uma das palavras pesquisadas.

Link para o comentário
Compartilhar em outros sites

  • 0
Só um deles tem as duas palavras cabo e freio. Eu entendi que você queria que voltasse só aqueles que tivessem todas as palavras. Foi a primeira coisa que perguntei. A consulta que eu postei só retorna aquelas descrições que contenham todas as palavras pesquisadas. Confirme se é isso mesmo ou se você quer que volte aqueles que tenham pelo menos uma das palavras pesquisadas.

Ah sim, desculpe, entendi mau, esses são os valores quando pesquisado somente com a palvra 'FREIO', quando pesquisado com a palavra 'CABO FREIO' não retornava nada, mas retirando o espaço entre as aspas simples no final assim:

SELECT *
FROM PCCDAPL0
WHERE UPPER(APLICA) LIKE ALL (STRING_TO_ARRAY(
    '%' ||
    REGEXP_REPLACE(UPPER('CABO DE FREIO'), '\s+', '% %', 'g')
    || '%', ''))

retorna a linha com as palavras digitadas, mas o caso é que a pessoa pode digitar sem o 'DE', ou seja, só 'CABO FREIO', e neste caso não retornará nada, e preciso que retorne todos os registros que contenham as palavras digitadas, independente se seguem a ordem das palavras do registro ou não, se for digitado 'CABO FREIO', preciso que retorne o registro 'CABO DE FREIO TRASEIRO', se for digitado 'FREIO CABO' também preciso que retorne o registro 'CABO DE FREIO TRASEIRO'...

E sim, deve retornar os registros que contém todas as palavras pesquisadas...

Editado por Liah
Link para o comentário
Compartilhar em outros sites

  • 0

Eu pesquisei 'cabo freio' e retornou a linha. Não tem que mudar nada na consulta.

drop table PCCDAPL0;
create table PCCDAPL0 (APLICA text);
insert into PCCDAPL0 values
('CABO DE FREIO TRASEIRO'),
('FLEXIVEL DE FREIO'),
('ALAVANCA DE ACIONAMENTO DO FREIO PELO PE'),
('MOLA INTERRUPTOR DE FREIO, PEDAL DE FREIO E ALAVANCA DE FREIO CARGO 200 ZH. KIT COM AS 3.');

SELECT *
FROM PCCDAPL0
WHERE UPPER(APLICA) LIKE ALL (STRING_TO_ARRAY(
    '%' ||
    REGEXP_REPLACE(UPPER('CABO FREIO'), '\s+', '% %', 'g')
    || '%', ' '))
;
         aplica         
------------------------
 CABO DE FREIO TRASEIRO

Link para o comentário
Compartilhar em outros sites

  • 0
Eu pesquisei 'cabo freio' e retornou a linha. Não tem que mudar nada na consulta.

drop table PCCDAPL0;
create table PCCDAPL0 (APLICA text);
insert into PCCDAPL0 values
('CABO DE FREIO TRASEIRO'),
('FLEXIVEL DE FREIO'),
('ALAVANCA DE ACIONAMENTO DO FREIO PELO PE'),
('MOLA INTERRUPTOR DE FREIO, PEDAL DE FREIO E ALAVANCA DE FREIO CARGO 200 ZH. KIT COM AS 3.');

SELECT *
FROM PCCDAPL0
WHERE UPPER(APLICA) LIKE ALL (STRING_TO_ARRAY(
    '%' ||
    REGEXP_REPLACE(UPPER('CABO FREIO'), '\s+', '% %', 'g')
    || '%', ' '))
;
         aplica         
------------------------
 CABO DE FREIO TRASEIRO

Será que pode ser alguma coisa com a versão do postgres? Não entendo porque aqui não funciona, apenas copiei e colei o que você postou aí em cima aqui e não funcionou, só retorna se eu escrever 'CABO DE FREIO' e se retirar o espaço entre as aspas simples do STRING_TO_ARRAY no final, somente 'CABO FREIO' não retorna nada =\

Link para o comentário
Compartilhar em outros sites

  • 0

Achei o problema. Em versões mais antigas tem que escapar a barra invertida, colocando '\\s+' ao invés de '\s+':

SELECT *
FROM PCCDAPL0
WHERE UPPER(APLICA) LIKE ALL (STRING_TO_ARRAY(
    '%' ||
    REGEXP_REPLACE(UPPER('CABO FREIO'), '\\s+', '% %', 'g')
    || '%', ' '))
;

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,1k
    • Posts
      651,8k
×
×
  • Criar Novo...