PostgreSQL全文搜索产生奇怪的结果
我有这样一个模式(简化): 但我的查询结果完全无效:PostgreSQL全文搜索产生奇怪的结果,postgresql,full-text-search,finnish,Postgresql,Full Text Search,Finnish,我有这样一个模式(简化): 但我的查询结果完全无效: # select name from users where to_tsvector('finnish', name) @@ to_tsquery('lemmin'); name ------ (0 rows) # select name from users where to_tsvector('finnish', name) @@ to_tsquery('lemmink'); name
# select name from users where to_tsvector('finnish', name) @@ to_tsquery('lemmin');
name
------
(0 rows)
# select name from users where to_tsvector('finnish', name) @@ to_tsquery('lemmink');
name
--------------------
Riitta ja Lemminki
Riitta ja Lemminki
(2 rows)
# select name from users where name ilike 'lemmink%';
name
----------------------
Lemminkäinen Matilda
Lemminkäinen Matias
Lemminkäinen Kyösti
Lemminkäinen Tuomas
(4 rows)
另一个例子:
# select name from users where to_tsvector('finnish', name) @@ to_tsquery('partu');
name
----------
Partuuna
(1 row)
# select name from users where to_tsvector('finnish', name) @@ to_tsquery('partur');
name
------------------------
Parturi-Kampaamo Raija
Parturi-Kampaamo Siema
(2 rows)
我希望在两个查询中都能得到最后两个结果
使用以下版本:
psql (9.4.6, server 9.5.2)
WARNING: psql major version 9.4, server major version 9.5.
Some psql features might not work.
我不会说芬兰语,但这似乎是预期的结果。FTS查找词素,而不是单词的一部分,例如,
do
不是dog
的词素,但dog
是dog
:
t=# select to_tsvector('english', 'Dogs eats bone') @@ to_tsquery('do');
NOTICE: text-search query contains only stop words or doesn't contain lexemes, ignored
?column?
----------
f
(1 row)
t=# select to_tsvector('english', 'Dogs eats bone') @@ to_tsquery('dog');
?column?
----------
t
(1 row)
所以我相信,Parturi
lastI
是可选的结尾-对吗
更新:
发件人:
partur[i],partur[eita]=>词素将是parturDarn,是否有任何类似的方法适用于单词的某些部分?:/还有,你所说的可选结尾是什么意思
parturi
因为它是一个基本单词,所以它的字面意思是“理发师”。这就像搜索“hairdressee”而不是在其中找到带有“hairdresser”的名字。你可以使用like运算符或正则表达式来查找单词的某些部分。谢谢,我想这回答了我的问题。我只需要想出一些其他的方法,如果芬兰语
不是您默认的FTS配置,您应该将芬兰语
(如果您想使用它)作为to_tsvector()
和to_tsquery()
的第一个参数我不知道当查询的标记与向量(文档)不同时会发生什么,但我认为这种设置不会带来什么好处。此外,对于纯前缀匹配(其中lemmin
或lemmink
不是一个完整的词干),也应该使用来查询('finish',lemmin:')
(再次:))人名的词干并不是FTS的强项之一。@pozs嘿,对不起,我忘了回答,使用lemmin:
在我的所有场景中都非常有效。如果你想发布一个竞争性的答案,请随时发布。
t=# select to_tsvector('english', 'Dogs eats bone') @@ to_tsquery('do');
NOTICE: text-search query contains only stop words or doesn't contain lexemes, ignored
?column?
----------
f
(1 row)
t=# select to_tsvector('english', 'Dogs eats bone') @@ to_tsquery('dog');
?column?
----------
t
(1 row)