Searchkick là gem support search sử dụng Elasticsearch.
Searchkick support các tính năng sau:
- stemming ví dụ
tomatoes
sẽ match vớitomato
- special characters ví dụ
jalapeno
sẽ match vớijalapeño
- extra whitespace ví dụ
dishwasher
sẽ match vớidish washer
- misspellings ví dụ
zuchini
sẽ match vớizucchini
- custom synonyms ví dụ
pop
sẽ match vớisoda
Bên cạnh đó còn có:
- query like SQL
- reindex without downtime
- personalize result for each user
- auto complete
- “Did you mean” suggestions
- supports manu languages
- work with ActiveRecord, Mongoid và NoBrainer
1. Getting started:
- Chúng ta sẽ tạo 1 project để bắt đầu tìm hiểu gem seachkick1234rails <span class="token keyword">new</span> <span class="token class-name">elastic_search</span>rails g model product namerails db<span class="token symbol">:migrate</span>
- Cài đặt các gem cần thiết1234<span class="token comment"># Gemfile</span>gem <span class="token string">"ffaker"</span>gem <span class="token string">"searchkick"</span>
- Tạo seed file12345<span class="token comment"># db/seeds.rb</span><span class="token number">100.</span>times <span class="token keyword">do</span><span class="token constant">Product</span><span class="token punctuation">.</span>create name<span class="token punctuation">:</span> <span class="token constant">FFaker</span><span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token constant">Lorem</span><span class="token punctuation">.</span>words<span class="token punctuation">.</span><span class="token function">join</span><span class="token punctuation">(</span><span class="token string">" "</span><span class="token punctuation">)</span><span class="token keyword">end</span>
- Thêm searchkick vào Product12345<span class="token comment"># app/models/product.rb</span><span class="token keyword">class</span> <span class="token class-name">Product</span> <span class="token operator"><</span> <span class="token constant">ApplicationRecord</span>searchkick<span class="token keyword">end</span>
- Chạy reindex cho Product trên rails console để push data lên server Elasticsearch12<span class="token constant">Product</span><span class="token punctuation">.</span>reindex
- Sau khi đã chạy xong reindex, bạn có thể dùng searchkick để search product12<span class="token constant">Product</span><span class="token punctuation">.</span><span class="token function">search</span><span class="token punctuation">(</span><span class="token string">"perferendis"</span><span class="token punctuation">)</span>
- Hoặc để search tất cả product thì ta search với key word là “*”12<span class="token constant">Product</span><span class="token punctuation">.</span><span class="token function">search</span><span class="token punctuation">(</span><span class="token string">"*"</span><span class="token punctuation">)</span>
- Bạn có thể thấy trên log console, searchkick đã tạo 1 request dưới dạng curl sử dụng Elasticsearch DSL, chúng ta sẽ tìm hiểu kỹ thêm về Elasticsearch DSL ở bài sau
- Trong source code tham khảo đã implement sẵn 2 service để bạn có thể thử 2 loại query cơ bản trên123<span class="token constant">Search</span><span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token constant">AllService</span><span class="token punctuation">.</span><span class="token keyword">new</span><span class="token punctuation">.</span>perform<span class="token constant">Search</span><span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token constant">SimpleService</span><span class="token punctuation">.</span><span class="token keyword">new</span><span class="token punctuation">(</span><span class="token string">"your key word"</span><span class="token punctuation">)</span><span class="token punctuation">.</span>perform
2. Querying:
a. Where with specific value:
- Searchkick nhận câu query như câu query của SQL để search.
- Ví dụ:12<span class="token constant">Product</span><span class="token punctuation">.</span>search <span class="token string">"your key word"</span><span class="token punctuation">,</span> where<span class="token punctuation">:</span> <span class="token punctuation">{</span>in_stock<span class="token punctuation">:</span> <span class="token keyword">true</span><span class="token punctuation">}</span>
- Trong câu query,
params
where nhận giá trị làhash
dạngkey-value
- Trong đó key là tên của attribute, value là mô tả giá trị của attribute đó
- Searchkick sẽ thực hiện filter và chỉ search trên các product có các attribute thỏa giá trị của params where.
- Trong ví dụ trên chỉ thực hiện trên các product có attribute in_stock là true.
- Trong source code tham khảo đã implement sẵn service để bạn có thể thử query where12<span class="token constant">Search</span><span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token constant">Where</span><span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token constant">SimpleService</span><span class="token punctuation">.</span><span class="token keyword">new</span><span class="token punctuation">(</span><span class="token string">"your key word"</span><span class="token punctuation">,</span> in_stock<span class="token punctuation">:</span> <span class="token keyword">false</span><span class="token punctuation">)</span><span class="token punctuation">.</span>perform
b. Where with range value:
- Trong các trường hợp giá trị của attribute không phải là giá trị biết trước (như true hoặc false) mà nằm trong 1 khoảng giá trị nhất định (như từ 10 đến 20) ta sử dụng câu truy vấn với
gte
vàlte
. - Ví dụ:123<span class="token constant">Product</span><span class="token punctuation">.</span>search <span class="token string">"your key word"</span><span class="token punctuation">,</span> where<span class="token punctuation">:</span> <span class="token punctuation">{</span>orders_count<span class="token punctuation">:</span> <span class="token punctuation">{</span>gte<span class="token punctuation">:</span> <span class="token number">10</span><span class="token punctuation">,</span> lte<span class="token punctuation">:</span> <span class="token number">20</span><span class="token punctuation">}</span><span class="token punctuation">}</span><span class="token constant">Product</span><span class="token punctuation">.</span>search <span class="token string">"your key word"</span><span class="token punctuation">,</span> where<span class="token punctuation">:</span> <span class="token punctuation">{</span>orders_count<span class="token punctuation">:</span> <span class="token punctuation">(</span><span class="token number">10.</span><span class="token number">.20</span><span class="token punctuation">}</span><span class="token punctuation">}</span>
- Trong source code tham khảo đã implement sẵn service để bạn có thể thử query where với
gte
vàlte
12<span class="token constant">Search</span><span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token constant">Where</span><span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token constant">RangeService</span><span class="token punctuation">.</span><span class="token keyword">new</span><span class="token punctuation">(</span><span class="token string">"your key wor"</span><span class="token punctuation">,</span> gte<span class="token punctuation">:</span> <span class="token string">"10"</span><span class="token punctuation">,</span> lte<span class="token punctuation">:</span> <span class="token string">"20"</span><span class="token punctuation">)</span><span class="token punctuation">.</span>perform
c. Where with in:
- Trong trường hợp giá trị của attribute không nằm trong 1 khoảng liên tục (ví dụ:
[1, 2, 3, 4, 5]
) mà là 1 mảng rới rạc (ví dụ[1, 3, 5]
) ta sử dụng câu truy vấn vớiin
: - Ví dụ:12<span class="token constant">Product</span><span class="token punctuation">.</span>search <span class="token string">"your key word"</span><span class="token punctuation">,</span> where<span class="token punctuation">:</span> <span class="token punctuation">{</span>store_id<span class="token punctuation">:</span> <span class="token punctuation">{</span><span class="token keyword">in</span><span class="token punctuation">:</span> <span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">5</span><span class="token punctuation">,</span> <span class="token number">7</span><span class="token punctuation">,</span> <span class="token number">9</span><span class="token punctuation">]</span><span class="token punctuation">}</span><span class="token punctuation">}</span>
- Trong source code tham khảo đã implement sẵn service để bạn có thể thử query where với
in
12<span class="token constant">Search</span><span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token constant">Where</span><span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token constant">InService</span><span class="token punctuation">.</span><span class="token keyword">new</span><span class="token punctuation">(</span><span class="token string">"your key word"</span><span class="token punctuation">,</span> store_ids<span class="token punctuation">:</span> <span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">5</span><span class="token punctuation">,</span> <span class="token number">7</span><span class="token punctuation">,</span> <span class="token number">9</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">.</span>perform
d. Where with not:
- Ngược lại với in ta có
not
, searchkick sẽ search trên các product có giá trị của attribute không nằm trong mảng giá trị cho trước: - Ví dụ:12<span class="token constant">Product</span><span class="token punctuation">.</span>search <span class="token string">"your key word"</span><span class="token punctuation">,</span> where<span class="token punctuation">:</span> <span class="token punctuation">{</span>store_id<span class="token punctuation">:</span> <span class="token punctuation">{</span><span class="token keyword">not</span><span class="token punctuation">:</span> <span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">5</span><span class="token punctuation">,</span> <span class="token number">7</span><span class="token punctuation">,</span> <span class="token number">9</span><span class="token punctuation">]</span><span class="token punctuation">}</span><span class="token punctuation">}</span>
- Trong source code tham khảo đã implement sẵn service để bạn có thể thử query where với
not
12<span class="token constant">Search</span><span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token constant">Where</span><span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token constant">NotService</span><span class="token punctuation">.</span><span class="token keyword">new</span><span class="token punctuation">(</span><span class="token string">"your key word"</span><span class="token punctuation">,</span> store_ids<span class="token punctuation">:</span> <span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">5</span><span class="token punctuation">,</span> <span class="token number">7</span><span class="token punctuation">,</span> <span class="token number">9</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">.</span>perform
e. Where with all:
- Tương tự với với in ta có
all
, searchkick sẽ search trên các product có giá trị của attribute bằng với mảng giá trị cho trước: - Ví dụ:123456<span class="token comment"># Trả về các product có product.store_id là 1 hoặc 3, 5, 7 </span><span class="token constant">Product</span><span class="token punctuation">.</span>search <span class="token string">"your key word"</span><span class="token punctuation">,</span> where<span class="token punctuation">:</span> <span class="token punctuation">{</span>store_id<span class="token punctuation">:</span> <span class="token punctuation">{</span><span class="token keyword">in</span><span class="token punctuation">:</span> <span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">5</span><span class="token punctuation">,</span> <span class="token number">7</span><span class="token punctuation">,</span> <span class="token number">9</span><span class="token punctuation">]</span><span class="token punctuation">}</span><span class="token punctuation">}</span><span class="token comment"># Trả về các product có product.store_id là [1, 3, 5, 7, 9]</span><span class="token constant">Product</span><span class="token punctuation">.</span>search <span class="token string">"your key word"</span><span class="token punctuation">,</span> where<span class="token punctuation">:</span> <span class="token punctuation">{</span>store_id<span class="token punctuation">:</span> <span class="token punctuation">{</span>all<span class="token punctuation">:</span> <span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">5</span><span class="token punctuation">,</span> <span class="token number">7</span><span class="token punctuation">,</span> <span class="token number">9</span><span class="token punctuation">]</span><span class="token punctuation">}</span><span class="token punctuation">}</span>
- Trong source code tham khảo đã implement sẵn service để bạn có thể thử query where với
not
123<span class="token constant">Search</span><span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token constant">Where</span><span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token constant">AllService</span><span class="token punctuation">.</span><span class="token keyword">new</span><span class="token punctuation">(</span><span class="token string">"your key word"</span><span class="token punctuation">,</span> store_ids<span class="token punctuation">:</span> <span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">5</span><span class="token punctuation">,</span> <span class="token number">7</span><span class="token punctuation">,</span> <span class="token number">9</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">.</span>perform<span class="token constant">Search</span><span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token constant">Where</span><span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token constant">AllService</span><span class="token punctuation">.</span><span class="token keyword">new</span><span class="token punctuation">(</span><span class="token string">"your key word"</span><span class="token punctuation">,</span> store_ids<span class="token punctuation">:</span> <span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">.</span>perform - Với câu truy vấn thứ nhất kết quả trả về luôn là mảng rỗng vì
product.store_id
không bap giờ trả về mảng
f: Where with all and array value:
- Với lý do đã nêu ở trên,
all
thường được dùng với các attribute trả về mảng hơn là gia trị duy nhất. - Mình tạo thêm các model có quan hệ như sau12345678<span class="token comment"># app/models/product.rb</span>has_many <span class="token symbol">:order_details</span>has_many <span class="token symbol">:orders</span><span class="token punctuation">,</span> through<span class="token punctuation">:</span> <span class="token symbol">:order_details</span><span class="token comment"># app/models/order.rb</span>has_many <span class="token symbol">:order_details</span>has_many <span class="token symbol">:products</span><span class="token punctuation">,</span> through<span class="token punctuation">:</span> <span class="token symbol">:order_details</span>
- Khi đó ta có thể gọi product.order_ids và nhận được giá trị trả về là mảng12<span class="token constant">Product</span><span class="token punctuation">.</span>first<span class="token punctuation">.</span>order_ids <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">]</span>
- Ta thử search product theo order_ids sử dụng all như sau
- Ví dụ:12<span class="token constant">Product</span><span class="token punctuation">.</span><span class="token function">search</span><span class="token punctuation">(</span><span class="token string">"your key word"</span><span class="token punctuation">,</span> where<span class="token punctuation">:</span> <span class="token punctuation">{</span>order_ids<span class="token punctuation">:</span> <span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">]</span><span class="token punctuation">)</span>
- Kết quả trả về luôn là mảng rỗng.
g: Where with all and search_data and search_import:
- Nguyên nhân là vì khi thực hiện reindex, data searchkick gửi lên elasticsearch mặc định là các column của table Product.
- Tức là searchkick chỉ gửi lên elasticsearch data về
id
,name
,created_at
,updated_at
,in_stock
,orders_count
vàstore_id
. - Do đó khi search với order_ids của product thì elasticsearch luôn trả về mảng rỗng.
- Searchkick quy định data gửi lên elasticsearch bằng method
search_data
, sửa lại method này như sau và thêm scopesearch_import
như sau123456789101112131415<span class="token comment"># app/models/product.rb</span><span class="token keyword">class</span> <span class="token class-name">Product</span> <span class="token operator"><</span> <span class="token constant">ApplicationRecord</span>belongs_to <span class="token symbol">:store</span>has_many <span class="token symbol">:order_details</span>has_many <span class="token symbol">:orders</span><span class="token punctuation">,</span> through<span class="token punctuation">:</span> <span class="token symbol">:order_details</span>searchkickscope <span class="token symbol">:search_import</span><span class="token punctuation">,</span> <span class="token operator">-</span><span class="token operator">></span> <span class="token punctuation">{</span><span class="token function">includes</span><span class="token punctuation">(</span><span class="token symbol">:orders</span><span class="token punctuation">)</span><span class="token punctuation">}</span><span class="token keyword">def</span> search_dataattributes<span class="token punctuation">.</span>merge order_ids<span class="token punctuation">:</span> order_ids<span class="token keyword">end</span><span class="token keyword">end</span> - Thực hiện reindex cho Product12<span class="token constant">Product</span><span class="token punctuation">.</span>reindex
- Chạy lại câu query với
all
và ta thu được kết quả12<span class="token constant">Product</span><span class="token punctuation">.</span><span class="token function">search</span><span class="token punctuation">(</span><span class="token string">"your key word"</span><span class="token punctuation">,</span> where<span class="token punctuation">:</span> <span class="token punctuation">{</span>order_ids<span class="token punctuation">:</span> <span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">]</span><span class="token punctuation">)</span> - Chúng ta sẽ tìm hiểu về
search_data
vàsearch_import
kĩ hơn ở phần sau. - Chú ý câu query
all
chỉ search trên các product có order_ids là mảng con hoặc chính là mảng tham số truyền vào. - Trong source code tham khảo đã implement sẵn service để bạn có thể thử query where với
not
12<span class="token constant">Search</span><span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token constant">Where</span><span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token constant">AllWithArrayService</span><span class="token punctuation">.</span><span class="token keyword">new</span><span class="token punctuation">(</span><span class="token string">"your key word"</span><span class="token punctuation">,</span> order_ids<span class="token punctuation">:</span> <span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">.</span>perform
h: Where with exists:
- Ta cũng có thể thực hiện filter trên các product có store_id với query
exists: true
.12<span class="token constant">Product</span><span class="token punctuation">.</span><span class="token function">search</span><span class="token punctuation">(</span><span class="token string">"your key word"</span><span class="token punctuation">,</span> where<span class="token punctuation">:</span> <span class="token punctuation">{</span>store_id<span class="token punctuation">:</span> <span class="token punctuation">{</span>exists<span class="token punctuation">:</span> <span class="token keyword">true</span><span class="token punctuation">}</span><span class="token punctuation">}</span><span class="token punctuation">)</span> - Tuy nhiên để filter trên các product có store_id là nil thì không sử dụng query exists: true được mà phải gọi trực tiếp
store_id: nil
như sau12<span class="token constant">Product</span><span class="token punctuation">.</span><span class="token function">search</span><span class="token punctuation">(</span><span class="token string">"your key word"</span><span class="token punctuation">,</span> where<span class="token punctuation">:</span> <span class="token punctuation">{</span>store_id<span class="token punctuation">:</span> <span class="token keyword">nil</span><span class="token punctuation">}</span><span class="token punctuation">)</span> - Trong source code tham khảo đã implement sẵn service để bạn có thể query với 2 trường hợp trên123<span class="token constant">Search</span><span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token constant">Where</span><span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token constant">ExistsService</span><span class="token punctuation">.</span><span class="token keyword">new</span><span class="token punctuation">(</span><span class="token string">"your key word"</span><span class="token punctuation">,</span> store_exists<span class="token punctuation">:</span> <span class="token keyword">true</span><span class="token punctuation">)</span><span class="token punctuation">.</span>perform<span class="token constant">Search</span><span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token constant">Where</span><span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token constant">ExistsService</span><span class="token punctuation">.</span><span class="token keyword">new</span><span class="token punctuation">(</span><span class="token string">"your key word"</span><span class="token punctuation">,</span> store_exists<span class="token punctuation">:</span> <span class="token keyword">false</span><span class="token punctuation">)</span><span class="token punctuation">.</span>perform
i: Where with and:
- Operator mặc định của where là
and
, record trả về phải thỏa tất cả query của where, ví dụ12<span class="token constant">Product</span><span class="token punctuation">.</span><span class="token function">search</span><span class="token punctuation">(</span><span class="token string">"your key word"</span><span class="token punctuation">,</span> where<span class="token punctuation">:</span> <span class="token punctuation">{</span>store_id<span class="token punctuation">:</span> <span class="token number">1</span><span class="token punctuation">,</span> orders_count<span class="token punctuation">:</span> <span class="token punctuation">{</span>gte<span class="token punctuation">:</span> <span class="token number">70</span><span class="token punctuation">,</span> lte<span class="token punctuation">:</span> <span class="token number">100</span><span class="token punctuation">}</span><span class="token punctuation">}</span><span class="token punctuation">)</span> - Ta có thể viết lại với query
_and
như sau123456789<span class="token constant">Product</span><span class="token punctuation">.</span><span class="token function">search</span><span class="token punctuation">(</span><span class="token string">"your key word"</span><span class="token punctuation">,</span> where<span class="token punctuation">:</span> <span class="token punctuation">{</span>_and<span class="token punctuation">:</span> <span class="token punctuation">[</span><span class="token punctuation">{</span>store_id<span class="token punctuation">:</span> <span class="token number">1</span><span class="token punctuation">}</span><span class="token punctuation">,</span><span class="token punctuation">{</span>orders_count<span class="token punctuation">:</span> <span class="token punctuation">(</span><span class="token number">70.</span><span class="token number">.100</span><span class="token punctuation">)</span><span class="token punctuation">}</span><span class="token punctuation">]</span><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token constant">Search</span><span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token constant">Where</span><span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token constant">AndService</span><span class="token punctuation">.</span><span class="token keyword">new</span><span class="token punctuation">(</span><span class="token string">"your key word"</span><span class="token punctuation">,</span> store_id<span class="token punctuation">:</span> <span class="token number">1</span><span class="token punctuation">,</span> orders_count<span class="token punctuation">:</span> <span class="token number">70.</span><span class="token number">.100</span><span class="token punctuation">)</span><span class="token punctuation">.</span>perform
j: Where with or:
- Trong trường hợp filter các product thỏa 1 trong 2 mệnh đề thì ta sử dụng query
_or
như sau123456789<span class="token constant">Product</span><span class="token punctuation">.</span><span class="token function">search</span><span class="token punctuation">(</span><span class="token string">"your key word"</span><span class="token punctuation">,</span> where<span class="token punctuation">:</span> <span class="token punctuation">{</span>_or<span class="token punctuation">:</span> <span class="token punctuation">[</span><span class="token punctuation">{</span>store_id<span class="token punctuation">:</span> <span class="token number">1</span><span class="token punctuation">}</span><span class="token punctuation">,</span><span class="token punctuation">{</span>orders_count<span class="token punctuation">:</span> <span class="token punctuation">(</span><span class="token number">70.</span><span class="token number">.100</span><span class="token punctuation">)</span><span class="token punctuation">}</span><span class="token punctuation">]</span><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token constant">Search</span><span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token constant">Where</span><span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token constant">OrService</span><span class="token punctuation">.</span><span class="token keyword">new</span><span class="token punctuation">(</span><span class="token string">"your key word"</span><span class="token punctuation">,</span> store_id<span class="token punctuation">:</span> <span class="token number">1</span><span class="token punctuation">,</span> orders_count<span class="token punctuation">:</span> <span class="token number">70.</span><span class="token number">.100</span><span class="token punctuation">)</span><span class="token punctuation">.</span>perform
k: Where with not:
- Trong trường loại của query
_not
, ta chỉ có thể truyền 1 attribute thay vì nhiều attribute - Ví dụ
_not
vớistore_id
123456<span class="token constant">Product</span><span class="token punctuation">.</span><span class="token function">search</span><span class="token punctuation">(</span><span class="token string">"your key word"</span><span class="token punctuation">,</span> where<span class="token punctuation">:</span> <span class="token punctuation">{</span>_not<span class="token punctuation">:</span> <span class="token punctuation">{</span>store_id<span class="token punctuation">:</span> <span class="token number">1</span><span class="token punctuation">}</span><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token constant">Search</span><span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token constant">Where</span><span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token constant">NotStoreIdService</span><span class="token punctuation">.</span><span class="token keyword">new</span><span class="token punctuation">(</span><span class="token string">"your key word"</span><span class="token punctuation">,</span> store_id<span class="token punctuation">:</span> <span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">.</span>perform - Ví dụ
_not
vớiorders_count
123456<span class="token constant">Product</span><span class="token punctuation">.</span><span class="token function">search</span><span class="token punctuation">(</span><span class="token string">"your key word"</span><span class="token punctuation">,</span> where<span class="token punctuation">:</span> <span class="token punctuation">{</span>_not<span class="token punctuation">:</span> <span class="token punctuation">{</span>orders_count<span class="token punctuation">:</span> <span class="token number">70.</span><span class="token number">.100</span><span class="token punctuation">}</span><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token constant">Search</span><span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token constant">Where</span><span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token constant">NotOrdersCountService</span><span class="token punctuation">.</span><span class="token keyword">new</span><span class="token punctuation">(</span><span class="token string">"your key word"</span><span class="token punctuation">,</span> orders_count<span class="token punctuation">:</span> <span class="token number">70.</span><span class="token number">.100</span><span class="token punctuation">)</span><span class="token punctuation">.</span>perform - Trong trường hợp truyền nhiều attribute thì searchkick sẽ filter với attribute sau cùng
- Ví dụ:12345<span class="token constant">Product</span><span class="token punctuation">.</span><span class="token function">search</span><span class="token punctuation">(</span><span class="token string">"your key word"</span><span class="token punctuation">,</span> where<span class="token punctuation">:</span> <span class="token punctuation">{</span>_not<span class="token punctuation">:</span> <span class="token punctuation">{</span>store_id<span class="token punctuation">:</span> <span class="token number">1</span><span class="token punctuation">}</span><span class="token punctuation">,</span>_not<span class="token punctuation">:</span> <span class="token punctuation">{</span>orders_count<span class="token punctuation">:</span> <span class="token number">70.</span><span class="token number">.100</span><span class="token punctuation">}</span><span class="token punctuation">}</span><span class="token punctuation">)</span>
- Sẽ tương đương với1234<span class="token constant">Product</span><span class="token punctuation">.</span><span class="token function">search</span><span class="token punctuation">(</span><span class="token string">"your key word"</span><span class="token punctuation">,</span> where<span class="token punctuation">:</span> <span class="token punctuation">{</span>_not<span class="token punctuation">:</span> <span class="token punctuation">{</span>orders_count<span class="token punctuation">:</span> <span class="token number">70.</span><span class="token number">.100</span><span class="token punctuation">}</span><span class="token punctuation">}</span><span class="token punctuation">)</span>
3. Fields:
- Theo mặc định, elasticsearch sẽ search trên tất cả các attribute của product, ta có thể chỉ định elasticsearch chỉ search trên 1 vài attribute thông qua option
fields
- Ví dụ:1234<span class="token constant">Product</span><span class="token punctuation">.</span><span class="token function">search</span><span class="token punctuation">(</span><span class="token string">"your key word"</span><span class="token punctuation">,</span> fields<span class="token punctuation">:</span> <span class="token punctuation">[</span><span class="token string">"*"</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token constant">Product</span><span class="token punctuation">.</span><span class="token function">search</span><span class="token punctuation">(</span><span class="token string">"your key word"</span><span class="token punctuation">,</span> fields<span class="token punctuation">:</span> <span class="token punctuation">[</span><span class="token symbol">:name</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token constant">Product</span><span class="token punctuation">.</span><span class="token function">search</span><span class="token punctuation">(</span><span class="token string">"your key word"</span><span class="token punctuation">,</span> fields<span class="token punctuation">:</span> <span class="token punctuation">[</span><span class="token symbol">:description</span><span class="token punctuation">]</span><span class="token punctuation">)</span>
- Trong source code tham khảo có implement service để bạn search với
fields
options1234<span class="token constant">Search</span><span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token constant">FieldsService</span><span class="token punctuation">.</span><span class="token keyword">new</span><span class="token punctuation">(</span><span class="token string">"your key word"</span><span class="token punctuation">,</span> fields<span class="token punctuation">:</span> <span class="token punctuation">[</span><span class="token string">"*"</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">.</span>perform<span class="token constant">Search</span><span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token constant">FieldsService</span><span class="token punctuation">.</span><span class="token keyword">new</span><span class="token punctuation">(</span><span class="token string">"your key word"</span><span class="token punctuation">,</span> fields<span class="token punctuation">:</span> <span class="token punctuation">[</span><span class="token symbol">:name</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">.</span>perform<span class="token constant">Search</span><span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token constant">FieldsService</span><span class="token punctuation">.</span><span class="token keyword">new</span><span class="token punctuation">(</span><span class="token string">"your key word"</span><span class="token punctuation">,</span> fields<span class="token punctuation">:</span> <span class="token punctuation">[</span><span class="token symbol">:description</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">.</span>perform
4. Limit and offset:
- Searchkick cung cấp thêm 2 option là
offset
vàlimit
có tác dụng tương tựoffset
vàlimit
trong SQL. - Ví dụ:12<span class="token constant">Product</span><span class="token punctuation">.</span><span class="token function">search</span><span class="token punctuation">(</span><span class="token string">"your key word"</span><span class="token punctuation">,</span> limit<span class="token punctuation">:</span> <span class="token number">10</span><span class="token punctuation">,</span> offset<span class="token punctuation">:</span> <span class="token number">20</span><span class="token punctuation">)</span>
- Searchlick sẽ bỏ qua 20 product đầu tiên trong các product tìm được và chỉ trả về 10 product.
- Trong source code tham khảo có implement service để bạn search với
limit
vàoffset
.12<span class="token constant">Search</span><span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token constant">LimitOffsetService</span><span class="token punctuation">.</span><span class="token keyword">new</span><span class="token punctuation">(</span><span class="token string">"your key word"</span><span class="token punctuation">,</span> limit<span class="token punctuation">:</span> <span class="token number">10</span><span class="token punctuation">,</span> offset<span class="token punctuation">:</span> <span class="token number">20</span><span class="token punctuation">)</span><span class="token punctuation">.</span>perform
5. Results:
- Method
search
của searchkick trả vềSearchkick::Results
object. - Ta có thể coi object này như array và gọi các method của array như sau123456results <span class="token operator">=</span> <span class="token constant">Product</span><span class="token punctuation">.</span><span class="token function">search</span><span class="token punctuation">(</span><span class="token string">"your key word"</span><span class="token punctuation">)</span>results<span class="token punctuation">.</span>sizeresults<span class="token punctuation">.</span>lengthresults<span class="token punctuation">.</span>any<span class="token operator">?</span>results<span class="token punctuation">.</span><span class="token keyword">each</span> <span class="token punctuation">{</span><span class="token operator">|</span>result<span class="token operator">|</span> <span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span> <span class="token punctuation">}</span>
Searchkick::Result
còn có thêm 2 method làtook
vàresponse
123456<span class="token comment"># thời gian thực hiện search (ms)</span>results<span class="token punctuation">.</span>took<span class="token comment"># response elasticsearch trả về (JSON)</span>results<span class="token punctuation">.</span>responseSearchkick::Result
còn có thêm 1 method làtotal_count
trả về toàn bộ product search được khi chưa pagination, khác với methodcount
,length
haysize
- Ví dụ12345<span class="token constant">Product</span><span class="token punctuation">.</span><span class="token function">search</span><span class="token punctuation">(</span><span class="token string">"your key word"</span><span class="token punctuation">,</span> limit<span class="token punctuation">:</span> <span class="token number">10</span><span class="token punctuation">)</span><span class="token punctuation">.</span>length <span class="token comment"># 10</span><span class="token constant">Product</span><span class="token punctuation">.</span><span class="token function">search</span><span class="token punctuation">(</span><span class="token string">"your key word"</span><span class="token punctuation">,</span> limit<span class="token punctuation">:</span> <span class="token number">10</span><span class="token punctuation">)</span><span class="token punctuation">.</span>size <span class="token comment"># 10</span><span class="token constant">Product</span><span class="token punctuation">.</span><span class="token function">search</span><span class="token punctuation">(</span><span class="token string">"your key word"</span><span class="token punctuation">,</span> limit<span class="token punctuation">:</span> <span class="token number">10</span><span class="token punctuation">)</span><span class="token punctuation">.</span>count <span class="token comment"># 10</span><span class="token constant">Product</span><span class="token punctuation">.</span><span class="token function">search</span><span class="token punctuation">(</span><span class="token string">"your key word"</span><span class="token punctuation">,</span> limit<span class="token punctuation">:</span> <span class="token number">10</span><span class="token punctuation">)</span><span class="token punctuation">.</span>total_count <span class="token comment"># 100</span>