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 }}&amp;page={{ page.previous_page_number }}" rel="external nofollow" >{% endif %}&laquo;    {% if page.has_previous %}</a>{% endif %}
    |
      {% if page.has_next %}<a href="?q={{ query }}&amp;page={{ page.next_page_number }}" rel="external nofollow" >{% endif %}    &raquo;{% 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 전문 검색엔진 기능 을 실현 하 는 것 입 니 다.여러분 에 게 도움 이 되 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 메 시 지 를 남 겨 주세요.소 편 은 제때에 답 해 드 리 겠 습 니 다.여기 서도 저희 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!

좋은 웹페이지 즐겨찾기