模糊搜索双打postgres

时间:2016-09-26 22:32:07

标签: sql postgresql fuzzy-search

我想模糊搜索十进制数而不是字符串。因此,想法是搜索100应该从数据库中的行中带来100,90,95,105,108,120个数值范围。

我也尝试了类似关键字,但它并不像我想要的那样工作。如何对小数进行模糊搜索。谢谢

2 个答案:

答案 0 :(得分:1)

使用between。该功能就是一个例子:

create or replace function fuzzy_match_numeric
    (number numeric, value numeric, deviation numeric)
returns boolean language sql as $$
    select number between value- value* deviation and value+ value* deviation
$$;

检查值100与偏差5%匹配:

select
    fuzzy_match_numeric(94, 100, .05) r1,
    fuzzy_match_numeric(95, 100, .05) r2,
    fuzzy_match_numeric(105, 100, .05) r3,
    fuzzy_match_numeric(106, 100, .05) r4

 r1 | r2 | r3 | r4 
----+----+----+----
 f  | t  | t  | f
(1 row)     

答案 1 :(得分:1)

我建议计算一组查找值的偏差并选择最佳候选者。下面是一个基于整数的示例,但数字类型的工作方式类似。

示例数据集: search_table

postgres=# select * from search_table order by 1;
 value
-------
    90
    95
   100
   101
   103
   105
   108
   120

设置了示例查找值: search_condition

postgres=# select * from search_condition order by 1;
 value
-------
   100
   103
   105

寻找最佳人选:

select 
  distinct on (value) 
  value, 
  lookup_value as best_candidate
from ( 
  select 
    st.value, 
    sc.value as lookup_value, 
    abs(1 - st.value*1.0/sc.value) as deviation 
  from search_table st 
  cross join search_condition sc 
  ) t 
order by value, deviation, best_candidate;

结果:

 value | best_candidate
-------+----------------
    90 |            100
    95 |            100
   100 |            100
   101 |            100
   103 |            103
   105 |            105
   108 |            105
   120 |            105

如果有关系,将选择较低的候选人。这可以通过将DESC添加到best_candidate子句中的ORDER BY列来修改,以获得最高候选人。