From: | Tomas Vondra <tomas(dot)vondra(at)2ndquadrant(dot)com> |
---|---|
To: | pgsql-general(at)postgresql(dot)org |
Subject: | Re: : :Full text search query :: |
Date: | 2015-02-25 16:34:20 |
Message-ID: | 54EDF98C.4080001@2ndquadrant.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-general |
Hi,
On 25.2.2015 12:50, JD wrote:
> Hi All,
>
> please find herewith the following query
>
> 1. select * from partdetails where scode=118 and
> (to_tsvector('english'::regconfig, part_number::text)) @@ to_tsquery('104')
>
> it is showing only 1 record as output, it is expected to give 17 records
> as output.
>
> 2. select * from partdetails where scode=118 and
> (to_tsvector('english'::regconfig, part_number::text)) @@ to_tsquery('104/')
>
> it is showing only 1 record as output, it is expected to give 17 records
> as output.
>
> 3. select * from partdetails where scode=118 and
> (to_tsvector('english'::regconfig, part_number::text)) @@
> to_tsquery('104/1')
>
> it is showing 17 records as output.
>
> In our search case we are passing parameter value as 104 and expected to
> get 17 records.
>
>
> Kindly some one guide here.
You need to post 'to_tsvector('english', part_number)' for the 16 rows
that you think should be returned but aren't.
Fulltext works so that it transforms the source (part_number in this
case) as defined in the text search configuration ('english'), and
compares this with the tsquery.
My bet is that the transformation keeps the whole string ('104/1') in
this case, so that it does not match the tsquery.
ISTM you're trying to do a prefix search on the part_number. In that
case fulltext may not be the right solution, because it's fuzzy by
nature. If you have two-part part numbers (i.e. it's always A/B) then
maybe split that into two fields, and use simple equality conditions on
each field.
So instead of column 'part_number' containing valuye '104/1' use two
columns part_number_a and part_number_b, containing values '104' and
'1', and simple equality queries
WHERE part_number_a = '104' and part_number_b = '1'
or (if you want to match just the first part)
WHERE part_number_a = '104'
Another option is to use an index with a 'varchar_pattern_ops' opclass,
which allows you to do prefix LIKE queries [1]
CREATE INDEX custom_partnum_idx
ON partdetails (part_number varchar_pattern_ops);
SELECT ... FROM partdetails WHERE part_number LIKE '104/%'
[1] http://www.postgresql.org/docs/9.2/static/indexes-opclass.html
regards
--
Tomas Vondra http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services
From | Date | Subject | |
---|---|---|---|
Next Message | frank ernest | 2015-02-25 17:45:05 | Re: newbie how to access the information scheme |
Previous Message | Cenkar, Maciej | 2015-02-25 15:49:43 | Locking during UPDATE query with SUBSELECT |