powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Вытащить похожие записи по названию - like или не like ??
18 сообщений из 18, страница 1 из 1
Вытащить похожие записи по названию - like или не like ??
    #38682905
ali_tash
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте, подскажите пожалуйста как составить такой запрос.
Модернизирую доску объявлений и нужно сделать вывод похожих объявлений по названию.
К примеру объявление называется "Продам лада нива г.в. 2007"

Нужно по этому названию вытащить другие записи, которые бы были похожи, например
"В хорошем состоянии лада 2107 в москве" <- точное совпадение по слову "лада".
"продаю ладу 2106" -< неточное совпадение по словам "продаю и ладу"
итд. т.е. чтобы поиск вёлся как по точному вхождению слова, так и по похожим словам.

Конструкция LIKE '%Продам лада нива г.в. 2007%' похоже не работает из за того что слов несколько и они с нечётким совпадением.
Если что могу сделать предобработку запроса на php - т.е. например распарсить заголовок на слова и собрать их потом в запросе, но так вопрос с нечётким совпадением фраз не решается.

Помогите составить запрос.
...
Рейтинг: 0 / 0
Вытащить похожие записи по названию - like или не like ??
    #38682922
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ali_tash,

full-text search
...
Рейтинг: 0 / 0
Вытащить похожие записи по названию - like или не like ??
    #38682924
Фотография krapotkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
первый шаг сделан - разобрали на слова, теперь можно даже индекс построить
теперь нужно понять как вообще выглядит "нечеткое сравнение" - например, все буквы совпадают, кроме одной
тогда можно придумывать доп. алгоритмы
...
Рейтинг: 0 / 0
Вытащить похожие записи по названию - like или не like ??
    #38683018
ali_tash
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
tanglirali_tash,

full-text search

Я так понял эта функция работает только с полями на которых стоит индекс fulltext - что замедляет работу с таблицей.
И так и не понял как сделать с помощью запроса MATCH поиск по похожим словам.

Можно пример запроса ?
SELECT * FROM ads WHERE MATCH (title) -> AGAINST ('В хорошем состоянии лада 2107 в москве');
чтобы нашлась запись продаю ладу 2106 ?
...
Рейтинг: 0 / 0
Вытащить похожие записи по названию - like или не like ??
    #38683019
ali_tash
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
krapotkinпервый шаг сделан - разобрали на слова, теперь можно даже индекс построить
теперь нужно понять как вообще выглядит "нечеткое сравнение" - например, все буквы совпадают, кроме одной
тогда можно придумывать доп. алгоритмы

Тоже не понял что вы имеете ввиду.
Да нечёткое сравнение, когда совпадают все буквы, кроме одной-двух, подходит.

Можно пример ?
...
Рейтинг: 0 / 0
Вытащить похожие записи по названию - like или не like ??
    #38683101
Фотография SQL2008
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Столкнулся с необъяснимой проблемой там, где никак не ожидал.
Запрос:
Код: sql
1.
2.
SET @categories = 'Legend (A6363),Корпусные части';
SELECT @product_id,category_id,name FROM category WHERE @categories LIKE CONCAT('%',TRIM(name),'%');


Выводит только
@product_idcategory_idname1452Корпусные части

Такие записи 'Legend (A6363)' в таблице точно есть. Для исключения ошибок текст поля скопирован прямо из таблицы.
Вот этот запрос
Код: sql
1.
SELECT category_id,name FROM category WHERE name LIKE '%Legend%';


Возвращает
category_idname19Legend (A6363) 19Legend (A6363)

В чем может быть причина?
...
Рейтинг: 0 / 0
Вытащить похожие записи по названию - like или не like ??
    #38683104
Фотография SQL2008
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Такой запрос также отрабатывает без проблем
Код: sql
1.
SELECT category_id,name FROM htcc_store.store_category_description WHERE name LIKE '%Legend (A6363)%';
...
Рейтинг: 0 / 0
Вытащить похожие записи по названию - like или не like ??
    #38683107
Фотография SQL2008
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А такой запрос не возвращает ничего
Код: sql
1.
2.
SET @categories = 'Legend (A6363)';
SELECT category_id,name FROM htcc_store.store_category_description WHERE @categories LIKE CONCAT('%',TRIM(name),'%');


Можно конечно предположить, что все дело в порядке сравнения
в первом случае поле сравнивается с переменной
Код: sql
1.
 ... name LIKE ... 


а во втором переменная с полем
Код: sql
1.
 ... @categories LIKE ...


НО!
Почему тогда срабатывает выборка в первом запросе по полю 'Корпусные части'????
...
Рейтинг: 0 / 0
Вытащить похожие записи по названию - like или не like ??
    #38683109
Фотография SQL2008
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На всякий случай.
Таблицы htcc_store.store_category_description и category одно и то же.
...
Рейтинг: 0 / 0
Вытащить похожие записи по названию - like или не like ??
    #38683113
Фотография javajdbc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ali_tashkrapotkinпервый шаг сделан - разобрали на слова, теперь можно даже индекс построить
теперь нужно понять как вообще выглядит "нечеткое сравнение" - например, все буквы совпадают, кроме одной
тогда можно придумывать доп. алгоритмы

Тоже не понял что вы имеете ввиду.
Да нечёткое сравнение, когда совпадают все буквы, кроме одной-двух, подходит.

Можно пример ?


(напрямую я не работал с поиском, поэтому только обшие идеи)

1. имея одно конкретно слово можно находить похожие
с помошью функции SOUNDEX(), применяя ее
к обоим сторонам сравнения.

