博客源为书写的载体,书写以对思维的缓存 正文

haystack全文检索对搜索关键字不区分英文大小写


我的个人博客搜索功能是通过haystack+whoosh+jieba实现的,但是网上的教程貌似没有实现对关键字不区分英文大小写的功能,这就会造成搜索结果不尽人意,本篇文章将讲解如何解决这一问题。

方法十分简单,只需要在使用jieba中文分词器时所建立的ChineseAnalyzer.py上稍作修改即可。按照网上的大部分教程

在haystack的安装文件夹下,路径如“/home/python/.virtualenvs/django_py2/lib/python2.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()

如果要让搜索关键字不区分大小写,ChineseAnalyzer.py文件应该这样写,具体内容如下:

import jieba
from whoosh.analysis import Tokenizer, Token, STOP_WORDS, stem, LowercaseFilter, StopFilter, StemFilter


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(stoplist=STOP_WORDS,minsize=1,stemfn=stem,cachesize=50000):
    return ChineseTokenizer()|LowercaseFilter()|StopFilter(stoplist=stoplist,minsize=minsize)|StemFilter(
		stemfn=stemfn, ignore=None,cachesize=cachesize)

只要修改def ChineseAnalyzer()函数就行,同时注意导入相应的模块

import jieba
from whoosh.analysis import Tokenizer, Token, STOP_WORDS, stem, LowercaseFilter, StopFilter, StemFilter

至此就完成了,很简单,其他步骤的话可参考https://www.cnblogs.com/aaanthony/p/7435244.html

效果图如下:

Snipaste_2018-11-12_20-28-20.jpg

最后

mmexport1519630438640.jpg

    • 曹达华2 2018年12月11日 11:27
    • 赞!
    • 曹达华15 2019年10月29日 13:47
    • 搜索关键词高亮这个是怎么实现的?
    • 鬼王达7号[博主]: 2019年11月11日 15:05
    • 其他步骤的话可参考https://www.cnblogs.com/aaanthony/p/7435244.html