2

考虑我表中的以下条目:

  • 苹果
  • 苹果
  • 苹果绿_ _
  • 红色
  • 应用黄色_

有几个人使用不一致的符号( “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拼写正确的条目:

  • 苹果
  • 苹果
  • 苹果绿_ _

为什么我不能在一个查询中同时使用LIKECONTAINS这两个运算符?

我需要找到:

  • 条目,其中apple被其他单词包围(在我的情况下为颜色)
  • 所有形式的apple(无论拼写如何)
4

3 回答 3

2
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

该查询基本上将包含子句的搜索结果与模糊搜索和普通搜索相结合。您也可以将查询的第二部分替换为like。

于 2016-06-17T21:50:14.850 回答
2

模糊算法与您的示例中列的完整内容相匹配。所以它将“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)) 
于 2016-10-05T09:45:04.130 回答
0

也许您应该尝试以下标准 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%'
    )
于 2015-10-30T10:24:53.493 回答