Фильтрация поисков с помощью Elasticsearch - PullRequest
0 голосов
/ 14 ноября 2018

Мой проект - это инструмент поиска, который выполняет поиск по вопросам и / или ответам. Я хочу, чтобы он также мог фильтровать поиски, например, темы, клиенты. Каждый ответ сопоставляется с вопросом, темой и клиентом с помощью внешнего ключа.

Я могу выполнять поиск по вопросам и ответам, но когда я добавляю в разделы фильтра (раскрывающийся список), он возвращает 0 результатов.

models.py:

class Topic(models.Model):
    Definition = models.TextField(default='Definition')
    Name = models.TextField(default='Name')
    class Meta:
        ordering = ['Name']
    def __str__(self):
        return self.Name

class Question(models.Model):
    Statement = models.TextField()
    def __str__(self):
        return self.Statement

class Response(models.Model):
    Question = models.ForeignKey(Question, on_delete=models.CASCADE)
    Topic = models.ForeignKey(Topic, default=13, on_delete=models.CASCADE)
    Response = models.TextField()
    Client = models.ForeignKey(ClientDetail, default=8, on_delete=models.CASCADE)
    Planit_location = models.ForeignKey(Planit_location, default=1, on_delete=models.CASCADE)
    Date_added = models.DateField(default=datetime.date.today)

    def __str__(self):
        return self.Response

documents.py:

class ResponseDocument20(DocType):
    Question = fields.NestedField(properties={
        'Statement': fields.TextField(),
        'pk': fields.IntegerField(),
    }, include_in_root=True)
    class Meta:
        model = Response

    fields = [
        'Response'
    ]
    related_models = [Question]

    def get_instances_from_related(self, related_instance):
        if isinstance(related_instance, Question):
            return related_instance.response_set.all()

views.py:

if q:#ES
    cleanQ = stopwords.strip_stopwords(q)
    if (queryR == "questions"):
        if (queryT != "empty"):
            responses = ResponseDocument20.search().filter(Q_ES("match", Question__Statement=cleanQ.lower())&Q_ES("match", Topic__Name=queryT)).extra(size=10000)
        else:
            responses = ResponseDocument20.search().query("match", Question__Statement=cleanQ.lower()).extra(size=10000) #ES

Я предположил, что все, что мне нужно было добавить, было Topic__Name = queryT, чтобы отфильтровать поиск по теме, и это дало бы мне результаты, которые соответствовали бы поисковому вводу И теме.

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