Выбор X слов из текстового поля в MySQL - PullRequest
1 голос
/ 01 сентября 2008

Я создаю базовую функциональность поиска, используя LIKE (я бы использовал полный текст, но не могу в данный момент), и мне интересно, может ли MySQL искать ключевые слова (например, поле WHERE LIKE '% word% ') также возвращает 20 слов по обе стороны от ключевого слова?

Ответы [ 4 ]

2 голосов
/ 24 марта 2010

Вы можете сделать все это в запросе, используя SUBSTRING_INDEX

CONCAT_WS(
' ',
-- 20 words before
TRIM(
    SUBSTRING_INDEX(
        SUBSTRING(field, 1, INSTR(field, 'word') - 1 ),
        ' ',
        -20
    )
),
-- your word
'word',
-- 20 words after
TRIM(
    SUBSTRING_INDEX(
        SUBSTRING(field, INSTR(field, 'word') + LENGTH('word') ),
        ' ',
        20
    )
)

)

0 голосов
/ 01 сентября 2008

Я не думаю, что возможно ограничить количество возвращаемых слов, однако, чтобы ограничить количество возвращаемых символов, вы могли бы сделать что-то вроде

SELECT SUBSTRING(field_name, LOCATE('keyword', field_name) - chars_before, total_chars) FROM table_name WHERE field_name LIKE "%keyword%"
  • chars_before - это число символы, которые вы хотите выбрать до Ключевое слово (s)
  • total_chars - это общее количество символов, которые вы хотите выберите

т.е. В следующем примере будет возвращено 30 символов данных, начиная с 15 символов до ключевого слова

SUBSTRING(field_name, LOCATE('keyword', field_name) - 15, 30)

Примечание: как указал aryeh, любые отрицательные значения в SUBSTRING () значительно сбивают с толку - например, если ключевое слово найдено в первых символах [chars_before] поля, а затем в последних символах [chars_before] данных поле возвращено.

0 голосов
/ 01 сентября 2008

Я думаю, что вам лучше всего получить результат с помощью SQL-запроса и программно применить регулярное выражение, которое позволит вам получить группу слов до и после искомого слова.

Сейчас я не могу это проверить, но регулярное выражение должно выглядеть примерно так:

.*(\w+)\s*WORD\s*(\w+).*

, где вы заменяете WORD для искомого слова и используете группу регулярных выражений 1 в качестве слов перед словами, а 2 в качестве слов после слов

Я опробую его позже, когда смогу спросить у моего RegexBuddy , будет ли он работать :), и я опубликую его здесь

0 голосов
/ 01 сентября 2008

Используйте функцию INSTR (), чтобы найти положение слова в строке, а затем используйте функцию SUBSTRING (), чтобы выбрать часть символов до и после позиции.

Вам следует следить за тем, чтобы в вашей инструкции SUBSTRING не использовались отрицательные значения, иначе вы получите странные результаты.

Попробуйте и доложите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...