使用 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"。
我正在使用以下查询通过 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"。