PostgreSQL全文搜索行为

huangapple go评论64阅读模式
英文:

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 )

huangapple
  • 本文由 发表于 2023年7月12日 23:48:39
  • 转载请务必保留本文链接:https://go.coder-hub.com/76672394.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定