crate.io FULLTEXT搜索模糊

时间:2017-01-22 01:28:11

标签: levenshtein-distance crate

我想用Levenshtein和Im寻找一些例子。 我已经阅读了文档,但我不知道如何实现它。 我尝试构建自己的Analyzer,但每次使用它时都会崩溃。

以下是我的文档: https://crate.io/docs/reference/sql/fulltext.html

示例表:

CREATE TABLE IF NOT EXISTS "test"."accounts" (
   "customer_name" STRING INDEX USING FULLTEXT WITH (
      analyzer = 'standard'
   ),
"customer_no" STRING,
   PRIMARY KEY ("customer_no")
)


INSERT INTO "test"."accounts" 
(customer_name, customer_no)
VALUES('Walmart','C00001');

我的目标是搜索沃尔玛并回归沃尔玛。

1 个答案:

答案 0 :(得分:2)

您在此示例中使用的标准分析器会将搜索词“wal-mart”(因为连字符)拆分为两个标记 - “wal”和“mart”。由于这可能不是您所描述的用例所需,我建议添加自定义分析器,例如:

create ANALYZER lowercase_keyword (
    TOKENIZER keyword,
    TOKEN_FILTERS (
        lowercase
    )
);

这会将单词索引为原样 - 除了将其变为小写。

然后使用新创建的分析器创建一个表并添加一些数据:

CREATE TABLE IF NOT EXISTS "test"."accounts" (
   "customer_name" STRING INDEX USING FULLTEXT WITH (
      analyzer = 'lowercase_keyword'
   ),
"customer_no" STRING,
   PRIMARY KEY ("customer_no")
);

INSERT INTO "test"."accounts" (customer_name, customer_no) VALUES ('Walmart', 'C00001'), ('Wal-mart', 'C00002'), ('wal-mart', 'C00003'), ('wal- mart’, ’C00004');

现在,下面给出的查询返回'Walmart','Wal-mart'和'wal-mart':

select customer_name from test.accounts where match(customer_name, 'walmart') using best_fields with (fuzziness=1);

如果模糊为2,则查询将另外返回'wal- mart'。