ElasticSearch - 在python中为完成建议器批量索引

时间:2017-05-09 04:20:06

标签: django elasticsearch elasticsearch-dsl elasticsearch-py elasticsearch-dsl-py

我正在尝试添加一个完成建议器,以便在我的Django应用程序中为搜索字段启用搜索类型(使用Elastic Search 5.2.x和elasticseach-dsl)。在试图解决这个问题很长一段时间后,我还没有想到如何批量索引建议者。这是我的代码:

class SchoolIndex(DocType):
    name = Text()
    school_type = Keyword()
    name_suggest = Completion()

批量索引如下:

def bulk_indexing():
    SchoolIndex.init(index="school_index")
    es = Elasticsearch()
    bulk(client=es, actions=(a.indexing() for a in models.School.objects.all().iterator()))

并在models.py中定义了一个索引方法:

def indexing(self):
       obj = SchoolIndex(
          meta = {'id': self.pk},
          name = self.name,
          school_type = self.school_type,
          name_suggest = {'input': self.name } <--- # what goes in here?
       )
       obj.save(index="school_index")
       return obj.to_dict(include_meta=True)

根据ES docs,建议的索引与任何其他字段一样。所以我可以在我的代码中的上面name_suggest =语句中添加一些术语,这些术语在搜索时会匹配相应的字段。但我的问题是如何用大量的记录来做到这一点?我猜测ES会有一种标准的方式来自动提出一些可以用作建议的术语。例如:使用短语中的每个单词作为术语。我可以自己想出类似的东西(通过将每个短语分解为单词)但是我自己这样做似乎是违反直觉的,因为我猜这将是一种默认方式,用户可以根据需要进一步调整。但是在搜索了很长一段时间之后,在SO / blogs / ES docs / elasticsearch-dsl docs上找不到类似的东西。 (亚当瓦提斯的This帖子对我开始非常有帮助)。将会欣赏任何指示。

1 个答案:

答案 0 :(得分:0)

我想我想出来了(..phew)

在索引功能中,我需要使用以下内容启用前缀完成建议器:

name_suggest = self.name

而不是:

name_suggest = {'input': something.here }

似乎用于更多自定义案例。

感谢this video的帮助!