Python 에서 haystack 을 사용 하여 django 전체 텍스트 검색엔진 기능 을 실현 합 니 다.
django 는 python 언어의 웹 프레임 워 크 로 기능 이 강하 다.일부 플러그 인 에 맞 춰 웹 사이트 에 검색 기능 을 편리 하 게 추가 할 수 있 습 니 다.
검색엔진 은 whoosh 를 사용 하여 순수 python 이 실현 하 는 전문 검색엔진 으로 작고 간단 합 니 다.
중국어 검색 은 중국어 단 어 를 나 누 어 jieba 를 사용 해 야 합 니 다.
django 프로젝트 에서 whoosh 를 직접 사용 하려 면 기본 적 인 세부 적 인 문제 에 관심 을 가 져 야 합 니 다.haystack 이라는 검색 프레임 워 크 를 통 해 django 에 검색 기능 을 직접 추가 할 수 있 습 니 다.색인 구축,검색 분석 등 세부 적 인 문제 에 관심 을 가 질 필요 가 없습니다.
haystack 은 다양한 검색엔진 을 지원 합 니 다.whoosh 뿐만 아니 라 solr,elastic search 등 검색 도 할 수 있 습 니 다.haystack 을 통 해 엔진 을 직접 전환 하면 됩 니 다.심지어 검색 코드 를 수정 하지 않 아 도 됩 니 다.
검색 설정
1.가방 설치
pip install django-haystack
pip install whoosh
pip install jieba
2.django 의 settings 설정settings.py 파일 을 수정 하고 haystack 응용 프로그램 을 추가 합 니 다.
INSTALLED_APPS = (
...
'haystack', # haystack
)
settings 에 haystack 설정 추가:
HAYSTACK_CONNECTIONS = {
'default': {
'ENGINE': 'haystack.backends.whoosh_cn_backend.WhooshEngine',
'PATH': os.path.join(BASE_DIR, 'whoosh_index'),
}
}
# , , ,
HAYSTACK_SIGNAL_PROCESSOR = 'haystack.signals.RealtimeSignalProcessor'
3.url 추가전체 항목 의 urls.py 에서 검색 기능 의 url 경 로 를 설정 합 니 다.
urlpatterns = [
...
url(r'^search/', include('haystack.urls')),
]
4.응용 디 렉 터 리 에 색인 추가하위 응용 디 렉 터 리 에 search 라 는 이름 을 만 듭 니 다.indexes.py 파일 입 니 다.
from haystack import indexes
# , model
from models import GoodsInfo
# , +Index, GoodsInfo, GoodsInfoIndex
class GoodsInfoIndex(indexes.SearchIndex, indexes.Indexable):
text = indexes.CharField(document=True, use_template=True)
def get_model(self):
# , model
return GoodsInfo
def index_queryset(self, using=None):
return self.get_model().objects.all()
설명:1)상기 세 곳 의 주석 을 수정 하면 된다.
2)이 파일 은 기 존 데 이 터 를 통 해 색인 을 만 드 는 방법 을 지정 합 니 다.get_model 에 서 는 django 의 model 을 직접 놓 으 면 색인 을 직접 완성 할 수 있 습 니 다.데이터베이스 읽 기,색인 생 성 등 디 테 일 에 관심 을 가 질 필요 가 없습니다.
3)text=indexes.CharField 한 마디 로 모델 류 의 어떤 필드 를 색인 으로 만 들 었 는 지 지정 하고 usetemplate=True 는 다음 에 템 플 릿 파일 을 지정 하여 구체 적 으로 어떤 필드 인지 알려 야 합 니 다.
5.색인 템 플 릿 파일 지정
프로젝트 의"templates/search/indexes/응용 이름/"에서"모델 클래스 이름"을 만 듭 니 다.text.txt 파일.
예 를 들 어 위의 모델 클래스 이름 이 GoodsInfo 이면 goods info 를 만 듭 니 다.text.txt(전체 소문 자 면 됩 니 다).이 파일 은 모델 의 어떤 필드 를 색인 으로 만 들 고 다음 과 같은 내용 을 기록 할 지 지정 합 니 다.(중국어 만 수정 하고 object 를 고치 지 마 십시오)
{{ object. 1 }}
{{ object. 2 }}
{{ object. 3 }}
6.검색 결과 페이지 지정templates/search/아래 에 search.html 페이지 를 만 듭 니 다.
<!DOCTYPE html>
<html>
<head>
<title></title>
</head>
<body>
{% if query %}
<h3> :</h3>
{% for result in page.object_list %}
<a href="/{{ result.object.id }}/" rel="external nofollow" >{{ result.object.gName }}</a><br/>
{% empty %}
<p> </p>
{% endfor %}
{% if page.has_previous or page.has_next %}
<div>
{% if page.has_previous %}<a href="?q={{ query }}&page={{ page.previous_page_number }}" rel="external nofollow" >{% endif %}« {% if page.has_previous %}</a>{% endif %}
|
{% if page.has_next %}<a href="?q={{ query }}&page={{ page.next_page_number }}" rel="external nofollow" >{% endif %} »{% if page.has_next %}</a>{% endif %}
</div>
{% endif %}
{% endif %}
</body>
</html>
7.jieba 중국어 단어 기 사용haystack 의 설치 폴 더 아래 경로"/home/python/.virtualenvs/djangopy2/lib/python 2.7/site-packages/haystack/backends",ChineseAnalyzer.py 라 는 파일 을 만 들 고 다음 내용 을 기록 합 니 다.
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()
8.whoosh 백 엔 드 를 중국어 단어 로 전환위 backends 디 렉 터 리 의 whooshbackend.py 파일,복사,whooshcn_backend.py,그리고 이 파일 을 열 어 교체 합 니 다:
#
from .ChineseAnalyzer import ChineseAnalyzer
# py ,
analyzer=StemmingAnalyzer()
모두
analyzer=ChineseAnalyzer()
총 두 세 군데 쯤 있 을 거 예요.9.색인 생 성
수 동 으로 색인 생 성:
python manage.py rebuild_index
10.검색 입구 구현웹 페이지 에 검색 창 추가:
<form method='get' action="/search/" target="_blank">
<input type="text" name="q">
<input type="submit" value=" ">
</form>
풍부 한 사용자 정의위 에 서 는 기본 적 인 검색엔진 만 신속하게 완성 하고 haystack 은 사용자 정의 가 더 많아 서 개성 화 된 수 요 를 실현 할 수 있 습 니 다.
공식 문서 참조:http://django-haystack.readthedocs.io/en/master/
사용자 정의 검색 뷰
위의 설정 에서 검색 과 관련 된 요청 은 haystack.urls 에 가 져 왔 습 니 다.검색 한 view 를 사용자 정의 하고 더 많은 기능 을 수행 하려 면 수정 할 수 있 습 니 다.
haystack.urls 의 내용 은 사실 매우 간단 하 다.
from django.conf.urls import url
from haystack.views import SearchView
urlpatterns = [
url(r'^$', SearchView(), name='haystack_search'),
]
그러면 저 희 는 view 를 써 서 SearchView 에서 계승 하면 검색 한 url 을 사용자 정의 view 에 가 져 와 처리 할 수 있 습 니 다.
class MySearchView(SearchView):
#
template = 'search_result.html'
SearchView 의 소스 코드 나 문 서 를 보고 모든 방법 이 무엇 을 하 는 지 알 면 목적 성 있 게 수정 할 수 있 습 니 다.예 를 들 어 위 에 template 변 수 를 다시 써 서 검색 결과 페이지 템 플 릿 의 위 치 를 수정 했다.
하 이 라이트
검색 결과 페이지 의 템 플 릿 에서 하 이 라이트 탭 을 사용 할 수 있 습 니 다(먼저 load 해 야 합 니 다)
{% highlight <text_block> with <query> [css_class "class_name"] [html_tag "span"] [max_length 200] %}
text_block 은 모든 텍스트 입 니 다.query 는 하 이 라이트 키워드 이 고 뒤에 선택 할 수 있 는 매개 변 수 는 하 이 라이트 키워드 의 html 태그,css 클래스 이름과 전체 하 이 라이트 부분의 최 장 길 이 를 정의 할 수 있 습 니 다.하 이 라이트 부분의 소스 코드 는
haystack/templatetags/lighlight.py
와haystack/utils/lighlighting.py
파일 에 있 으 며 복사 하여 수정 하여 사용자 정의 하 이 라이트 기능 을 실현 할 수 있 습 니 다.총결산
위 에서 말 한 것 은 소 편 이 소개 한 Python 에서 haystack 을 사용 하여 django 전문 검색엔진 기능 을 실현 하 는 것 입 니 다.여러분 에 게 도움 이 되 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 메 시 지 를 남 겨 주세요.소 편 은 제때에 답 해 드 리 겠 습 니 다.여기 서도 저희 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Django의 질문 및 답변 웹사이트환영 친구, 이것은 우리의 새로운 블로그입니다. 이 블로그에서는 , 과 같은 Question-n-Answer 웹사이트를 만들고 있습니다. 이 웹사이트는 회원가입 및 로그인이 가능합니다. 로그인 후 사용자는 사용자의 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.