考虑我表中的以下条目:
有几个人使用不一致的符号(颜色before或after'apple')填充了这张表,还输入了一些拼写错误。 现在我想查询所有包含单词
apple
的条目,无论颜色或拼写如何。
与
FUZZY()
:
SELECT name FROM "NEO_123456789ABCDE"."MYTABLE1" WHERE contains(name, 'apple', FUZZY(0.5))
我只得到:
添加通配符时:
SELECT name FROM "NEO_123456789ABCDE"."MYTABLE1" WHERE contains(name, '%apple%', FUZZY(0.5))
我只得到所有条目,其中
apple
拼写正确:
为什么我不能在一个查询中同时使用运算符LIKE和CONTAINS?
我需要找到:
apple
被其他词包围(在我的例子中是颜色)apple
(无论拼写如何)select name from(
SELECT name FROM "NEO_123456789ABCDE"."MYTABLE1" WHERE contains(name, 'apple', FUZZY(0.2)) --Part I
UNION ALL
SELECT name FROM "NEO_123456789ABCDE"."MYTABLE1" WHERE contains(name, '%apple%') --Part II
)group by name
这个查询基本上是将包含子句的搜索结果与模糊搜索和普通搜索结合起来。您也可以将查询的第二部分替换为喜欢。
模糊算法匹配示例中列的完整内容。所以它将“apple”与“red apple”和“appel yellow”进行比较
您想要的是与列中的标记进行匹配。您可以通过创建全文索引来实现这一点,该索引会将列中的内容标记为全文索引。 contains() 将自动使用全文索引。
drop table MYTABLE1;
create column table MYTABLE1
(
name nvarchar(100)
);
insert into MYTABLE1 (name) values ('red apple');
insert into MYTABLE1 (name) values ('yellow apple');
insert into MYTABLE1 (name) values ('apple green');
insert into MYTABLE1 (name) values ('red aple');
insert into MYTABLE1 (name) values ('appel yellow');
CREATE FULLTEXT INDEX i_MYTABLE1 ON MYTABLE1(name) FUZZY SEARCH INDEX ON SYNC;
SELECT name FROM "MYTABLE1" WHERE contains(name, 'apple', FUZZY(0.5))
也许您应该尝试以下标准 sql 查询:
SELECT name FROM "NEO_123456789ABCDE"."MYTABLE1" WHERE name like '%apple%'
此查询将选择您的苹果。 关于您的模糊,为什么不将其与子查询一起使用? 像:
SELECT name FROM "NEO_123456789ABCDE"."MYTABLE1"
WHERE contains(name, 'apple', FUZZY(0.5))
and name in (
SELECT name FROM "NEO_123456789ABCDE"."MYTABLE1" WHERE name like '%apple%'
)