Тонкая настройка релевантности Elasticsearch - PullRequest
0 голосов
/ 04 мая 2019

В настоящее время я настраиваю функции поиска в своем проекте Django, используя Django-Haystack и Elasticsearch, и мне было интересно, можно ли каким-либо образом изменить релевантность результатов поиска.

Например, я могу ввести запрос для значения пункта назначения, например Las+Vegas, и он работает нормально, но когда я получаю результаты, я вижу объекты, которые соответствуют другому пункту назначения, например Laos.

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

Мои модели:

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

    ptags = TaggableManager()

    image = models.ImageField(default='')
    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('product',
                       kwargs={'slug': self.slug})


    def __str__(self):
        return self.destination

Я использую собственный файл forms.py, например:

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()

        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

Передача пользовательских форм в Views.py:

class FacetedSearchView(BaseFacetedSearchView):

    form_class = FacetedProductSearchForm
    facet_fields = ['ptags']
    template_name = 'search_result.html'
    paginate_by = 6
    context_object_name = 'object_list'

My Urls.py:

from django.conf.urls import url
from django.contrib import admin
from search.views import HomeView, ProductView, FacetedSearchView, autocomplete
from .settings import MEDIA_ROOT, MEDIA_URL
from django.conf.urls.static import static

urlpatterns = [
    url(r'^$', HomeView.as_view()),
    url(r'^admin/', admin.site.urls),
    url(r'^product/(?P<slug>[\w-]+)/$', ProductView.as_view(), name='product'),
    url(r'^search/autocomplete/$', autocomplete),
    url(r'^search/', FacetedSearchView.as_view(), name='haystack_search'),

] + static(MEDIA_URL, document_root=MEDIA_ROOT)

И, наконец, мой search_indexes.py:

class ProductIndex(indexes.SearchIndex, indexes.Indexable):
    text = indexes.EdgeNgramField(
        document=True, use_template=True,
        template_name='C:/Users/loicq/Desktop/Coding/UVERGO_SEARCH/venv/src/templates/search/indexes/product_text.txt')

    title = indexes.CharField(model_attr='title')

    description = indexes.EdgeNgramField(model_attr="description")

    destination = indexes.EdgeNgramField(model_attr="destination")

    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())

Спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...