autosuggest 0.1.2 → 0.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +4 -0
- data/README.md +85 -7
- data/lib/autosuggest/version.rb +1 -1
- data/lib/generators/autosuggest/suggestions_generator.rb +33 -0
- data/lib/generators/autosuggest/templates/migration.rb.tt +11 -0
- data/lib/generators/autosuggest/templates/model.rb.tt +3 -0
- metadata +5 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3f04e20f21653bcc9a8941c6da1eddae7726cf775abea699b78022b64fec9e48
|
4
|
+
data.tar.gz: 7a5c362428558d17808310245d7cad1bdf693800419665d650ab9026e5aa8628
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 62c38fb482638185c18dde9b0b4db1c9aa4deaa6e8f0fb4341220f61c28b218c51f79376b1080fb954982f0aa2b9a979b20b4212bfb704f73fe2e92be8b4373e
|
7
|
+
data.tar.gz: 84383dd6de2c654aefabe546f3c01335f906d5cfb517fd1890b26376ed9f482651b6e7e8d1b5082d120d228603b7b0002227b4293d2668c5de51a464aa831fa5
|
data/CHANGELOG.md
CHANGED
data/README.md
CHANGED
@@ -85,17 +85,90 @@ There are two ways to build the corpus, which can be used together.
|
|
85
85
|
autosuggest.block_words ["boom"]
|
86
86
|
```
|
87
87
|
|
88
|
-
####
|
88
|
+
#### Generate suggestions
|
89
89
|
|
90
|
-
|
90
|
+
Generate suggestions with:
|
91
91
|
|
92
92
|
```ruby
|
93
|
-
autosuggest.suggestions(filter: true)
|
93
|
+
suggestions = autosuggest.suggestions(filter: true)
|
94
|
+
```
|
95
|
+
|
96
|
+
#### Save suggestions
|
97
|
+
|
98
|
+
Save suggestions in your database or another data store.
|
99
|
+
|
100
|
+
With Rails, you can generate a simple model with:
|
101
|
+
|
102
|
+
```sh
|
103
|
+
rails generate autosuggest:suggestions
|
104
|
+
rails db:migrate
|
105
|
+
```
|
106
|
+
|
107
|
+
And update suggestions with:
|
108
|
+
|
109
|
+
```ruby
|
110
|
+
now = Time.now
|
111
|
+
records = suggestions.map { |s| s.slice(:query, :score).merge(updated_at: now) }
|
112
|
+
Autosuggest::Suggestion.transaction do
|
113
|
+
Autosuggest::Suggestion.upsert_all(records, unique_by: :query)
|
114
|
+
Autosuggest::Suggestion.where("updated_at < ?", now).delete_all
|
115
|
+
end
|
116
|
+
```
|
117
|
+
|
118
|
+
Leave out `unique_by` for MySQL, and use [activerecord-import](https://github.com/zdennis/activerecord-import) for upserts with Rails < 6.
|
119
|
+
|
120
|
+
#### Show suggestions
|
121
|
+
|
122
|
+
Use a JavaScript autocomplete library like [typeahead.js](https://github.com/twitter/typeahead.js) to show suggestions in the UI.
|
123
|
+
|
124
|
+
If you only have a few thousand suggestions, it’s much faster to load them all at once instead of as a user types (eliminates network requests).
|
125
|
+
|
126
|
+
With Rails, you can load all suggestions with:
|
127
|
+
|
128
|
+
```ruby
|
129
|
+
Autosuggest::Suggestion.order(score: :desc).pluck(:query)
|
94
130
|
```
|
95
131
|
|
96
|
-
|
132
|
+
And suggestions matching user input with:
|
97
133
|
|
98
|
-
|
134
|
+
```ruby
|
135
|
+
input = params[:query]
|
136
|
+
Autosuggest::Suggestion
|
137
|
+
.order(score: :desc)
|
138
|
+
.where("query LIKE ?", "%#{Autosuggest::Suggestion.sanitize_sql_like(input.downcase)}%")
|
139
|
+
.pluck(:query)
|
140
|
+
```
|
141
|
+
|
142
|
+
You can also cache suggestions for performance.
|
143
|
+
|
144
|
+
```ruby
|
145
|
+
Rails.cache.fetch("suggestions", expires_in: 5.minutes) do
|
146
|
+
Autosuggest::Suggestion.order(score: :desc).pluck(:query)
|
147
|
+
end
|
148
|
+
```
|
149
|
+
|
150
|
+
#### Additional considerations
|
151
|
+
|
152
|
+
You may want to have someone manually approve suggestions:
|
153
|
+
|
154
|
+
```ruby
|
155
|
+
Autosuggest::Suggestion.where(approved: true)
|
156
|
+
```
|
157
|
+
|
158
|
+
Or filter suggestions without results:
|
159
|
+
|
160
|
+
```ruby
|
161
|
+
Autosuggest::Suggestion.find_each do |suggestion|
|
162
|
+
suggestion.has_results = Product.search(suggestion.query, load: false, limit: 1).any?
|
163
|
+
suggestion.save! if suggestion.changed?
|
164
|
+
end
|
165
|
+
|
166
|
+
Autosuggest::Suggestion.where(has_results: true)
|
167
|
+
```
|
168
|
+
|
169
|
+
You can add additional fields to your model/data store to accomplish this.
|
170
|
+
|
171
|
+
## Example
|
99
172
|
|
100
173
|
```ruby
|
101
174
|
top_queries = Searchjoy::Search.group(:normalized_query)
|
@@ -110,9 +183,14 @@ autosuggest.prefer brand_names
|
|
110
183
|
autosuggest.not_duplicates [["straws", "straus"]]
|
111
184
|
autosuggest.block_words ["boom"]
|
112
185
|
|
113
|
-
puts autosuggest.pretty_suggestions
|
114
|
-
# or
|
115
186
|
suggestions = autosuggest.suggestions(filter: true)
|
187
|
+
|
188
|
+
now = Time.now
|
189
|
+
records = suggestions.map { |s| s.slice(:query, :score).merge(updated_at: now) }
|
190
|
+
Autosuggest::Suggestion.transaction do
|
191
|
+
Autosuggest::Suggestion.upsert_all(records, unique_by: :query)
|
192
|
+
Autosuggest::Suggestion.where("updated_at < ?", now).delete_all
|
193
|
+
end
|
116
194
|
```
|
117
195
|
|
118
196
|
## History
|
data/lib/autosuggest/version.rb
CHANGED
@@ -0,0 +1,33 @@
|
|
1
|
+
require "rails/generators/active_record"
|
2
|
+
|
3
|
+
class Autosuggest
|
4
|
+
module Generators
|
5
|
+
class SuggestionsGenerator < Rails::Generators::Base
|
6
|
+
include ActiveRecord::Generators::Migration
|
7
|
+
source_root File.join(__dir__, "templates")
|
8
|
+
|
9
|
+
def copy_templates
|
10
|
+
template "model.rb", "app/models/autosuggest/suggestion.rb"
|
11
|
+
migration_template "migration.rb", "db/migrate/create_autosuggest_suggestions.rb", migration_version: migration_version
|
12
|
+
end
|
13
|
+
|
14
|
+
def migration_version
|
15
|
+
"[#{ActiveRecord::VERSION::MAJOR}.#{ActiveRecord::VERSION::MINOR}]"
|
16
|
+
end
|
17
|
+
|
18
|
+
def mysql?
|
19
|
+
adapter =~ /mysql/i
|
20
|
+
end
|
21
|
+
|
22
|
+
# use connection_config instead of connection.adapter
|
23
|
+
# so database connection isn't needed
|
24
|
+
def adapter
|
25
|
+
if ActiveRecord::VERSION::STRING.to_f >= 6.1
|
26
|
+
ActiveRecord::Base.connection_db_config.adapter.to_s
|
27
|
+
else
|
28
|
+
ActiveRecord::Base.connection_config[:adapter].to_s
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
class <%= migration_class_name %> < ActiveRecord::Migration<%= migration_version %>
|
2
|
+
def change
|
3
|
+
create_table :autosuggest_suggestions do |t|
|
4
|
+
t.string :query
|
5
|
+
t.float :score
|
6
|
+
t.datetime :updated_at<%= mysql? ? ", precision: 6" : "" %>
|
7
|
+
end
|
8
|
+
|
9
|
+
add_index :autosuggest_suggestions, :query, unique: true
|
10
|
+
end
|
11
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: autosuggest
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Andrew Kane
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-11-
|
11
|
+
date: 2021-11-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: ruby-stemmer
|
@@ -49,6 +49,9 @@ files:
|
|
49
49
|
- README.md
|
50
50
|
- lib/autosuggest.rb
|
51
51
|
- lib/autosuggest/version.rb
|
52
|
+
- lib/generators/autosuggest/suggestions_generator.rb
|
53
|
+
- lib/generators/autosuggest/templates/migration.rb.tt
|
54
|
+
- lib/generators/autosuggest/templates/model.rb.tt
|
52
55
|
homepage: https://github.com/ankane/autosuggest
|
53
56
|
licenses:
|
54
57
|
- MIT
|