Как отобразить релевантность Elasticsearch по умолчанию _score во внешнем интерфейсе - PullRequest
0 голосов
/ 05 мая 2019

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

Я подумал, что, возможно, я мог бы использовать оператор If / Else и использовать значение _score по умолчанию Elasticsearch и изменить его на проценты, чтобы, наконец, отобразить процент для каждого объекта во внешнем интерфейсе, но я не знаю, как это сделатьit.

Какие-нибудь решения?

Моя структура индекса Elasticsearch выглядит следующим образом:

{"took":3424,"timed_out":false,"_shards":{"total":5,"successful":5,"failed":0},"hits":{"total":19,"max_score":1.0,"hits":[{"_index":"searchindex","_type":"modelresult","_id":"search.product.4","_score":1.0,"_source":{"id": "search.product.4", "django_ct": "search.product", "django_id": "4", "text": "Lancaster\nlorem sivbnogc hbiuygv bnjiuygv bmkjygv nmjhgv\n", "title": "My Title 16", "description": "lorem sivbnogc hbiuygv bnjiuygv bmkjygv nmjhgv", "destination": "Lancaster", "link": "uvergo.com", "image": "gravitational_lens.png", "brandlogo": "destination.png", "ptags": ["Couple"], "ptags_exact": ["Couple"], "content_auto": "Lancaster"}}

Вот мои Models.py:

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

IЯ использую пользовательские формы в 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

Передача пользовательских форм в представления следующим образом:

class FacetedSearchView(BaseFacetedSearchView):

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

Мой файл 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") 
    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())

Вот где и как я бы отобразил процент совпадений:

<div>
     {% if  page_obj.object_list %}
      <ol class="row top20">

        {% for result in page_obj.object_list %}

        <div class="showcase col-sm-6 col-md-4">


        <!-- Display the matching score in the span below -->

           <a href="{{ result.object.get_absolute_url }}">

                   <span class="matching-score">{{ result.object.matching_score }}<\span>

              <h3>{{result.object.title}}</h3>
                   <h5>{{ result.object.destination }}</h5>
              <img src="{{ result.object.image }}" class="img-responsive">
           </a>

        <div class="text-center textio">
                   <ul class="tagslist">
                       <li class="listi">
        {% for tags in result.object.ptags.names %}

        <span class="label label-info">{{ tags }}</span>

        {% endfor %}
                       </li>
                   </ul>
        </div>

    </div>
        {% endfor %}
      </ol>
</div>
...