2. ФулТехт индексирует оригинальные слова, т.е.
потом нельзя использовать САУНДЕКС

3. Возможно сделать так -- типа самому создать
фултекс с саудексом:
3.1 Разобрать все предложения на отдельные слова
в отдельной таблице
3.2 добавить колонку SOUNDEX()
3.3. проиндексировать эту колонку
3.4. разобрать поиск на слова и применить САУНДЕХ к каждому отдельно
3.5. все 5 или 10 слов в предложение после САУДЕХа прогнать
по поиску в большой таблице

4. Используйте внешние приблуды: sphinx, solr или еще какие-нибудь

5. еще один (может быть) полезный момент:
сделать словарик частых соответсвий, ну типа
"продаю" == "на продажу" == "налетай, подешевело"
"ВАЗ-2101" == "копейка"
...
Рейтинг: 0 / 0
Вытащить похожие записи по названию - like или не like ??
    #38683307
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
если тебе надо найти 'Legend (A6363)' и 'Корпусные части'
то разбей на
Код: sql
1.
where name like '%Legend (A6363)%' or name like '%Корпусные части%'



а в Legend (A6363) информативным есть только A6363, поэтому если поиск идет с набора на клаве, то набор Legend просто трата времени
...
Рейтинг: 0 / 0
Вытащить похожие записи по названию - like или не like ??
    #38683467
Фотография SQL2008
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадяесли тебе надо найти 'Legend (A6363)' и 'Корпусные части'
то разбей на
Код: sql
1.
where name like '%Legend (A6363)%' or name like '%Корпусные части%'



Понятно, что можно как-то выкрутиться... Почему нормально не работает?
Может есть какая-то фишка в MySQL?
...
Рейтинг: 0 / 0
Вытащить похожие записи по названию - like или не like ??
    #38683666
Фотография SQL2008
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вопрос решился перезаписью данных в поле.
Похоже на то, что один из символов был в другой кодировке, например в русской.
Хотя я копировал текст из поля в запрос, результата это не приносило.
...
Рейтинг: 0 / 0
Вытащить похожие записи по названию - like или не like ??
    #38683961
ali_tash
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ну так что посоветуете ?
Как сделать гибкий поиск без fulltext и like ?
...
Рейтинг: 0 / 0
Вытащить похожие записи по названию - like или не like ??
    #38684026
Фотография javajdbc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ali_tash,

старый анекдот:
-- следуюший
-- доктор, мне кажется меня никто не слышит
-- следуюший

(это я про себя :-) )
...
Рейтинг: 0 / 0
Вытащить похожие записи по названию - like или не like ??
    #38685305
ali_tash
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
javajdbcali_tashпропущено...


Тоже не понял что вы имеете ввиду.
Да нечёткое сравнение, когда совпадают все буквы, кроме одной-двух, подходит.

Можно пример ?


(напрямую я не работал с поиском, поэтому только обшие идеи)

1. имея одно конкретно слово можно находить похожие
с помошью функции SOUNDEX(), применяя ее
к обоим сторонам сравнения.

2. ФулТехт индексирует оригинальные слова, т.е.
потом нельзя использовать САУНДЕКС

3. Возможно сделать так -- типа самому создать
фултекс с саудексом:
3.1 Разобрать все предложения на отдельные слова
в отдельной таблице
3.2 добавить колонку SOUNDEX()
3.3. проиндексировать эту колонку
3.4. разобрать поиск на слова и применить САУНДЕХ к каждому отдельно
3.5. все 5 или 10 слов в предложение после САУДЕХа прогнать
по поиску в большой таблице

4. Используйте внешние приблуды: sphinx, solr или еще какие-нибудь

5. еще один (может быть) полезный момент:
сделать словарик частых соответсвий, ну типа
"продаю" == "на продажу" == "налетай, подешевело"
"ВАЗ-2101" == "копейка"

Функции SOUNDEX для русского языка в mysql не существует, да и как её использовать, ведь сравнение должно вестись по нескольким словам - "куплю ладу 2106" - исходные данные(3 слова) c "купить авто лада 2108"(поле в записе, для поиска - 4 слова).

Вобщем вопрос ещё, актуален.
...
Рейтинг: 0 / 0
Вытащить похожие записи по названию - like или не like ??
    #38685888
Фотография javajdbc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>> Функции SOUNDEX для русского языка в mysql не существует

таки плохо, смотрите приблуды , типа названых выше,
может гугл имеет какие-нибудь готовые модули

>> , да и как её использовать, ведь сравнение должно вестись по нескольким словам -

так или иначе придется резать предложения на слова.
Или сами делайте или ищите библиотеки (типа как гугл)

>> "куплю ладу 2106" - исходные данные(3 слова) c "купить авто лада 2108"(поле в записе, для поиска - 4 слова).

придется делать словарик соответсвий, как указано выше.
Никакая библиотека не знает что 2101 == "копейка",
вам придется "канонизировать" -- приводит
к стандарту -- слово за словом
...
Рейтинг: 0 / 0
Вытащить похожие записи по названию - like или не like ??
    #38707658
ali_tash
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Короче сделал с индексом full-text и предварительным вырезанием из строки поиска слов "куплю, продам, покупаю итд" - чтобы в результате в запросе не выводилось данных вообще не по теме.
В принципе нормально работает.

Но с саундексом, конечно лучше бы было, заманчивая идея, искал бы он сразу в фулл тексте....
javajdbc спасибо.
...
Рейтинг: 0 / 0
18 сообщений из 18, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Вытащить похожие записи по названию - like или не like ??
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]