Jump to content
Fórum Script Brasil
  • 0

Fazer consulta por nome independente da ordem das palavras


Liah

Question

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 to comment
Share on other sites

14 answers to this question

Recommended Posts

  • 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 to comment
Share on other 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

Edited by Liah
Link to comment
Share on other 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 to comment
Share on other 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 to comment
Share on other 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 to comment
Share on other 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)

Edited by Kakao
Link to comment
Share on other 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 to comment
Share on other 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...

Edited by Liah
Link to comment
Share on other 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 to comment
Share on other 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 to comment
Share on other 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 to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



  • Forum Statistics

    • Total Topics
      152k
    • Total Posts
      651.6k
×
×
  • Create New...