英文:
Postgre full text search behavior
问题
我正在使用PostgreSQL全文搜索来搜索一个由标签、地址、姓名等组成的文本,但我无法真正理解它。
我尝试了以下内容:
以下查询返回true
select to_tsvector('english', 'animals') @@ to_tsquery('english', 'anim:')
select to_tsvector('english', 'animals') @@ to_tsquery('english', 'animal:')
select to_tsvector('english', 'animals') @@ to_tsquery('english', 'animals:*')
而这些则不是
select to_tsvector('english', 'animals') @@ to_tsquery('english', 'a:')
select to_tsvector('english', 'animals') @@ to_tsquery('english', 'an:')
select to_tsvector('english', 'animals') @@ to_tsquery('english', 'ani:')
select to_tsvector('english', 'animals') @@ to_tsquery('english', 'anima:')
我猜想前三个返回false是因为它将输入视为停用词?
但对于最后一个查询,我不知道为什么返回false。
有任何建议吗?
谢谢
英文:
I'm using postgre full text search to search among a text built out of tags, address, name etc...
I'm doing some tests to see how it behave, but I cannot really understand it.
What I tried:
The following queries returns true
select to_tsvector('english', 'animals') @@ to_tsquery('english', 'anim:*')
select to_tsvector('english', 'animals') @@ to_tsquery('english', 'animal:*')
select to_tsvector('english', 'animals') @@ to_tsquery('english', 'animals:*')
While these ones not
select to_tsvector('english', 'animals') @@ to_tsquery('english', 'a:*')
select to_tsvector('english', 'animals') @@ to_tsquery('english', 'an:*')
select to_tsvector('english', 'animals') @@ to_tsquery('english', 'ani:*')
select to_tsvector('english', 'animals') @@ to_tsquery('english', 'anima:*')
I guess the first 3 return false because it see the input as stop words?
But for the last query, I have no idea why is returning false.
Any inputs?
Thank you
答案1
得分: 1
中文翻译:
词干处理器将“animal”截短为如下形式:
select to_tsvector('english', 'animals');
to_tsvector
═════════════
'anim':1
(1 行)
这解释了为什么搜索 anima:*
会失败(多了一个 a
)。
搜索 ani:*
则完全正常,与你所说的不同。
搜索 a:*
和 an:*
什么都找不到,因为这些词在英文中属于停用词,会被删除。
你可以看到,全文搜索对于前缀搜索并不是理想的选择。
英文:
The stemmer truncates "animal" like this:
select to_tsvector('english', 'animals');
to_tsvector
═════════════
'anim':1
(1 row)
That explains why a search for anima:*
fails (one a
too many).
Searching for ani:*
works just fine, different from what you say.
Searching for a:*
and an:*
finds nothing, since these words are stop words in English and get eliminated.
What you see is that Full Text Search is not ideal for prefix search.
答案2
得分: 0
tsvectors 与词元一起工作。这意味着单词被还原为它们最基本的形式。这意味着词语 "animals" 被还原为 "anim"。这不是基于逻辑规则完成的,而是基于字典。在这种情况下,是英语字典。它包含 animals --> anim。它还包含 anima --> anima(因为 anima 是一个具有不同词元的英语单词),以及 ani --> ani(同样的情况)。
因此,当您尝试进行比较时,实际上是查看您的文本的词元列表中是否存在某些术语。由于您的文本只有一个词(animals),因此它只是一个包含一个词元(anim)的列表。
与之进行比较的 7 个值为:
-
anim(词元 anim)--> true(在词元列表中)
-
animal(词元 anim)--> true(在词元列表中)
-
animals(词元 anim)--> true(在词元列表中)
-
a(词元不存在,因为是停用词)--> false
-
an(词元不存在,因为是停用词)--> false
-
ani(词元 ani)--> false(不在词元列表中)
-
anima(词元 anima)--> false(不在词元列表中)
希望这解释清楚了。
祝你的项目顺利进行。
(另请参阅https://www.postgresql.org/docs/current/textsearch-controls.html)
英文:
tsvectors work with lexemes. This means words are brought back to there most basic form. This means that words as animals is brought back to anim. This is not done on logic rules, but based on dictionairy. In this case the english dictionairy. it contains animals --> anim. It also contains anima --> anima (since anima is an english word with a diffrent lexemes), and ani --> ani (same story.
So when you are trying to make your compares, you are realy looking if certain terms are present in the list of lexemes of your text. Since your text is only one word (animals) it is only a list of one lexemes (anim).
The 7 values you compare with it are:
-
anim (lexemes anim) --> true (is in list of lexemes)
-
animal (lexemes anim) --> true (is in list of lexemes)
-
animals (lexemes anim) --> true (is in list of lexemes)
-
a (lexems non existing because of stopword) --> false
-
an (lexems non existing because of stopword) --> false
-
ani (lexemes ani) --> false (is not in list of lexemes)
-
anima (lexemes anima) --> false (is not in list of lexemes)
Hope this explains it
good luck with your project
(see also https://www.postgresql.org/docs/current/textsearch-controls.html )
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论