【问题标题】:How to search words in close proximity to each other in Snowflake?如何在雪花中搜索彼此靠近的单词?
【发布时间】:2020-08-19 09:44:02
【问题描述】:

假设我的表有一个字符串列,即VARCHAR(),每个字符串是一个句子。我想在此列中搜索某个单词与另一个单词非常接近的句子。

例如,如果我想在“Smith”的两个词中搜索包含“John”的句子,在 SQL Server 中,我会这样做

SELECT row_id
FROM my_table
WHERE CONTAINS(sentence_column, 'NEAR((John, Smith), 2)') 

这如何转化为雪花?

【问题讨论】:

    标签: sql-server snowflake-cloud-data-platform


    【解决方案1】:

    您可以编写一个 UDF 来近似该语法。这并不是为了重现 SQL Server 的 near 语法,而是展示了它是如何完成的。它仅处理用于分词的空格,但可以对其进行修改以支持其他分词。它不区分大小写。如果您希望它区分大小写,可以删除 toUpperCase() 方法。

    create or replace function NEAR(STR string, STR1 string, STR2 string, DISTANCE float)
    returns boolean
    language javascript
    as
    $$
        var firstWord = -1;
        var secondWord = -1;
        var words = STR.split(" ");
        for (var i=0; i < words.length; i++){
            if (words[i].toUpperCase() === STR1.toUpperCase()) firstWord = i;
            if (words[i].toUpperCase() === STR2.toUpperCase()) secondWord = i;
        }
        return (firstWord >= 0) && (secondWord >= 0) && (secondWord - firstWord <= DISTANCE)
    $$;
    
    select near('John Jacob Smith', 'John', 'Smith', 2);  --True
    select near('John Jacob Williams Smith', 'John', 'Smith', 2);  --False
    

    【讨论】:

    • 这对我有用。谢谢!我对其进行了一些修改,以允许搜索一个单词包含附近的另一个单词:第 11 行``` if (words[i].toUpperCase().includes(STR2.toUpperCase())) secondWord = i;```
    • @juju88 你能把这个问题标记为解决方案吗,它应该是这个答案左边的一个按钮,当你有机会的时候。谢谢!
    猜你喜欢
    • 2014-09-14
    • 1970-01-01
    • 2018-10-04
    • 1970-01-01
    • 2016-05-22
    • 2023-03-30
    • 2013-02-16
    • 2015-01-28
    • 1970-01-01
    相关资源
    最近更新 更多