Django elasticsearch dsl 完成字段问题
Django elasticsearch dsl completion field issue
我正在尝试使用 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
效果很好,但我需要自动完成。
我哪里错了?如果可以同时使用两个字段作为建议,那就太好了。
感谢您的宝贵时间和帮助。
您使用的建议端点似乎有误。正确的名称是 suggest
.
示例:http://127.0.0.1:8000/search/publishers/suggest/?country_suggest__completion=Ar
关于您关于一次使用两个字段进行建议的问题,可以一次获得多个字段的建议。例如,如果您有 title
和 author
,两者都已正确索引和配置,您可以按如下方式查询它:
http://127.0.0.1:8000/search/books/suggest/?title_suggest=wa&author_suggest=le
但是,这将 return 您得到以下结果:
{
"title_suggest": [...],
"author_suggest": [...]
}
但是,如果您需要根据某些标准改进您的建议,您可以使用上下文建议器(在 django-elasticsearch-dsl-drf 的官方文档中搜索)。
我正在尝试使用 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
效果很好,但我需要自动完成。
我哪里错了?如果可以同时使用两个字段作为建议,那就太好了。
感谢您的宝贵时间和帮助。
您使用的建议端点似乎有误。正确的名称是 suggest
.
示例:http://127.0.0.1:8000/search/publishers/suggest/?country_suggest__completion=Ar
关于您关于一次使用两个字段进行建议的问题,可以一次获得多个字段的建议。例如,如果您有 title
和 author
,两者都已正确索引和配置,您可以按如下方式查询它:
http://127.0.0.1:8000/search/books/suggest/?title_suggest=wa&author_suggest=le
但是,这将 return 您得到以下结果:
{
"title_suggest": [...],
"author_suggest": [...]
}
但是,如果您需要根据某些标准改进您的建议,您可以使用上下文建议器(在 django-elasticsearch-dsl-drf 的官方文档中搜索)。