21

Is postresql capable of doing a full text search, based on 'half' a word? For example I'm trying to seach for "tree", but I tell postgres to search for "tr".

I can't find such a solution that is capable of doing this.

Currently I'm using

 select * from test, to_tsquery('tree') as q where vectors @@ q ; 

But I'd like to do something like this:

 select * from test, to_tsquery('tr%') as q where vectors @@ q ; 

4 Answers 4

29

You can use tsearch prefix matching, see http://www.postgresql.org/docs/9.0/interactive/textsearch-controls.html#TEXTSEARCH-PARSING-QUERIES

postgres=# select to_tsvector('tree') @@ to_tsquery('tr:*'); ?column? ---------- t (1 row) 

It will only work for prefix search though, not if you want partial match at any position in the word.

Sign up to request clarification or add additional context in comments.

3 Comments

That is kind of the direction i'm looking for. But i'm interested in the word(s) that are equal to 'tr:*' (in your example). Is it possible to only get those words back?
Well, to build on what you wrote, something like SELECT * FROM test WHERE vectors @@ to_tsquery('tr:*') should do it. Or do you mean you want to know which individual words inside the tsvector field matched? I don't think you can do that...
i need indeed the fields/words that matched my input.
12

Sounds like you simply want wildcard matching.

  • One option, as previously mentioned is trigrams. My (very) limited experience with it was that it was too slow on massive tables for my liking (some cases slower than a LIKE). As I said, my experience with trigrams is limited, so I might have just been using it wrong.

  • A second option you could use is the wildspeed module: http://www.sai.msu.su/~megera/wiki/wildspeed (you'll have to build & install this tho).

The 2nd option will work for suffix/middle matching as well. Which may or may not be more than you're looking for.

There are a couple of caveats (like size of the index), so read through that page thoroughly.

3 Comments

hasn't the wildspeed stuff been part of PostreSQL core since 2008...?
any answers to the question above?
wildspeed hasn't been updated since 2008, so unless it's part of the core already I would use the pg_trgrm extension.
5
select * from test, to_tsquery('tree') as q where vectors @@ q OR xxxx LIKE ('%tree%') 

':*' is to specify prefix matching.

Comments

2

It can be done with trigrams but it's not part of tsearch2.

You can view the manual here: http://www.postgresql.org/docs/9.0/interactive/pgtrgm.html

Basically what the pg_tgrm module does is split a word in all it's parts so it can search for those separate parts.

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.