我有一个postgresql表"people"有一个名为full_names"(VARCHAR(150))。我已经按照字母顺序(按单词顺序)保存了这些full_names,并在另一列中保持原始顺序:
-
- James Henry Carl Dumas"——比;卡尔·杜马斯·亨利·詹姆斯
-
- Al Peter Karl hitto "——比;Al Hito Karl Peter">
如果在此之上我按字母顺序排序——>
- 1"。阿尔·彼得·卡尔·希托;——比;Al Hito Karl Peter">
- 2"。詹姆斯·亨利·卡尔·杜马斯&;——比;卡尔·杜马斯·亨利·詹姆斯
我基本上有很多关于表内容的信息,我可以使用这些信息来快速搜索人员:例如,我希望下一个输入input: "Henry Jam"或"大仲马汽车";会给我一个匹配。
在像"python"我会很容易地建立一些算法,很容易地丢弃表的一大块,然后另一小块,因为这样的算法将知道行和整个表是如何排序的,但是我不知道如何与POSTGRESQL交流这些信息,以便它将使用它。
我只在列"full_names"(唯一相关的列),它将按字母顺序对表行进行排序,但我不知道如何沟通单词的行中顺序。
是否有可能使用一些智能postgresql功能或直接在postgresql中编写搜索算法?
我研究了索引,全文或直接编写sql代码。
-
一旦您保存了内部排序的
text
值(字段,单元格),它们将在表中内部保持这种方式。 -
当您创建索引时,表将不仅仅"被排序";相反,您用作索引键的列将用于构建一个单独的结构,即二叉树。从那时起,当您使用该列查询表以进行过滤、排序等操作时。PostgreSQL将检测到它,而不是扫描表,它将爬升/下降树结构,这是更快的。如果您不以任何其他列为目标,它将更快,因为它将直接从索引中检索值,而不必从索引跳转到表中收集其他任何内容。
为了建立索引,PostgreSQL分析了这些值的全部,以及它们的内部结构——毕竟,它必须能够区分
'ab'
和'aa'
。它已经告知了关于单词的"行顺序"。 -
如果您计划针对您的值的单个部分,拆分它们:
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
-
如果你打算使用更复杂的文本搜索和分析,你可能想看看tsvector和triggram。