Объедините, КАК и СОДЕРЖИТ в 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%'
)