https://github.com/thredded/db_text_search
A unified interface on top of ActiveRecord for case-insensitive string-in-set and prefix querying, and full-text search on SQLite, MySQL, and PostgreSQL.
https://github.com/thredded/db_text_search
Last synced: about 1 year ago
JSON representation
A unified interface on top of ActiveRecord for case-insensitive string-in-set and prefix querying, and full-text search on SQLite, MySQL, and PostgreSQL.
- Host: GitHub
- URL: https://github.com/thredded/db_text_search
- Owner: thredded
- License: mit
- Created: 2016-03-25T12:14:01.000Z (over 10 years ago)
- Default Branch: main
- Last Pushed: 2022-06-05T14:37:25.000Z (about 4 years ago)
- Last Synced: 2025-05-06T18:05:46.675Z (about 1 year ago)
- Language: Ruby
- Homepage:
- Size: 105 KB
- Stars: 65
- Watchers: 7
- Forks: 7
- Open Issues: 1
-
Metadata Files:
- Readme: README.md
- Changelog: CHANGES.md
- License: LICENSE.txt
- Code of conduct: CODE_OF_CONDUCT.md
Awesome Lists containing this project
README
# DbTextSearch [](https://travis-ci.org/thredded/db_text_search) [](https://codeclimate.com/github/thredded/db_text_search) [](https://codeclimate.com/github/thredded/db_text_search/coverage)
Different relational databases treat text search very differently.
DbTextSearch provides a unified interface on top of ActiveRecord for SQLite, MySQL, and PostgreSQL to do:
* Case-insensitive string-in-set querying, prefix querying, and case-insensitive index creation.
* Basic full-text search for a list of terms, and FTS index creation.
## Installation
Add this line to your application's Gemfile:
```ruby
gem 'db_text_search', '~> 1.0'
```
## Usage
### Case-insensitive string matching
Add an index in a migration to an existing CI (case-insensitive) or CS (case-sensitive) column:
```ruby
DbTextSearch::CaseInsensitive.add_index connection, :users, :username
# Options: name, unique
```
Or, create a new CI column:
```ruby
DbTextSearch::CaseInsensitive.add_ci_text_column connection, :users, :username
```
Perform a search for records with column that case-insensitively equals to one of the strings in a given set:
```ruby
# Find all confirmed users that have either the username Alice or Bob (case-insensitively):
DbTextSearch::CaseInsensitive.new(User.confirmed, :username).in(%w(Alice Bob))
#=> ActiveRecord::Relation
```
Perform a case-insensitive prefix search:
```ruby
DbTextSearch::CaseInsensitive.new(User.confirmed, :username).prefix('Jo')
```
See also: [API documentation][api-docs].
### Full text search
Add an index:
```ruby
DbTextSearch::FullText.add_index connection, :posts, :content
# Options: name
```
Perform a full-text search:
```ruby
DbTextSearch::FullText.new(Post.published, :content).search('peace')
DbTextSearch::FullText.new(Post.published, :content).search(%w(love kaori))
```
## Under the hood
### Case-insensitive string matching
Case-insensitive equality methods
Column typeSQLiteMySQLPostgreSQL
Detected typesSearch / indexDetected typesSearch / indexDetected typesSearch / index
CI
always treated as CS COLLATE NOCASE
default default
CITEXT default
CS
non-ci collations LOWER
no index
default LOWER
Case-insensitive prefix matching (using LIKE)
Column typeSQLiteMySQLPostgreSQL
CI
default, cannot always use an index,
even for prefix queries
default
cannot use an index
CS
cannot use an index
LOWER(column text_pattern_ops)
### Full-text search
#### MySQL
A `FULLTEXT` index, and a `MATCH AGAINST` query. MySQL v5.6.4+ is required.
#### PostgreSQL
A `gist(to_tsvector(...))` index, and a `@@ plainto_tsquery` query.
Methods also accept an optional `pg_ts_config` argument (default: `"'english'"`) that is ignored for other databases.
#### SQLite
**No index**, a `LIKE %term%` query for each term joined with `AND`.
## Development
Make sure you have a working installation of SQLite, MySQL, and PostgreSQL.
After checking out the repo, run `bin/setup` to install dependencies.
Then, run `rake test_all` to run the tests with all databases and gemfiles.
See the Rakefile for other available test tasks.
You can also run `bin/console` for an interactive prompt that will allow you to experiment.
## Contributing
Bug reports and pull requests are welcome on GitHub at https://github.com/thredded/db_text_search. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct.
## License
The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
[api-docs]: http://www.rubydoc.info/gems/db_text_search