django-elasticsearch-dsl映射完成建议字段不起作用

时间:2019-09-07 09:42:49

标签: django elasticsearch elasticsearch-dsl

这个问题使我发疯了好几天了,没有解决办法。

我根据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
              }
            }
          }
        }
      }
    }
  }
}

2 个答案:

答案 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()

希望这会有所帮助!