【问题标题】:PostgreSQL Fuzzy Searching multiple words with LevenshteinPostgreSQL 使用 Levenshtein 模糊搜索多个单词
【发布时间】:2015-09-20 19:02:59
【问题描述】:

我正在开发一个 postgreSQL 查询,以便在我正在开发的应用程序中搜索公司名称时允许模糊搜索功能。我发现并一直在使用 Postgres 的 Levenshtein 方法(fuzzystrmatch 模块的一部分),并且大部分情况下它都在工作。但是,它似乎只在公司名称是一个单词时才有效,例如:

使用 Apple(它作为简单的苹果存储在数据库中)我可以运行以下查询并让它几乎完美地工作(它返回 0 的 levenshtein 距离):

SELECT * FROM contents 
  WHERE levenshtein(company_name, 'apple') < 4;

但是,当我对 Sony(作为 Sony Electronics INC 存储在数据库中)采用相同的方法时,我无法获得任何有用的结果(输入 Sony 给出的 levenshtein 距离为 16)。

我试图通过将公司名称分解为单个单词并单独输入每个单词来解决此问题,结果如下:

user input => 'sony'

SELECT * FROM contents 
  WHERE levenshtein('Sony', 'sony') < 4 
  OR levenshtein('Electronics', 'sony') < 4 
  OR levenshtein('INC', 'sony') < 4;

所以我的问题是:有什么方法可以用我现在拥有的当前通用方法准确地实现多词模糊搜索,还是我找错了地方?

谢谢!

【问题讨论】:

    标签: postgresql levenshtein-distance fuzzy-search


    【解决方案1】:

    给定您的数据和以下查询以及 Levenshtein 插入 (10000)、删除 (100) 和替换 (1) 成本的狂野值:

    with sample_data as (select 101 "id", 'Sony Entertainment Inc' as "name"
                          union
                         select 102 "id",'Apple Corp' as "name")
    select sample_data.id,sample_data.name, components.part,
           levenshtein(components.part,'sony',10000,100,1) ld_sony
    from sample_data
    inner join (select sd.id,
                       lower(unnest(regexp_split_to_array(sd.name,E'\\s+'))) part
                from sample_data sd) components on components.id = sample_data.id
    

    输出是这样的:

     id  |          name          |     part      | ld_sony 
    -----+------------------------+---------------+---------
     101 | Sony Entertainment Inc | sony          |       0
     101 | Sony Entertainment Inc | entertainment |     903
     101 | Sony Entertainment Inc | inc           |   10002
     102 | Apple Corp             | apple         |     104
     102 | Apple Corp             | corp          |       3
    (5 rows)
    
    • 第 1 行 - 没有变化..
    • 第 2 行 - 9 处删除和 3 处更改
    • 第 3 行 - 1 次插入和 2 次更改
    • 第 4 行 - 1 处删除和 4 处更改
    • 第 5 - 3 行更改

    我发现,当您给出阈值时,将单词分开会导致很多误报。您可以按 Levenshtein 距离排序,以将更好的匹配定位在靠近顶部的位置。也许调整 Levenshtein 变量将帮助您更好地排序匹配。遗憾的是,Levenshtein 对早期变化的重视程度与后来的变化不同。

    【讨论】:

      猜你喜欢
      • 2013-01-18
      • 2020-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多