全文檢索引擎在Django中的使用

2022-07-01 02:42:16 字數 4918 閱讀 8508

haystack是django的開源全文搜尋框架(全文檢索不同於特定欄位的模糊查詢,使用全文檢索的效率更高 ),該框架支援solr,elasticsearch,whoosh, **xapian搜尋引擎它是乙個可插拔的後端(很像django的資料庫層),所以幾乎你所有寫的**都可以在不同搜尋引擎之間便捷切換

pip install django-haystack

pip install whoosh

pip install jieba

'django.contrib.admin',

'django.contrib.auth',

'django.contrib.contenttypes',

'django.contrib.sessions',

'django.contrib.sites',

# 新增

'haystack',

'blog',

]在你的settings.py中,你需要新增乙個設定來指示站點配置檔案正在使用的後端,以及其它的後端設定。haystack——connections是必需的設定,並且應該至少是以下的一種:

solr示例

haystack_connections = ,

}

elasticsearch示例
haystack_connections = ,

}

whoosh示例
#需要設定path到你的whoosh索引的檔案系統位置

import os

haystack_connections = ,

}# 自動更新索引

haystack_signal_processor = 'haystack.signals.realtimesignalprocessor'

xapian示例
#首先安裝xapian後端(

#需要設定path到你的xapian索引的檔案系統位置。

import os

haystack_connections = ,

}

from haystack import indexes

class articleindex(indexes.searchindex, indexes.indexable):

#類名必須為需要檢索的model_name+index,這裡需要檢索article,所以建立articleindex

text = indexes.charfield(document=true, use_template=true)#建立乙個text欄位

#其它字段

desc = indexes.charfield(model_attr='desc')

content = indexes.charfield(model_attr='content')

def get_model(self):#過載get_model方法,必須要有!

return article

def index_queryset(self, using=none):

return self.get_model().objects.all()

為什麼要建立索引?索引就像是一本書的目錄,可以為讀者提供更快速的導航與查詢。在這裡也是同樣的道理,當資料量非常大的時候,若要從這些資料裡找出所有的滿足搜尋條件的幾乎是不太可能的,將會給伺服器帶來極大的負擔。所以我們需要為指定的資料新增乙個索引(目錄),在這裡是為note建立乙個索引,索引的實現細節是我們不需要關心的,至於為它的哪些字段建立索引,怎麼指定 ,下面開始講解

每個索引裡面必須有且只能有乙個欄位為 document=true,這代表haystack 和搜尋引擎將使用此字段的內容作為索引進行檢索(primary field)。其他的字段只是附屬的屬性,方便呼叫,並不作為檢索資料

注意:如果使用乙個字段設定了document=true,則一般約定此欄位名為text,這是在articleindex類裡面一貫的命名,以防止後台混亂,當然名字你也可以隨便改,不過不建議改。
另外,我們在text欄位上提供了use_template=true。這允許我們使用乙個資料模板(而不是容易出錯的級聯)來構建文件搜尋引擎索引。你應該在模板目錄下建立新的模板search/indexes/blog/article_text.txt,並將下面內容放在裡面。

#在目錄「templates/search/indexes/應用名稱/」下建立「模型類名稱_text.txt」檔案}}

}

這個資料模板的作用是對note.title,note.user.get_full_name,note.body這三個字段建立索引,當檢索的時候會對這三個欄位做全文檢索匹配

在你的urlconf中新增下面一行:

(r'^search/', include('haystack.urls')),
這會拉取haystack的預設urlconf,它由單獨指向searchview例項的urlconf組成。你可以通過傳遞幾個關鍵引數或者完全重新它來改變這個類的行為。

你的搜尋模板(預設在search/search.html)將可能非常簡單。下面的足夠讓你的搜尋執行(你的template/block應該會不同)

}#}

}

啥也沒找到

|

需要注意的是page.object_list實際上是searchresult物件的列表。這些物件返回索引的所有資料。它們可以通過}來訪問。所以}實際使用的是資料庫中article物件來訪問title欄位的。

現在你已經配置好了所有的事情,是時候把資料庫中的資料放入索引了。haystack附帶的乙個命令列管理工具使它變得很容易。

簡單的執行./manage.py rebuild_index。你會得到有多少模型進行了處理並放進索引的統計。

#建立chineseanalyzer.py檔案

#儲存在haystack的安裝資料夾下,路徑如「d:\python3\lib\site-packages\haystack\backends」

import jieba

from whoosh.analysis import tokenizer, token

class chinesetokenizer(tokenizer):

def __call__(self, value, positions=false, chars=false,

keeporiginal=false, removestops=true,

start_pos=0, start_char=0, mode='', **kwargs):

t = token(positions, chars, removestops=removestops, mode=mode,

**kwargs)

seglist = jieba.cut(value, cut_all=true)

for w in seglist:

t.original = t.text = w

t.boost = 1.0

if positions:

t.pos = start_pos + value.find(w)

if chars:

t.startchar = start_char + value.find(w)

t.endchar = start_char + value.find(w) + len(w)

yield t

def chineseanalyzer():

return chinesetokenizer()

#複製whoosh_backend.py檔案,改名為whoosh_cn_backend.py

#注意:複製出來的檔名,末尾會有乙個空格,記得要刪除這個空格

from .chineseanalyzer import chineseanalyzer

查詢analyzer=stemminganalyzer()

改為analyzer=chineseanalyzer()

from haystack.views import searchview  

from .models import *

class myseachview(searchview):

def extra_context(self): #過載extra_context來新增額外的context內容

context = super(myseachview,self).extra_context()

side_list = topic.objects.filter(kind='major').order_by('add_date')[:8]

context['side_list'] = side_list

return context

#路由修改

url(r'^search/', search_views.myseachview(), name='haystack_search'),

# 這裡可以限制最終}被高亮處理後的長度

#html中

全文檢索引擎 Sphinx

sphinx是乙個基於sql的全文檢索引擎,可以結合mysql,postgresql做全文搜尋,它可以提供比資料庫本身更專業的搜尋功能,使得應用程式更容易實現專業化的全文檢索。sphinx特別為一些指令碼語言設計搜尋api介面,如php,python,perl,ruby等,同時為mysql也設計了乙...

全文檢索引擎 Sphinx

sphinx是乙個基於sql的全文檢索引擎,可以結合mysql,postgresql做全文搜尋,它可以提供比資料庫本身更專業的搜尋功能,使得應用程式更容易實現專業化的全文檢索。sphinx特別為一些指令碼語言設計搜尋api介面,如php,python,perl,ruby等,同時為mysql也設計了乙...

mysql ngram全文檢索引擎

中的內容視作乙個短語 整體 3.查詢 已經存在表 against select from articles where match title,body against 文言文 innatural language mode 不指定模式,預設使用自然語言模式 select from articles...