Как получить слова, которых нет в словаре?

У меня проблема с получением отдельных слов, которых нет в моем словаре (я использую FULL TEXT SEARCH, точно словарь ispell), но слова найдут в таблице статей для столбца заголовка.

Таблица статей:

+----+-------------+
| id | title |
+----+-------------+
| 1 | Lorem ipsum |
| 2 | Text example|
+----+-------------+

Например, в следующем коде я получаю слова для предложения, которых нет в словаре.

SELECT token
FROM ts_debug('polish', 'Text lorem ipsum lala')
WHERE lexemes is null and alias != 'blank'

Возврат базы данных:

+-----------+
| token |
+-----------+
| lorem |
| ipsum |
+-----------+

Как написать код sql, который показывает в таблице все слова для таблицы статей, которые не находятся в словаре?Я должен использовать для цикла и что-то еще?

псевдокод:

for i = 0; i < count(*) from article; i++
 SELECT token
 FROM ts_debug('polish', article[i].title)
 WHERE lexemes is null and alias != 'blank'
end

Заранее спасибо!

1 ответ

Просто получите непревзойденные слова для каждой статьи и используйте DISTINCT для фильтрации дубликатов.

SELECT DISTINCT token
FROM article,
LATERAL ts_debug('polish', article.title)
WHERE lexemes is null and alias != 'blank'

Однако, с английским словарем PostgreSQL 9.3, ваш запрос не работает в любом случае:

regress=> SELECT * FROM ts_debug('english', 'sdfsASDADSsfdsfsdf fred to alan word another word') where alias != 'blank' ;
 alias | description | token | dictionaries | dictionary | lexemes 
-----------+-----------------+--------------------+----------------+--------------+----------------------
 asciiword | Word, all ASCII | sdfsASDADSsfdsfsdf | {english_stem} | english_stem | {sdfsasdadssfdsfsdf}
 asciiword | Word, all ASCII | fred | {english_stem} | english_stem | {fred}
 asciiword | Word, all ASCII | to | {english_stem} | english_stem | {}
 asciiword | Word, all ASCII | alan | {english_stem} | english_stem | {alan}
 asciiword | Word, all ASCII | word | {english_stem} | english_stem | {word}
 asciiword | Word, all ASCII | another | {english_stem} | english_stem | {anoth}
 asciiword | Word, all ASCII | word | {english_stem} | english_stem | {word}
(7 rows)

Кроме того, LATERAL поддерживается только в PostgreSQL 9.3. Если вы используете более старую версию, вам нужно использовать более сложную конструкцию с ts_debug в SELECT -list и подзапрос, что-то вроде:

SELECT DISTINCT (x.ld).token
FROM (
 SELECT ts_debug('polish', article.title)
 FROM article
) x(ld)
WHERE (x.ld).lexemes is null and (x.ld).alias != 'blank';

licensed under cc by-sa 3.0 with attribution.