Изменение точности результатов поиска в стоге сена django для фиксированного ключевого слова - PullRequest
1 голос
/ 03 июня 2019

Я настроил функцию поиска в моем проекте Django с Django-Haystack и Elasticsearch, все работает нормально, за исключением точности результатов.

По сути, я ищу способ заставить результаты поиска соответствовать только данному ключевому слову и ничего больше.

Вариант использования - это пользователь, который вводит пункт назначения, куда он едет, например Barcelona и получает результаты только в этом конкретном пункте назначения. Но на данный момент, если я ищу ключевое слово Barcelona, я также получаю результаты из другого места назначения, например Dubai или Paris, что явно неприемлемо для пользователя.

Есть ли способ сделать это?

Вот моя форма стога сена:

from haystack.forms import FacetedSearchForm


class FacetedProductSearchForm(FacetedSearchForm):

    def __init__(self, *args, **kwargs):
        data = dict(kwargs.get("data", []))
        self.ptag = data.get('ptags', [])
        super(FacetedProductSearchForm, self).__init__(*args, **kwargs)

    def search(self):
        sqs = super(FacetedProductSearchForm, self).search()


        # search filters
        if self.ptag:
            query = None
            for ptags in self.ptag:
                if query:
                    query += u' OR '
                else:
                    query = u''
                query += u'"%s"' % sqs.query.clean(ptags)
            sqs = sqs.narrow(u'ptags_exact:%s' % query)

        return sqs

Это мои модели:

class Product(models.Model):
    destination = models.CharField(max_length=255, default='')
    title = models.CharField(max_length=255, default='')
    slug = models.SlugField(unique=True, max_length=255)
    description = models.TextField(max_length=2047, default='')
    link = models.TextField(max_length=500, default='')

    ptags = TaggableManager()

    image = models.ImageField(max_length=500, default='images/zero-image-found.png')
    timestamp = models.DateTimeField(auto_now=True)

    def _ptags(self):
        return [t.name for t in self.ptags.all()]

    def get_absolute_url(self):
        return reverse('experience',
                       kwargs={'slug': self.slug})

    def save(self, *args, **kwargs):
        if not self.id:
            self.slug = slugify(self.title)
        super(Product, self).save(*args, **kwargs)

    def __str__(self):
        return self.destination #return the destination

И мой search_indexes.py:

import datetime
from django.utils import timezone
from haystack import indexes
from haystack.fields import CharField

from .models import Product


class ProductIndex(indexes.SearchIndex, indexes.Indexable):
    text = indexes.EdgeNgramField(
        document=True, use_template=True,
        template_name="{% templates 'search/indexes/product_text.txt' %}")
    title = indexes.CharField(model_attr='title')
    description = indexes.EdgeNgramField(model_attr="description")
    destination = indexes.EdgeNgramField(model_attr="destination") #boost=1.125
    link = indexes.CharField(model_attr="link")
    image = indexes.CharField(model_attr="image")

    # Tags
    ptags = indexes.MultiValueField(model_attr='_ptags', faceted=True)

    # for auto complete
    content_auto = indexes.EdgeNgramField(model_attr='destination')

    # Spelling suggestions
    suggestions = indexes.FacetCharField()

    def get_model(self):
        return Product

    def index_queryset(self, using=None):
        """Used when the entire index for model is updated."""
        return self.get_model().objects.filter(timestamp__lte=timezone.now())

Как я могу это исправить?

Пожалуйста, помогите.

...