postgres=# create extension pg_trgm ;
CREATE EXTENSION
postgres=# create index on obce using gin (nazev gin_trgm_ops);
CREATE INDEX
postgres=# explain select * from obce where nazev like '%Bene%';
┌──────────────────────────────────────────────────────────────────────────────┐
│ QUERY PLAN │
╞══════════════════════════════════════════════════════════════════════════════╡
│ Bitmap Heap Scan on obce (cost=20.00..24.02 rows=1 width=41) │
│ Recheck Cond: ((nazev)::text ~~ '%Bene%'::text) │
│ -> Bitmap Index Scan on obce_nazev_idx (cost=0.00..20.00 rows=1 width=0) │
│ Index Cond: ((nazev)::text ~~ '%Bene%'::text) │
└──────────────────────────────────────────────────────────────────────────────┘
(4 rows)
3条答案
按热度按时间5anewei61#
如果需要在值的任何位置找到任何字符序列,那么就没有逻辑优化。如果当前的查找需要几秒钟,那么使用这样的外部优化索引可能会有好处:
添加两个额外列:
offset
带索引和length
没有索引。将所有值合并到一个文本文件中,并在每行上保存偏移量和长度。
编写一个外部工具来搜索整个文件(使用类似
strstr()
)并返回偏移量。使用返回偏移量来标识行
SELECT TOP 1 FROM table WHERE offset < @offset ORDER BY offset DESC
.使用
length
字段以确保匹配的片段在记录之间没有重叠:@offset + @length
(搜索字符串的结尾)是<= offset + length
(找到的行上值的结尾)。您还可以将完整的连接文本保存在数据库中的全局变量或专用表中,以避免生成外部进程或访问磁盘。
8xiog9wr2#
postgresql有解决方案-三元索引。这是一篇文章或文件
它也适用于正则表达式。
mbjcgjjk3#
mysql支持全文索引。
您可能会对我的演示文稿全文搜索throwdown感兴趣,我在其中比较了不同的全文索引工具。这个演示文稿现在有点旧了,但有些还很相关。
请回复您的意见:
mysql的全文索引不支持部分单词匹配,尽管它支持有限的通配符,但只支持模式的末尾。而innodb的fulltext实现不支持它,只有myisam支持。见提及
*
中的通配符https://dev.mysql.com/doc/refman/5.7/en/fulltext-boolean.htmlElasticSearch也支持通配符,但与mysql一样,如果通配符位于模式的开头,那么它们就没有效率。看到了吗https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-wildcard-query.html
sphinx搜索支持中缀字符串索引选项。如果你设置
min_infix_len
对于非零正数,它将索引所有中缀子字符串以及整词。看到了吗http://sphinxsearch.com/docs/current.html#conf-最小中缀长度