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

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

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

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

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

full-text search

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

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

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

Можно пример ?
...
Рейтинг: 0 / 0
29.06.2014, 18:05:59
    #38683101
SQL2008
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вытащить похожие записи по названию - like или не like ??
Столкнулся с необъяснимой проблемой там, где никак не ожидал.
Запрос:
Код: 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
29.06.2014, 18:09:18
    #38683104
SQL2008
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вытащить похожие записи по названию - like или не like ??
Такой запрос также отрабатывает без проблем
Код: sql
1.
SELECT category_id,name FROM htcc_store.store_category_description WHERE name LIKE '%Legend (A6363)%';
...
Рейтинг: 0 / 0
29.06.2014, 18:15:14
    #38683107
SQL2008
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вытащить похожие записи по названию - like или не like ??
А такой запрос не возвращает ничего
Код: 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
29.06.2014, 18:18:13
    #38683109
SQL2008
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вытащить похожие записи по названию - like или не like ??
На всякий случай.
Таблицы htcc_store.store_category_description и category одно и то же.
...
Рейтинг: 0 / 0
29.06.2014, 18:32:50
    #38683113
javajdbc
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вытащить похожие записи по названию - like или не like ??
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
30.06.2014, 07:19:23
    #38683307
вадя
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вытащить похожие записи по названию - like или не like ??
если тебе надо найти 'Legend (A6363)' и 'Корпусные части'
то разбей на
Код: sql
1.
where name like '%Legend (A6363)%' or name like '%Корпусные части%'



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



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

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

(это я про себя :-) )
...
Рейтинг: 0 / 0
02.07.2014, 05:07:46
    #38685305
ali_tash
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вытащить похожие записи по названию - like или не like ??
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
02.07.2014, 15:18:56
    #38685888
javajdbc
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вытащить похожие записи по названию - like или не like ??
>> Функции SOUNDEX для русского языка в mysql не существует

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

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

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

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

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

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


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