Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Finding your High with Low Search
Search
Lodewijk Schutte
October 04, 2016
Programming
0
350
Finding your High with Low Search
An introduction to Low Search for ExpressionEngine, given at EEconf 2016.
Lodewijk Schutte
October 04, 2016
Tweet
Share
More Decks by Lodewijk Schutte
See All by Lodewijk Schutte
Errare Humanum Est
low
2
450
So, you wanna build an add-on...
low
1
88
Parse Order Pro
low
2
660
PHP in Templates: Pain or Pleasure
low
0
190
Ajax and ExpressionEngine
low
1
110
Other Decks in Programming
See All in Programming
競馬で学ぶ機械学習の基本と実践 / Machine Learning with Horse Racing
shoheimitani
14
13k
JEP 496 と JEP 497 から学ぶ耐量子計算機暗号入門 / Learning Post-Quantum Crypto Basics from JEP 496 & 497
mackey0225
2
440
物流DXを支える“意味”の設計:セマンティックレイヤーとAIで挑むデータ基盤/登壇資料(飯塚 大地)
hacobu
PRO
0
100
ソフトウェア設計の課題・原則・実践技法
masuda220
PRO
20
12k
予防に勝る防御なし(2025年版) - 堅牢なコードを導く様々な設計のヒント / Growing Reliable Code PHP Conference Fukuoka 2025
twada
PRO
39
13k
AIを駆使して新しい技術を効率的に理解する方法
nogu66
1
650
AI駆動開発ライフサイクル(AI-DLC)のホワイトペーパーを解説
swxhariu5
0
1.2k
カンファレンス遠征を(安く)楽しむ技術
wp_daisuke
0
180
Honoを技術選定したAI要件定義プラットフォームAcsimでの意思決定
codenote
0
250
[堅牢.py #1] テストを書かない研究者に送る、最初にテストを書く実験コード入門 / Let's start your ML project by writing tests
shunk031
11
4.8k
Promise.tryで実現する新しいエラーハンドリング New error handling with Promise try
bicstone
3
510
全員アーキテクトで挑む、 巨大で高密度なドメインの紐解き方
agatan
5
5.4k
Featured
See All Featured
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
508
140k
Fantastic passwords and where to find them - at NoRuKo
philnash
52
3.5k
Being A Developer After 40
akosma
91
590k
Agile that works and the tools we love
rasmusluckow
331
21k
We Have a Design System, Now What?
morganepeng
54
7.9k
The Cost Of JavaScript in 2023
addyosmani
55
9.3k
The Cult of Friendly URLs
andyhume
79
6.7k
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
11
940
Dealing with People You Can't Stand - Big Design 2015
cassininazir
367
27k
Site-Speed That Sticks
csswizardry
13
970
The Hidden Cost of Media on the Web [PixelPalooza 2025]
tammyeverts
1
38
Context Engineering - Making Every Token Count
addyosmani
9
410
Transcript
Finding your high with Low Search By Lodewijk Schutte ~
Low, October 2016
Hi! I'm Low!
Low Search
Google searches pages, returns URLs. Low Search filters & returns
Channel Entries.
The more granular the content, the more control you have
over its output.
Searching vs. Filtering •In ExpressionEngine, searching == filtering. •Filter output
by setting parameters to the Channel Entries Tag. •Low Search extends the CE Tag, offering more parameters and thus more control.
{exp:channel:entries dynamic="no"} code {/exp:channel:entries}
{exp:channel:entries dynamic="no" status="open" show_future_entries="no" show_expired="no" orderby="date" sort="desc" limit="100" }
{exp:channel:entries dynamic="no" channel="articles" category="5" username="stanlee" search:body="marvel" start_on="-3 months" status="open" show_future_entries="no"
show_expired="no" orderby="date" sort="desc" limit="100" }
{exp:low_search:results} Read parameters, run filters Set fixed_order or entry_id parameter
Call {exp:channel:entries} Post-process returned entries Return search results
{exp:low_search:results collection="products" keywords="luke cage" category:type="7|8" category:gender="11" search:size="=XL|XXL" range-to:price="30" orderby_sort="price|asc" }
All mens tees and hoodies in size XL or XXL, up to $30, that match the terms "luke cage", ordered by price, ascending.
{exp:channel:entries channel="products" entry_id="34|38|42|51" orderby="price" sort="asc" }
{exp:channel:entries channel="products" entry_id="34|38|42|51" orderby="price" sort="asc" status="open" show_future_entries="no" show_expired="no" limit="100" }
A parameter… •…can be fixed: {exp:low_search:results name="value"} •…can be dynamic,
using a form: <input name="name" value="value"> •…can be read as a variable: {low_search_name} => value
{exp:low_search:form result_page="search/results"} <input name="keywords" value=""> <select name="category:type[]" multiple>…</select <input name="search:size[]"
type="checkbox" value="XL"> XL … <input name="range-to:price" type="range" min="10" max="250" step="10"> <select name="limit">…</select> other form fields {/exp:low_search:form}
domain.com/search/results/eyJyZXN…
{exp:low_search:results collection="products" query="{segment_3}" } {if count == 1} Searched for
{low_search_keywords} {/if} code {/exp:low_search:results}
A filter… •…consists of any amount of parameters. •…runs one
or more (simple) queries. •…passes its results onto the next. •…triggers no_results when it comes up empty.
Keywords •Matches entries against given keywords •Uses a full-text index
created via collections •Allows for speed and relevance •Allows for inflections and stemming •Order by relevance score
Field Search •Like native search:field_name parameter •Can target title, url_title
and status •Can target Grid (or Matrix) columns •Additional matching, like starts_with •Smart Field Search option
Ranges •Targets numeric or date fields •Two values, one field;
optionally specify min/max values separately •Can also target Grid (or Matrix) columns •Inverse ranges (two fields, one value)
Categories •Accepts category_ids •Combine AND and OR by specifying groups
on the fly: •category:color="1|2|3" •category:type="4|5|6" •category:style="7|8|9"
Relationships •Accepts entry_ids or url_titles •Can target the parent or
child entry: •parent:field_name="1|2|3" •child:field_name="4|5|6"
Distance •Uses Haversine algorithm •From given lat/lon values to one
or two fields containing the entry’s coordinates •Specify max radius and unit •Order by calculated distance
There’s more! •Tags (included) •Members https://github.com/low/low_search_members •Table https://github.com/low/low_search_table •Calendar (sold
separately, EE2) •Store (sold separately, EE2) •Create your own…
class Low_search_filter_foo extends Low_search_filter { public function filter($entry_ids) { return
$entry_ids; } public function fixed_order() { return FALSE; } public function results($rows) { return $rows; } }
Questions?
Thank You! gotolow.com @low