【问题标题】:Django elasticsearch dsl completion field issueDjango elasticsearch dsl完成字段问题
【发布时间】:2020-11-19 19:11:45
【问题描述】:

我正在尝试使用django-elasticsearch-dsl-drf 为街道实施搜索建议。

这是documents.py

class StreetDocument(Document):
    id = fields.IntegerField()
    name_ru = StringField(
        fields={
            'raw': KeywordField(),
            'suggest': fields.CompletionField(),
        }
    )
    ... # same for name_uz and name_oz
    tags_ru = fields.CompletionField()
    ... # same for tags_uz and tags_oz

    class Django:
        model = Street
        fields = (
            'code',
            'street_type'
        )

views.py 我有这个:

from django_elasticsearch_dsl_drf.constants import SUGGESTER_COMPLETION
from django_elasticsearch_dsl_drf.filter_backends import SuggesterFilterBackend, CompoundSearchFilterBackend
from django_elasticsearch_dsl_drf.viewsets import DocumentViewSet

class SuggestionListAPI(DocumentViewSet):
    document = StreetDocument
    serializer_class = StreetDocumentSerializer
    filter_backends = [
        CompoundSearchFilterBackend,
        SuggesterFilterBackend,
    ]
    search_fields = (
        'code',
        'name_ru',
        'name_uz',
        'name_oz',
        'tags_ru',
        'tags_uz',
        'tags_oz'
    )
    suggester_fields = {
        'name_ru_suggest': {
            'field': 'name_ru.suggest',
            'suggesters': [
                SUGGESTER_COMPLETION,
            ],
        },
        ... # same for name_uz and name_oz
        'tags_ru': {
            'field': 'tags_ru',
            'suggesters': [
                SUGGESTER_COMPLETION,
            ],
        },
        ... # same for tags_uz and tags_oz
    }

/suggestions?name_ru_suggest__completion=tolstoy 的请求什么都不做,只是接收所有未经过滤的街道。

请求/suggestions?search=tolstoy 效果很好,但我需要自动完成。

我哪里做错了?如果可以同时使用两个字段进行建议,那就太好了。

感谢您的时间和帮助。

【问题讨论】:

    标签: django elasticsearch elasticsearch-dsl


    【解决方案1】:

    您似乎使用了错误的端点来获取建议。正确的名字是suggest

    示例:http://127.0.0.1:8000/search/publishers/suggest/?country_suggest__completion=Ar

    Corresponding viewsets

    关于一次使用两个字段进行建议的问题,可以一次获得多个字段的建议。例如,如果您有 titleauthor,它们都已正确索引和配置,您可以按如下方式查询它:

    http://127.0.0.1:8000/search/books/suggest/?title_suggest=wa&author_suggest=le

    但是,这将返回以下结果:

    {
        "title_suggest": [...],
        "author_suggest": [...] 
    }
    

    但是,如果您需要根据某些标准优化您的建议,您可以使用上下文建议器来做到这一点(在 django-elasticsearch-dsl-drf 的官方文档中搜索)。

    【讨论】:

    • 非常感谢。我使用了错误的端点。 http://127.0.0.1:8000/ru/suggestions/suggest/?name_ru_suggest__completion=Ar 效果很好。抱歉,我不能让contains 工作。试过http://127.0.0.1:8000/ru/suggestions/?name_ru__contains=Ar。这不是一个正确的 URL?
    • contains 不是有效的建议查找。 Elasticsearch 提供三种类型:completiontermphrase。如果你需要部分匹配,你最好使用 ngrams。示例项目确实包含几个示例。
    猜你喜欢
    • 1970-01-01
    • 2020-08-29
    • 2019-09-26
    • 1970-01-01
    • 2021-10-19
    • 1970-01-01
    • 1970-01-01
    • 2021-06-09
    • 1970-01-01
    相关资源
    最近更新 更多