Learning Django by Example(10): Search
django pythonSearch is one of the must-have functionalities in Gelman. Here is an SearchQuerySet based upon MySQL full text search extension. It is really cool and neat, but
- first, I don’t want to build my application against specific database extension, even though MySQL is universally picked up in the Web application.
- second, I still prefer more flexible and powerful search syntax other than what MySQL provides
- Last but not the least, I may still need Lucene or Xapianto index, search the PDF, CHM eBooks
So I home-brew the search using PLY, the Python Lex Yacc toolchain. You could check the code here, most of parser.py is just boilerplate, the interesting part is to build django.db.models.Q
def p_expression_term(t):
'expression : TERM'
t[0] = Q(**{'title__icontains':t[1]})
The semantics is quite straightforward: AND(the default), OR operations are supported directly from Q; and only field title is searched. We may extend the syntax using author: like Google does later, so stay tune.