2014-03-18 57 views
1

我得到一個單詞不在我的字典(我使用全文搜索,完全是拼寫字典),但單詞將在文章表中找到標題列的問題。如何獲取不在字典中的單詞?

文章表:

+----+-------------+ 
| 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 

提前感謝!

+0

爲什麼不直接從你的文章表中選擇的所有記號,他們都沒有在你當前的選擇查詢?也就是說,使用'NOT IN'關鍵字。 –

+0

是的,但請注意,檢查必須位於函數ts_debug中。 實施例:(僞代碼) '用於從物品 COUNT(*)選擇令牌 FROM ts_debug( '拋光',article.title) WHERE詞位是零和別名= '空白' end' – Piotr

回答

2

只需獲取每篇文章的無與倫比的單詞並使用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的支持。如果您使用的是舊版本,你需要在SELECT -list和子查詢,像使用更復雜的結構與ts_debug

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'; 
+1

@Piotr PostgreSQL的版本?什麼是數據類型'samar.i18n_localizedtext'? –

+0

我的錯。我有8.3 PostgreSQL版本。我完全忘了本地化文字。非常感謝您的幫助! – Piotr

+0

@Piotr Argh。如果你正在運行一個古老的PostgreSQL版本,你需要在你的問題中這麼說。 –