Объедините, КАК и СОДЕРЖИТ в SAP HANA

Рассмотрим следующие записи в моей таблице:

  • красное яблоко
  • желтое яблоко
  • зеленый ап
  • красный пл
  • ap pel yellow

Несколько человек заполнили эту таблицу, используя несогласованные обозначения (цвет до или после "яблока"), также введя некоторые орфографические ошибки. Теперь я хочу запросить все записи со словом 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 (независимо от правописания)

3 ответа

Нечеткий алгоритм соответствует полному содержанию столбца в вашем примере. Таким образом, он сравнивает "яблоко" с "красное яблоко" и "аппель желтый"

То, что вы хотите, - это сопоставление с токенами в ваших столбцах. Вы можете достичь этого, создав полнотекстовый индекс, который будет разбивать содержимое столбцов на полнотекстовый индекс. 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)) 
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

Этот запрос в основном объединяет результаты поиска из предложения "содержит" с нечетким поиском и обычным поиском. Вместо этого вы также можете заменить часть II запроса на аналогичную.

Возможно, вам следует попробовать следующий стандартный 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%'
    )
Другие вопросы по тегам