Поднимая старую тему.
Есть такой опенсорсный словарь английского языку, WordNet, доступный, в том числе, в виде базы MySQL
Структура довольно замороченная, но нас интересуют в основном таблицы
Задача - получить в скрипте словарную статью наподобие яндексовой:
Список возможный значений, каждое со своим
- объяснением
- примерами
- синонимами
- и антонимами
И вот я сижу, морщу ум, как мне со всей этой фигней взлететь, на ларавелевой модели.
Рисовать все релейшенс в ОРМ-е я точно не хочу - это выльется в сотни запросов на одну статью.
Пока останавливаюсь на чисто raw SQL. Но даже здесь я не понимаю, где эти запросы писать? В чьей модели? Не в конроллере же!
Один из вариантов, про который я уже даже писал однажды ругательный пост - вьюхи. Вся SQL кухня во вью, а модель получается белая, пушистая и в школоладе. Но тут есть два "но":
1. Странное поведение вью:
И шо это было? Нужно использовать индекс-хинтинг?
2. Все равно одним запросом все данные не получить(?). Получается, все равно какие-то манипуляции с моделями, которые мне не очень ясны...
Вот основной запрос:
- он получает смыслы и примеры.
Дальше надо получить синонимы и антонимы. Причем леммы для них. То есть, получив wordid, надо джойнить опять words.
Есть такой опенсорсный словарь английского языку, WordNet, доступный, в том числе, в виде базы MySQL
Структура довольно замороченная, но нас интересуют в основном таблицы
- words
- senses - смыслы слов. Словарные статьи. Со словами напрямую не связаны.
- synsets - связь между словами и их смыслом, многие ко многим: одно и то же слово может иметь несколько смыслов (например, слово "дом" имеет 17 значений), но так же при этом один и тот же смысл может быть передан несколькими словами-синонимами (максимальное количество - 28 - у слова "жопа"). Отсюда и название.
- samples - предложения с примерами, многие к одной связке слово-смысл (senseid).
- lexlinks - некая таблица, в которой говорится, кем какое слово приходится друг к другу. Нам отсюда нужны только антонимы.
Задача - получить в скрипте словарную статью наподобие яндексовой:
Список возможный значений, каждое со своим
- объяснением
- примерами
- синонимами
- и антонимами
И вот я сижу, морщу ум, как мне со всей этой фигней взлететь, на ларавелевой модели.
Рисовать все релейшенс в ОРМ-е я точно не хочу - это выльется в сотни запросов на одну статью.
Пока останавливаюсь на чисто raw SQL. Но даже здесь я не понимаю, где эти запросы писать? В чьей модели? Не в конроллере же!
Один из вариантов, про который я уже даже писал однажды ругательный пост - вьюхи. Вся SQL кухня во вью, а модель получается белая, пушистая и в школоладе. Но тут есть два "но":
1. Странное поведение вью:
Код:
explain select * from samplesets where synsetid = 201793315;
+------+-------------+------------+------+---------------+------+---------+------+-------+----------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+------+-------------+------------+------+---------------+------+---------+------+-------+----------------+
| 1 | PRIMARY | <derived2> | ALL | NULL | NULL | NULL | NULL | 48571 | Using where |
| 2 | DERIVED | samples | ALL | NULL | NULL | NULL | NULL | 48571 | Using filesort |
+------+-------------+------------+------+---------------+------+---------+------+-------+----------------+
запрос ужасный. делаем
show create table samplesets;
и берем запрос оттуда:
explain select `samples`.`synsetid` AS `synsetid`,group_concat(distinct `samples`.`sample` order by `samples`.`sampleid` ASC separator '|') AS `sampleset` from `samples` where synsetid = 201793315 group by `samples`.`synsetid`;
+------+-------------+---------+------+----------------------------+---------+---------+-------+------+-------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+------+-------------+---------+------+----------------------------+---------+---------+-------+------+-------+
| 1 | SIMPLE | samples | ref | PRIMARY,k_samples_synsetid | PRIMARY | 4 | const | 2 | |
+------+-------------+---------+------+----------------------------+---------+---------+-------+------+-------+
получаем запрос идеальный
2. Все равно одним запросом все данные не получить(?). Получается, все равно какие-то манипуляции с моделями, которые мне не очень ясны...
Вот основной запрос:
Код:
SELECT sns.synsetid,
s.pos,
senseid,
definition,
group_concat(DISTINCT sample) AS sampleset
FROM words w
JOIN senses sns ON sns.wordid=w.wordid
JOIN synsets s ON s.synsetid=sns.synsetid
LEFT JOIN samples sam ON sam.synsetid=sns.synsetid
WHERE lemma='near'
GROUP BY sam.synsetid;
Дальше надо получить синонимы и антонимы. Причем леммы для них. То есть, получив wordid, надо джойнить опять words.
Последнее редактирование: