Django4.0 搜索-文檔搜索

2022-03-16 17:35 更新

標(biāo)準(zhǔn)數(shù)據(jù)庫操作對于大量文本搜索來說太過簡陋了。雖然上面的示例可以看作是對字符串的操作,但是全文搜索查看的是實際的單詞。依據(jù)所使用的系統(tǒng),可以采用下面的某些方法:

  • 忽略 “停用詞語”,例如 "a","the","and"。
  • 詞干化,這樣 "pony" 和 "ponies" 會被認(rèn)為是一樣的。
  • 根據(jù)不同的標(biāo)準(zhǔn)為單詞設(shè)置權(quán)重,例如其在文本中出現(xiàn)的頻率,或所屬字段(如標(biāo)題或關(guān)鍵字)的重要性。

使用搜索軟件有很多選項,最常見的有 Elastic 和 Solr。它們都是基于全文搜索的解決方案。要用它們搜索來自 Django 模型的數(shù)據(jù),你需要一個抽象層,將數(shù)據(jù)(包括對數(shù)據(jù)庫 id 的指針)轉(zhuǎn)換為文本文檔。當(dāng)使用該引擎的某次搜索返回了一份文檔,你可以在數(shù)據(jù)庫中查看它。有很多第三方庫被設(shè)計為處理這種問題。

PostgreSQL 支持

PostgreSQL 內(nèi)置了其專屬的全文本搜索實現(xiàn)。雖然并不像其它搜索引擎那樣強(qiáng)大,但它的優(yōu)點(diǎn)是內(nèi)置在數(shù)據(jù)庫中,所以它能很方便的與其它關(guān)聯(lián)查詢條件進(jìn)行聯(lián)合查詢,如按分類查詢。
?django.contrib.postgres? 模塊提供了一些助手函數(shù)來執(zhí)行這些查詢。例如,查詢可能篩選出所有提到了 "cheese" 的博客條目:

>>> Entry.objects.filter(body_text__search='cheese')
[<Entry: Cheese on Toast recipes>, <Entry: Pizza recipes>]

你也可以在聯(lián)合字段或關(guān)聯(lián)模型上進(jìn)行篩選:

>>> Entry.objects.annotate(
...     search=SearchVector('blog__tagline', 'body_text'),
... ).filter(search='cheese')
[
    <Entry: Cheese on Toast recipes>,
    <Entry: Pizza Recipes>,
    <Entry: Dairy farming in Argentina>,
]


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號