簡體   English   中英

雙精度Postgres模糊搜索

[英]fuzzy search on doubles postgres

我想模糊搜索十進制數字而不是字符串。 因此,想法是搜索100應該從數據庫中的行中帶出100、90、95、105、108、120個數字值。

我也嘗試過像關鍵字一樣,但它並不能按我的意願工作。 我該如何對小數進行模糊搜索。 謝謝

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)     

我建議為您的一組查找值計算偏差並選擇最佳候選者。 下面是一個基於整數的示例,但是數字類型將類似地工作。

樣本數據集: 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添加到ORDER BY子句中的best_candidate列中以采用最高候選者來進行修改。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM