AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 182510
Accepted
Brooks
Brooks
Asked: 2017-08-03 07:05:34 +0800 CST2017-08-03 07:05:34 +0800 CST 2017-08-03 07:05:34 +0800 CST

Usando SELECT dentro da chamada to_tsvector em CREATE INDEX

  • 772

Estou tentando criar um índice GIN para pesquisa de texto completo em um campo que pode conter texto em um dos vários idiomas diferentes. Os idiomas são predefinidos e saberemos em qual idioma queremos pesquisar no momento da consulta. Aqui está o esquema que eu tenho até agora ...

CREATE SCHEMA source;
CREATE SCHEMA common;

CREATE TABLE common.lang (
    id SERIAL PRIMARY KEY,
    name TEXT NOT NULL UNIQUE,
    code TEXT NOT NULL UNIQUE,
    created_at TIMESTAMP NOT NULL DEFAULT now()
);

INSERT INTO common.lang (name, code) VALUES
  ('english', 'en'),
  ('arabic', 'ar'),
  ('chinese', 'zh'),
  ('undefined', 'und');

CREATE TABLE source.user (
    id SERIAL PRIMARY KEY,
    name TEXT NOT NULL,
    screen_name TEXT NOT NULL UNIQUE,
    profile_lang_id INTEGER NOT NULL REFERENCES common.lang(id) ON DELETE CASCADE ON UPDATE CASCADE,
    created_at TIMESTAMP NOT NULL DEFAULT now()
);

CREATE INDEX source_user_names_idx ON source.user USING GIN (to_tsvector(SELECT common.lang.name FROM source.user INNER JOIN common.lang ON common.lang.id = source.user.profile_lang_id, name || ' ' || screen_name));

Ele relata um erro de sintaxe em ou próximo a "SELECT", o que faz sentido ... eu não acho que poderia apenas calçar uma instrução select lá, mas não tenho certeza de como usar corretamente uma instrução select dentro da chamada to_tsvector .

Eu olhei https://stackoverflow.com/a/21299033/4471711 , no entanto, isso codifica os idiomas, enquanto eu quero que os idiomas sejam extraídos de uma tabela dinamicamente no momento da criação do índice. Obviamente, se/quando adicionamos um idioma, precisaríamos recriar o índice.

Eu também olhei https://stackoverflow.com/a/15135730/4471711 , no entanto, isso não é compatível com a criação de um índice e requer apenas 1 parâmetro para to_tsvector, enquanto pareço precisar passar o idioma e o texto coluna.

Também estou tentando criar um índice de pesquisa de texto completo em um campo mais estilo documento, como abaixo:

CREATE TABLE source.post (
    id BIGSERIAL PRIMARY KEY,
    text TEXT NOT NULL
);

CREATE INDEX status_text_idx ON source.post USING GIN (to_tsvector(common_lang_id, text));

Novamente, com o índice acima, quero usar também o idioma especificado pela chave estrangeira para a tabela lang.

Minhas duas perguntas são:

  1. Como uso corretamente a instrução SELECT para pegar o idioma da tabela lang usando sua chave estrangeira na tabela do usuário?

  2. E se o lang for "indefinido" como é uma das opções? Eu não me importaria de padronizar o inglês para fins da chamada to_tsvector... Como eu adiciono esse padrão enquanto ainda permito que a tabela do usuário faça referência a "indefinido"?

postgresql full-text-search
  • 1 1 respostas
  • 1594 Views

1 respostas

  • Voted
  1. Best Answer
    Evan Carroll
    2017-08-03T07:34:29+08:002017-08-03T07:34:29+08:00
    1. Você não. Você não pode criar um índice que faça referência a outra tabela.
    2. Para definir o padrão, consultedefault-text-search-config

    Gambiarra

    No entanto, você pode usar funções em um índice. E as funções podem referenciar tabelas externas. Dito isso, usar isso é meio que hack porque alterar a tabela ( common.lang) exigirá a reindexação e a limpeza do cache da sessão.

    CREATE FUNCTION common.mylookup(id int)
    RETURNS regconfig AS $$
      SELECT name::regconfig
      FROM common.lang
      WHERE id = id
    $$
    LANGUAGE sql
    IMMUTABLE;
    
    CREATE INDEX
      ON source.user
      USING GIN (to_tsvector(common.mylookup(profile_lang_id), name || ' ' || screen_name ));
    

    Você pode marcar funções como o IMMUTABLEque torna isso permitido. Se a tabela subjacente sofrer mutação, você terá que usar REINDEXo index. Em projetos que usam esse hack, como PostGIS, eles recriam índices em lançamentos pontuais.

    Acompanhamento

    @EvanCarroll, estou tentando criar o tsvector no nome || ' ' || Nome do ecrã. – Brooks 4 minutos atrás

    A pesquisa de texto completo não está lá para fazer o que você acha que faz. Não está lá para pesquisar vários campos. Ele está lá para vetorizar o conteúdo das palavras e fazer uso de dicionários, stubbing, lexers, gazetteers, eliminação de palavras de parada e uma série de outros truques que nenhum deles se aplica. Se isso não faz sentido para você, você terá que ler os documentos. Se o que você quer é grep, o FTS raramente é o que você quer. Se você deseja grep em pequenos pedaços de texto não padrão (como nomes), não é o que você deseja. O que você provavelmente deseja indexação de trigramas.

    Se tudo o que você quer é um %term%em dois campos, é melhor fazer isso com um índice de trigrama .

    CREATE EXTENSION pg_trgm;
    CREATE INDEX ON source.user USING GIN ((name || ' ' || screen_name) gin_trgm_ops);
    WHERE name || ' ' || screen_name like '%$1%';
    

    Ou melhor ainda,

    CREATE INDEX ON source.user USING GIN (name gin_trgm_ops, screen_name gin_trgm_ops);
    WHERE name LIKE '%$1%' OR screen_name LIKE '%$1%';
    
    • 1

relate perguntas

  • Posso ativar o PITR depois que o banco de dados foi usado

  • Práticas recomendadas para executar a replicação atrasada do deslocamento de tempo

  • Os procedimentos armazenados impedem a injeção de SQL?

  • Sequências Biológicas do UniProt no PostgreSQL

  • Qual é a diferença entre a replicação do PostgreSQL 9.0 e o Slony-I?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve