使用 SQLite 进行 Pewee 索引搜索

Pewee index search with SQLite

我正在使用以下查询通过 SQLite 执行文本搜索。

docs = DocumentIndex.search(
    'search term',
    weights={'title': 2.0, 'content': 1.0},
    with_score=True,
    score_alias='search_score')

for result in docs:
    print result.title, result.search_score

结果是 DocumentIndex 的排名列表。我怎样才能将此结果与 Document table 相结合,以便它 returns 一个 Document 列表保留原始排名顺序?

我尝试了以下方法:

return Document.select().where(docs)

但是说 only a single result allowed

是行不通的

我更喜欢处理这种事情的方法是确保全文搜索table的docid与正在搜索的任何内容的主键相同。

所以我会:

class Document(Model):
    content = TextField()

class DocumentIndex(FTSModel):
    docid = DocIDField()
    content = TextField()

    class Meta:
        extension_options = {'tokenize': 'porter'}

document = Document.create(content='something')
DocumentIndex.create(content=document.content, docid=document.id)

然后在搜索时,我会做类似的事情:

query = (Document
         .select(Document, DocumentIndex.bm25().alias('score'))
         .join(DocumentIndex, on=(Document.id == DocumentIndex.docid))
         .where(DocumentIndex.match(search_term))
         .order_by(SQL('score'))

注意:FTS3 和 FTS5 使用 "rowid" 而不是 "docid"。