在postgresql中已经按字母顺序排序的行.如何在搜索中使用这些信息?



我有一个postgresql表"people"有一个名为full_names"(VARCHAR(150))。我已经按照字母顺序(按单词顺序)保存了这些full_names,并在另一列中保持原始顺序:

    1. James Henry Carl Dumas"——比;卡尔·杜马斯·亨利·詹姆斯
    1. Al Peter Karl hitto "——比;Al Hito Karl Peter">

如果在此之上我按字母顺序排序——>

  • 1"。阿尔·彼得·卡尔·希托;——比;Al Hito Karl Peter">
  • 2"。詹姆斯·亨利·卡尔·杜马斯&;——比;卡尔·杜马斯·亨利·詹姆斯

我基本上有很多关于表内容的信息,我可以使用这些信息来快速搜索人员:例如,我希望下一个输入input: "Henry Jam"或"大仲马汽车";会给我一个匹配。

在像"python"我会很容易地建立一些算法,很容易地丢弃表的一大块,然后另一小块,因为这样的算法将知道行和整个表是如何排序的,但是我不知道如何与POSTGRESQL交流这些信息,以便它将使用它。

我只在列"full_names"(唯一相关的列),它将按字母顺序对表行进行排序,但我不知道如何沟通单词的行中顺序。

是否有可能使用一些智能postgresql功能或直接在postgresql中编写搜索算法?

我研究了索引,全文或直接编写sql代码。

  1. 一旦您保存了内部排序的text值(字段,单元格),它们将在表中内部保持这种方式。

  2. 当您创建索引时,表将不仅仅"被排序";相反,您用作索引键的列将用于构建一个单独的结构,即二叉树。从那时起,当您使用该列查询表以进行过滤、排序等操作时。PostgreSQL将检测到它,而不是扫描表,它将爬升/下降树结构,这是更快的。如果您不以任何其他列为目标,它将更快,因为它将直接从索引中检索值,而不必从索引跳转到表中收集其他任何内容。

    为了建立索引,PostgreSQL分析了这些值的全部,以及它们的内部结构——毕竟,它必须能够区分'ab''aa'。它已经告知了关于单词的"行顺序"。

  3. 如果您计划针对您的值的单个部分,拆分它们:

    create table people(id serial primary key,full_name text);
    insert into people (full_name) values 
    ('James Henry Carl Dumas'),
    ('Al Peter Karl Hito');
    create table split_names as 
    select id as people_id, 
    row_number() over (partition by id order by name_part ) internal_order, 
    name_part
    from 
    ( select id, 
    regexp_split_to_table(full_name, ' ') name_part
    from people) a;
    -- people_id | internal_order | name_part
    -------------+----------------+-----------
    --         1 |              1 | Carl
    --         1 |              2 | Dumas
    --         1 |              3 | Henry
    --         1 |              4 | James
    --         2 |              1 | Al
    --         2 |              2 | Hito
    --         2 |              3 | Karl
    --         2 |              4 | Peter
    
  4. 如果你打算使用更复杂的文本搜索和分析,你可能想看看tsvector和triggram。

相关内容

  • 没有找到相关文章

最新更新