#mysql #sql
#mysql #sql
Вопрос:
| id | caption | offset |
|----|-----------------|--------|
| 1 | The quick fox | 0 |
| 2 | jumped over the | 14 |
| 3 | lazy fox. The | 30 |
| 4 | cow jumped over | 44 |
| 5 | the moon | 52 |
Приведенная выше таблица содержит данные, относящиеся к блоку текста, в котором я хочу выполнить поиск.
Запрос, который я выполняю с помощью elastic, возвращает смещение всего блока текста, объединенного вместе, например:
{
searchQuery: 'over the lazy fox.',
beginning: 21,
end: 34
}
Начало и конец должны проверяться с помощью смещения; любые, которые попадают между этими
в возвращаемые данные должны быть включены два числа. Чтобы усложнить задачу, я бы также хотел, чтобы соответствующая часть текста соответствовала. Важно, чтобы каждая из строк хранилась отдельно, поскольку здесь опущена дополнительная информация о строке.
| id | caption | highlight |
|----|-----------------|-----------|
| 2 | jumped over the | over the |
| 3 | lazy fox. The | lazy fox. |
Я также хотел бы иметь возможность выделять несколько поисковых запросов одновременно, если был предоставлен массив начал и концов, возвращать все совпадающие строки и подстроки.
Комментарии:
1. можете ли вы немного подробнее объяснить сценарий с массивом? Кроме того, я чувствую, что ваш пример неверен, поскольку
end
is34
тогдаhighlight
только совпадаетlazy
.
Ответ №1:
Что-то вроде этого для одного поискового запроса.
SELECT
id,
caption,
LEFT(RIGHT(caption, offset LENGTH(caption) - @beginning), @end - offset) AS highlight
FROM some_table
WHERE offset LENGTH(caption) >= @beginning
AND offset <= @end;
Возможно, прибегнуть к ОБЪЕДИНЕНИЮ ALL для объединения нескольких поисковых запросов в один набор результатов.
Примечание Мне пришлось изменить ваш пример, указав, как я полагаю, предполагаемые смещения, и установить @end
значение 38, чтобы получить ожидаемый набор результатов.
---- ----------------- --------
| id | caption | offset |
---- ----------------- --------
| 1 | The quick fox | 0 |
| 2 | jumped over the | 14 |
| 3 | lazy fox. The | 29 |
| 4 | cow jumped over | 42 |
| 5 | the moon | 57 |
---- ----------------- --------
Ответ №2:
Для сценария с одним поиском,
SELECT
*
,IF(@beginning >= offset
,RIGHT(caption,len(caption)-(@beginning-offset))
,LEFT(caption,@end-offset)) as highlight
from @table
WHERE offset >= (select MAX(offset) from @table where offset <= @beginning)
and offset <= @end
Для сценария поиска по массиву,
SELECT
t.*
,IIF(_beginning >= offset
,RIGHT(caption,len(caption)-(_beginning-offset))
,LEFT(caption,_end-offset)) as highlight
,a.id
from @table t
join @array a ON offset >= (select MAX(offset) from @table where offset <= _beginning)
and offset <= _end
order by a.id asc
вставьте значения для поиска в следующей таблице (переменная) перед выполнением второго запроса,
declare @array as table(id int, _beginning int, _end int)