Casecommons / pg_search

pg_search builds ActiveRecord named scopes that take advantage of PostgreSQL’s full text search
http://www.casebook.net
MIT License
1.3k stars 369 forks source link

Queries using a single character sometimes don't work #492

Closed lightbe closed 1 year ago

lightbe commented 2 years ago

When I do a single character query for a, i, s or t I don't receive any results. For those same letters if I do a two character query starting with the letter I get results. Here are two examples.

Query for a received no results. Query for aa got the following results.

aa5j3uktdeb2gknqx99.ga aa5j3uktdeb2gknqx99.ml aa5j3uktdeb2gknqx99.tk aa5zy64.com aaaa22222.info aaaa66666.info

Query for i received no results. Query for ia got the following results.

ia4stypglismiks.cf ia4stypglismiks.ga ia4stypglismiks.gq ia4stypglismiks.ml ia4stypglismiks.tk iamail.com

I'm expecting rows to display for a, i, s and t like they do when I do a single character query for the other alphabets & single digits.

Ruby code

if params[:query].present?
   @bounce_domains = BounceDomain.order("domain ASC").text_search(params[:query]).to_a
else
   .......
end

pg_search code in my model:

  include PgSearch::Model
  pg_search_scope :domain_search, against: [:domain], using: {tsearch: {dictionary: "english", prefix: true}}

  def self.text_search(query)
    if query.present?
      domain_search(query)
    else
      all
    end
  end

I'm using:

Ruby 2.7.5 ActiveRecord 7.0.3.1 PostgreSQL 14.4

nertzy commented 1 year ago

This is because you're using dictionary: "english"

The english text search configuration filters out stopwords like "a" and "I" which are very common in English. You probably want "simple" as the dictionary if your search text needs to support searching arbitrary strings of characters that are not English prose.