Using the search box creates a query against the pns, summaries, descriptions and filenames of recipes. This results in a lot of spurious results for common terms like "git" when performing a recipe search.
Make the results more useful by: * Only searching against pn, description and summary (not file). * Putting matches against pn at the top of the list, followed by matches against description and summary. [YOCTO #9159] Signed-off-by: Elliot Smith <elliot.sm...@intel.com> --- layerindex/views.py | 28 +++++++++++++++++++++++----- 1 file changed, 23 insertions(+), 5 deletions(-) diff --git a/layerindex/views.py b/layerindex/views.py index 7e877ac..898a7c4 100644 --- a/layerindex/views.py +++ b/layerindex/views.py @@ -11,6 +11,7 @@ from django.core.exceptions import PermissionDenied from django.template import RequestContext from layerindex.models import Branch, LayerItem, LayerMaintainer, LayerBranch, LayerDependency, LayerNote, Recipe, Machine, BBClass, BBAppend, RecipeChange, RecipeChangeset, ClassicRecipe from datetime import datetime +from itertools import chain from django.views.generic import TemplateView, DetailView, ListView from django.views.generic.edit import CreateView, DeleteView, UpdateView from django.views.generic.base import RedirectView @@ -373,18 +374,28 @@ class RecipeSearchView(ListView): query_string = self.request.GET.get('q', '') init_qs = Recipe.objects.filter(layerbranch__branch__name=self.kwargs['branch']) if query_string.strip(): - entry_query = simplesearch.get_query(query_string, ['pn', 'summary', 'description', 'filename']) - qs = init_qs.filter(entry_query).order_by('pn', 'layerbranch__layer') + order_by = ('pn', 'layerbranch__layer') + + entry_query = simplesearch.get_query(query_string, ['pn']) + qs1 = init_qs.filter(entry_query).order_by(*order_by) + qs1 = recipes_preferred_count(qs1) + + entry_query = simplesearch.get_query(query_string, ['description', 'summary']) + qs2 = init_qs.filter(entry_query).order_by(*order_by) + qs2 = recipes_preferred_count(qs2) + + qs = list(chain(qs1, qs2)) else: if 'q' in self.request.GET: qs = init_qs.order_by('pn', 'layerbranch__layer') + qs = list(recipes_preferred_count(qs)) else: # It's a bit too slow to return all records by default, and most people # won't actually want that (if they do they can just hit the search button # with no query string) return Recipe.objects.none() - return recipes_preferred_count(qs) + return qs def get_context_data(self, **kwargs): context = super(RecipeSearchView, self).get_context_data(**kwargs) @@ -689,8 +700,15 @@ class ClassicRecipeSearchView(RecipeSearchView): if category: init_qs = init_qs.filter(classic_category__icontains=category) if query_string.strip(): - entry_query = simplesearch.get_query(query_string, ['pn', 'summary', 'description', 'filename']) - qs = init_qs.filter(entry_query).order_by('pn', 'layerbranch__layer') + order_by = ('pn', 'layerbranch__layer') + + entry_query = simplesearch.get_query(query_string, ['pn']) + qs1 = init_qs.filter(entry_query).order_by(*order_by) + + entry_query = simplesearch.get_query(query_string, ['summary', 'description']) + qs2 = init_qs.filter(entry_query).order_by(*order_by) + + qs = list(chain(qs1, qs2)) else: if 'q' in self.request.GET: qs = init_qs.order_by('pn', 'layerbranch__layer') -- Elliot Smith Software Engineer Intel OTC --------------------------------------------------------------------- Intel Corporation (UK) Limited Registered No. 1134945 (England) Registered Office: Pipers Way, Swindon SN3 1RJ VAT No: 860 2173 47 This e-mail and any attachments may contain confidential material for the sole use of the intended recipient(s). Any review or distribution by others is strictly prohibited. If you are not the intended recipient, please contact the sender and delete all copies. -- _______________________________________________ yocto mailing list yocto@yoctoproject.org https://lists.yoctoproject.org/listinfo/yocto