首页 文章

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

提问于
浏览
0

我正在尝试添加一个完成建议器,以便为我的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 Adam Wattis的帖子对我开始非常有帮助) . 会欣赏任何指针 .

1 回答

  • 0

    我想我想通了(..phew)

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

    name_suggest = self.name
    

    代替:

    name_suggest = {'input': something.here }
    

    这似乎用于更多的自定义案例 .

    感谢this video,这有帮助!

相关问题