这个问题使我发疯了好几天了,没有解决办法。
我根据Django模型创建文档,如下所示。
来自django_elasticsearch_dsl导入字段
@registry.register_document class QuestionDocument(Document):
complete = fields.CompletionField(attr='title')
class Index:
name = 'questions'
class Django:
model = QuestionModel
fields = ['text', 'title']
现在我要执行以下完成查询:
matched_questions = list(QuestionDocument.search().suggest("suggestions", word, completion={'field': 'complete'}).execute())
但是我一直收到以下错误:
elasticsearch.exceptions.RequestError: RequestError(400, 'search_phase_execution_exception', 'Field [complete] is not a completion suggest field')
我认为问题是此字段的映射未正确创建,但我不知道如何解决。有人可以帮忙吗,这确实使我发疯。
更新:
我意识到在映射中,complete是作为文本字段创建的,我不知道为什么会这样或如何解决。这是我的映射:
{
"questions" : {
"mappings" : {
"doc" : {
"properties" : {
"complete" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
},
"text" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
},
"title" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
}
}
}
}
}
}
答案 0 :(得分:1)
我也遇到了类似的问题。
您应该尝试像这样声明您的Document
:
@registry.register_document
class QuestionDocument(Document):
title = fields.TextField(
fields={
'raw': fields.TextField(analyzer='standard'),
'suggest': fields.CompletionField(),
}
)
class Index:
name = 'questions'
class Django:
model = QuestionModel
fields = ['text']
然后从标题字段中恢复建议
from elasticsearch import Elasticsearch
from elasticsearch_dsl import Search
client = Elasticsearch("localhost:9200")
s = Search(using=client)
query = s.suggest('name_suggestion',"your_prefixword",completion={'field':'title.suggest'})
response = query.execute()
response.suggest['name_suggestion']
希望有帮助。让我知道是否能胜任这项工作。
答案 1 :(得分:0)
您的索引是自动创建的,而不是您使用所需的映射来创建它。您需要在索引任何文档之前创建索引。不确定如何在django_elasticsearch_dsl
中完成此操作,但是在elasticsearch_dsl
中,它只是调用QuestionDocument.init()
希望这会有所帮助!