Обсуждение: ts_tovector() to_query()
I have a statement that is like this
SELECT m.* FROM movies m WHERE to_tsvector(m.item_title) @@ to_tsquery('Robocop|DVD|Collection')
this works, but it correctly returns all the matching records that have any of the query items in them.
What I want to do is return items that have 'Robocop' or 'Robocop and DVD' or 'Robocop and Collection' or 'Robocop and DVD and collection'
is there an operator for the tsvector / tsquery relationship that will do this? Or am I forced to sift through the results of the initial query after the fact?
Thanks,
Chris
"Severn, Chris" <chris_severn@chernay.com> wrote:
> I have a statement that is like this
>
> SELECT m.* FROM movies m
> WHERE to_tsvector(m.item_title) @@ to_tsquery('Robocop|DVD|Collection')
>
> this works, but it correctly returns all the matching records
> that have any of the query items in them.
>
> What I want to do is return items that have 'Robocop' or 'Robocop
> and DVD' or 'Robocop and Collection' or 'Robocop and DVD and
> collection'
>
> is there an operator for the tsvector / tsquery relationship that
> will do this? Or am I forced to sift through the results of the
> initial query after the fact?
SELECT m.* FROM movies m
WHERE to_tsvector(m.item_title) @@ to_tsquery('Robocop & (DVD | Collection)')
--
Kevin Grittner
EnterpriseDB: http://www.enterprisedb.com
The Enterprise PostgreSQL Company
On Thu, Mar 28, 2013 at 2:12 PM, Kevin Grittner <kgrittn@ymail.com> wrote:
>> What I want to do is return items that have 'Robocop' or 'Robocop
>> and DVD' or 'Robocop and Collection' or 'Robocop and DVD and
>> collection'
>
> SELECT m.* FROM movies m
> WHERE to_tsvector(m.item_title) @@ to_tsquery('Robocop & (DVD | Collection)')
It wont return items that have 'Robocop' entry only.
[local]:5432 postgres@postgres=#
select to_tsvector('robocop') @@ to_tsquery('robocop & (dvd | collection)');
?column?
----------
f
(1 row)
But to_tsquery('robocop | (robocop & (dvd | collection))') will do the trick.
[local]:5432 postgres@postgres=#
select to_tsvector('robocop') @@ to_tsquery('robocop | (robocop & (dvd
| collection))');
?column?
----------
t
(1 row)
--
Kind regards,
Sergey Konoplev
Database and Software Consultant
Profile: http://www.linkedin.com/in/grayhemp
Phone: USA +1 (415) 867-9984, Russia +7 (901) 903-0499, +7 (988) 888-1979
Skype: gray-hemp
Jabber: gray.ru@gmail.com
On Thu, Mar 28, 2013 at 08:50:50PM +0000, Severn, Chris wrote:
> What I want to do is return items that have 'Robocop' or 'Robocop and
> DVD' or 'Robocop and Collection' or 'Robocop and DVD and collection'
Based on the criteria above, I would say that:
SELECT m.* FROM movies m WHERE to_tsvector(m.item_title) @@ to_tsquery('Robocop')
will do what you need, since "dvd" and "collection" are irrelevant for
the results.
Best regards,
depesz
--
The best thing about modern society is how easy it is to avoid contact with it.
http://depesz.com/
Because the query is what the user is typing in. I don't know what words the user is going to search for. if they
simplysearch for 'Robocop' that would work. But how do I handle the search if they type in more than one word and still
returnhalf way accurate results?
I suppose after talking through it a bit, this may be more of a ranking issue than an actual query issue. I will read
upmore on ranking in the postgres docs. I skimmed past it since it didn't seem to apply, but now looking over it again,
Ithink it could help.
Thanks.
Chris
-----Original Message-----
From: depesz@depesz.com [mailto:depesz@depesz.com]
Sent: Friday, March 29, 2013 7:59 AM
To: Severn, Chris
Cc: pgsql-general@postgresql.org
Subject: Re: [GENERAL] ts_tovector() to_query()
On Thu, Mar 28, 2013 at 08:50:50PM +0000, Severn, Chris wrote:
> What I want to do is return items that have 'Robocop' or 'Robocop and
> DVD' or 'Robocop and Collection' or 'Robocop and DVD and collection'
Based on the criteria above, I would say that:
SELECT m.* FROM movies m WHERE to_tsvector(m.item_title) @@ to_tsquery('Robocop')
will do what you need, since "dvd" and "collection" are irrelevant for the results.
Best regards,
depesz
--
The best thing about modern society is how easy it is to avoid contact with it.
http://depesz.com/