相关疑难解决方法(0)

PostgreSQL LIKE查询性能变化

关于LIKE查询数据库中特定表的响应时间,我看到了相当大的变化.有时我会在200-400毫秒内得到结果(非常可接受),但有时候返回结果可能需要30秒.

我知道LIKE查询是非常耗费资源的,但我只是不明白为什么响应时间会有这么大的差异.我已经在该owner1字段上构建了一个btree索引,但我认为这对LIKE查询没有帮助.有人有主意吗?

示例SQL:

SELECT gid, owner1 FORM parcels
WHERE owner1 ILIKE '%someones name%' LIMIT 10
Run Code Online (Sandbox Code Playgroud)

我也尝试过:

SELECT gid, owner1 FROM parcels
WHERE lower(owner1) LIKE lower('%someones name%') LIMIT 10
Run Code Online (Sandbox Code Playgroud)

和:

SELECT gid, owner1 FROM parcels
WHERE lower(owner1) LIKE lower('someones name%') LIMIT 10
Run Code Online (Sandbox Code Playgroud)

有类似的结果.
表行数:约95,000.

postgresql indexing query-optimization pattern-matching sql-like

103
推荐指数
3
解决办法
7万
查看次数

全文和基于属性的搜索引擎的混合

背景:

表示不同类型事件(音乐会,足球比赛,慈善机构等)的SQL数据库,其中每个都包含与事件相关的数据(音乐会 - 艺术家姓名,匹配 - 主持人/访客团队).所有这些事件都从一个通用表继承event,该表包含与所有这些事件相关的数据(名称,描述,位置,开始/结束日期).使用HibernateDoctrine中已知的table-per-subclass模型实现继承.该数据库还存储表artists(id,name,birth_date)和football_teams(id,name,country,coach_name)在使用event_concertsevent_football_matches表(通过FKS).

问题:

创建一个给定一些标准({name: "manchester", startDate: "01.01.2012 - 01.02.2012"}{location: "london", description: "artists +metallica -bieber"})的搜索引擎将返回符合条件的所有事件,以及artists/ football_teamstables的结果.

这些事件的某些属性包含大量文本,应以全文搜索方式进行搜索.

例:

根据以下搜索条件:

{ location: "london", startDate: "05.11.2012 - 07.11.2012" }
Run Code Online (Sandbox Code Playgroud)

搜索引擎应返回:

  1. (橄榄球事件)阿森纳对曼联比赛,酋长球场,伦敦,06.11.2012
  2. (音乐会活动)Metallica音乐会,一些花式位置,05.11.2012
  3. (足球队/非活动)阿森纳,成立时间:1886年,联赛:英超联赛
  4. (足球队/不是活动)切尔西,成立时间:1905年,联赛:英超联赛
  5. (节日活动)万圣节在伦敦,07.11.2012
  6. (舞蹈活动)Sadler's Wells的睡美人,45英镑,07.11.2012
  7. (音乐家,不是活动)Neil Christian,1943 - 2012,Rock'n'Roll主唱

如您所见,仅在事件发生时才考虑startDate(与事件相关的属性). …

performance search full-text-search

5
推荐指数
1
解决办法
427
查看次数

用于自动完成字段的类似UTF-8字符串

背景

用户可以键入名称,系统应与文本匹配,即使用户输入或数据库字段包含重音(UTF-8)字符也是如此.这是使用该pg_trgm模块.

问题

代码类似于以下内容:

  SELECT
    t.label
  FROM
    the_table t
  WHERE
    label % 'fil'
  ORDER BY
    similarity( t.label, 'fil' ) DESC
Run Code Online (Sandbox Code Playgroud)

当用户键入时fil,查询匹配filbert但不匹配filé powder.(因为重音字符?)

解决方案#1失败

我试图实现一个unaccent函数并将查询重写为:

  SELECT
    t.label
  FROM
    the_table t
  WHERE
    unaccent( label ) % unaccent( 'fil' )
  ORDER BY
    similarity( unaccent( t.label ), unaccent( 'fil' ) ) DESC
Run Code Online (Sandbox Code Playgroud)

这只返回filbert.

解决方案#2失败

建议:

CREATE EXTENSION pg_trgm;
CREATE EXTENSION unaccent;

CREATE OR REPLACE FUNCTION unaccent_text(text)
  RETURNS text AS
$BODY$
  SELECT unaccent($1); …
Run Code Online (Sandbox Code Playgroud)

postgresql similarity utf-8 plpgsql string-comparison

2
推荐指数
1
解决办法
2167
查看次数