Created Sunburnt query chains for querying Solr; this is the equivalent of the DefaultQueryParser class that creates queries for Whoosh. Also implemented the IAdminCommandProvider interface for providing two trac-admin commands to pre-poluate BH with existing resources, and for optimising the index. However, the two trac-admin commands doesn’t seem to work for the moment (when trying to run them, I get a “command not found” error), but I’m currently trying to find out why this happens.
On 20 June 2014 at 01:40:08, [email protected] ([email protected]) wrote: Author: ahorincar Date: Fri Jun 20 00:39:42 2014 New Revision: 1604058 URL: http://svn.apache.org/r1604058 Log: Added methods to create Sunburnt query chains Added: bloodhound/branches/bep_0014_solr/bloodhound_solr/bhsolr/admin.py bloodhound/branches/bep_0014_solr/bloodhound_solr/bhsolr/api.py Removed: bloodhound/branches/bep_0014_solr/bloodhound_solr/bhsolr/htdocs/ bloodhound/branches/bep_0014_solr/bloodhound_solr/bhsolr/templates/ bloodhound/branches/bep_0014_solr/bloodhound_solr/bhsolr/web_ui.py Modified: bloodhound/branches/bep_0014_solr/bloodhound_solr/bhsolr/solr_backend.py bloodhound/branches/bep_0014_solr/bloodhound_solr/setup.py Added: bloodhound/branches/bep_0014_solr/bloodhound_solr/bhsolr/admin.py URL: http://svn.apache.org/viewvc/bloodhound/branches/bep_0014_solr/bloodhound_solr/bhsolr/admin.py?rev=1604058&view=auto ============================================================================== --- bloodhound/branches/bep_0014_solr/bloodhound_solr/bhsolr/admin.py (added) +++ bloodhound/branches/bep_0014_solr/bloodhound_solr/bhsolr/admin.py Fri Jun 20 00:39:42 2014 @@ -0,0 +1,16 @@ +r"""Administration commands for Bloodhound Solr Search.""" +from trac.core import Component, implements +from trac.admin import IAdminCommandProvider +from bhsolr.api import BloodhoundSolrApi + +class BloodhoundSolrSearchAdmin(Component): + """Bloodhound Solr Search administration component.""" + implements(IAdminCommandProvider) + + # IAdminCommandProvider methods + def get_admin_commands(self): + yield ('bhsolr populate_index', '', 'Populate Solr search index', + None, BloodhoundSolrApi(self.env).populate_index) + yield ('bhsolr optimize', '', 'Optimize Solr search index', + None, BloodhoundSearchApi(self.env).optimize) + Added: bloodhound/branches/bep_0014_solr/bloodhound_solr/bhsolr/api.py URL: http://svn.apache.org/viewvc/bloodhound/branches/bep_0014_solr/bloodhound_solr/bhsolr/api.py?rev=1604058&view=auto ============================================================================== --- bloodhound/branches/bep_0014_solr/bloodhound_solr/bhsolr/api.py (added) +++ bloodhound/branches/bep_0014_solr/bloodhound_solr/bhsolr/api.py Fri Jun 20 00:39:42 2014 @@ -0,0 +1,7 @@ +from bhsolr.search_resources import TicketSearchModel +from trac.core import Component, implements + +class BloodhoundSolrApi(Component): + def populate_index(self): + tickets = TicketSearchModel(self.env).get_entries_for_index() + print tickets Modified: bloodhound/branches/bep_0014_solr/bloodhound_solr/bhsolr/solr_backend.py URL: http://svn.apache.org/viewvc/bloodhound/branches/bep_0014_solr/bloodhound_solr/bhsolr/solr_backend.py?rev=1604058&r1=1604057&r2=1604058&view=diff ============================================================================== --- bloodhound/branches/bep_0014_solr/bloodhound_solr/bhsolr/solr_backend.py (original) +++ bloodhound/branches/bep_0014_solr/bloodhound_solr/bhsolr/solr_backend.py Fri Jun 20 00:39:42 2014 @@ -7,17 +7,19 @@ from trac.ticket.api import TicketSystem from bhsearch.search_resources.ticket_search import TicketIndexer from datetime import datetime from trac.util.datefmt import utc +from bhsearch.api import ISearchBackend +from bhsearch.query_parser import DefaultQueryParser UNIQUE_ID = "unique_id" -class SolrModel(Component): +class SolrBackend(Component): implements(ISearchBackend) def __init__(self): resource_filename = pkg_resources.resource_filename path = resource_filename(__name__, "schemadoc") - # self.solr_interface = Solr("http://localhost:8983/solr/", path + '/schema.xml').solr_interface - self.solr_interface = Solr("http://localhost:8983/solr/").solr_interface + self.solr_interface = Solr("http://localhost:8983/solr/").solr_interface # TODO: Refactor + self.field_boosts = DefaultQueryParser(self.env).field_boosts def add_doc(self, doc, operation_context=None): @@ -34,13 +36,44 @@ class SolrModel(Component): self.solr_interface.delete(unique_id) - def optimize(): + def optimize(self): self.solr_interface.optimize() + def query(self, query, query_string, sort = None, fields = None, filter = None, + facets = None, pagenum = 1, pagelen = 20, highlight = False, + highlight_fields = None, context = None): + + tokens = set([token.text for token in query.all_tokens()]) + final_query_chain = None + for token in tokens: + token_query_chain = self._search_fields_for_token(token) + if final_query_chain == None: + final_query_chain = token_query_chain + else: + final_query_chain |= token_query_chain + + print final_query_chain + return None - def query(self, query): - self.solr_instance.solr_interface.query(query).execute() + def is_index_outdated(self): + return False + def recreate_index(self): + return True + + def start_operation(self): + return None + + def _search_fields_for_token(self, token): + query_chain = None + for field, boost in self.field_boosts.iteritems(): + field_token_dict = {field: token} + if query_chain == None: + query_chain = self.solr_interface.Q(**field_token_dict)**boost + else: + query_chain |= self.solr_interface.Q(**field_token_dict)**boost + + return query_chain def _reformat_doc(self, doc): for key, value in doc.items(): @@ -75,12 +108,7 @@ class SolrModel(Component): else: return u"%s:%s" % (doc_type, doc_id) -if __name__ == '__main__': - env = trac.env.Environment("/Users/antonia/Documents/Code/bloodhound/installer/bloodhound/environments/main") - db_connection = env.get_db_cnx() - cursor = db_connection.cursor() - a = cursor.execute("select * from ticket") - ticket = a.fetchall()[0] + def getInstance(self): + return self.solr_interface + - # for result in si.query(name="Ticket").execute(): - # print result Modified: bloodhound/branches/bep_0014_solr/bloodhound_solr/setup.py URL: http://svn.apache.org/viewvc/bloodhound/branches/bep_0014_solr/bloodhound_solr/setup.py?rev=1604058&r1=1604057&r2=1604058&view=diff ============================================================================== --- bloodhound/branches/bep_0014_solr/bloodhound_solr/setup.py (original) +++ bloodhound/branches/bep_0014_solr/bloodhound_solr/setup.py Fri Jun 20 00:39:42 2014 @@ -1,6 +1,6 @@ from setuptools import setup, find_packages -PKG_INFO = {'bhsolr': ['htdocs/*.*', 'templates/*', 'schemadoc/*.xml'], +PKG_INFO = {'bhsolr': ['schemadoc/*.xml'], 'bhsolr.search_resources' : [], } @@ -8,9 +8,9 @@ PKG_INFO = {'bhsolr': ['htdocs/*.*', 'te ENTRY_POINTS = { 'trac.plugins': [ - 'bhsolr.web_ui = bhsolr.web_ui', 'bhsolr.api = bhsolr.api', 'bhsolr.solr = bhsolr.solr', + 'bhsolr.admin = bhsolr.admin', 'bhsolr.solr_backend = bhsolr.solr_backend', 'bhsolr.search_resources.ticket_search = bhsolr.search_resources.ticket_search', 'bhsolr.search_resources.milestone_search = bhsolr.search_resources.milestone_search',
