通配符前后一个字符串-mysql,psql

rfbsl7qr  于 2021-06-25  发布在  Mysql
关注(0)|答案(3)|浏览(342)

我需要表演 Contains 列中的操作。对于contains操作,我们需要在单词前后使用通配符。
例:个性化
查询->如“%sonal%”
因为这种类型的查询不能使用索引。有没有办法提高搜索速度。
注意:我使用mysql(innodb)和psql

5anewei6

5anewei61#

如果需要在值的任何位置找到任何字符序列,那么就没有逻辑优化。如果当前的查找需要几秒钟,那么使用这样的外部优化索引可能会有好处:
添加两个额外列: offset 带索引和 length 没有索引。
将所有值合并到一个文本文件中,并在每行上保存偏移量和长度。
编写一个外部工具来搜索整个文件(使用类似 strstr() )并返回偏移量。
使用返回偏移量来标识行 SELECT TOP 1 FROM table WHERE offset < @offset ORDER BY offset DESC .
使用 length 字段以确保匹配的片段在记录之间没有重叠: @offset + @length (搜索字符串的结尾)是 <= offset + length (找到的行上值的结尾)。
您还可以将完整的连接文本保存在数据库中的全局变量或专用表中,以避免生成外部进程或访问磁盘。

8xiog9wr

8xiog9wr2#

postgresql有解决方案-三元索引。这是一篇文章或文件

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)

它也适用于正则表达式。

mbjcgjjk

mbjcgjjk3#

mysql支持全文索引。
您可能会对我的演示文稿全文搜索throwdown感兴趣,我在其中比较了不同的全文索引工具。这个演示文稿现在有点旧了,但有些还很相关。
请回复您的意见:
mysql的全文索引不支持部分单词匹配,尽管它支持有限的通配符,但只支持模式的末尾。而innodb的fulltext实现不支持它,只有myisam支持。见提及 * 中的通配符https://dev.mysql.com/doc/refman/5.7/en/fulltext-boolean.html

SELECT ... WHERE MATCH(mycolumn) AGAINST ('stack*' IN BOOLEAN MODE)

ElasticSearch也支持通配符,但与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-最小中缀长度

相关问题