• django全文搜索学习心得(四)sphinx篇


    很遗憾,haystack+ sphinx 没有文档可以查看,菜鸟们都安息了。还好有django-sphinx 。这玩意挺好!!!!

     安装:

    django-sphinx  , 这个现在已经是非常稳定的了,所以github上边也不会再有任何新的发行版了,稳定才是最好的保障。所以直接pip install django-sphinx 安装吧

    sphinx ,下载,我暂时使用的是稳定版的,0.9.9的,http://sphinxsearch.com/downloads/archive/ ,你根据自己需要下载啊,整完直接解压到d盘吧

             d:\sphinx

    然后直接创建一个data文件夹 即d:\sphinx\data\ (在配置中使用的存储索引的地方)     

    使用,这个超简单的,下面是官方的用法说明

    from djangosphinx.models import SphinxSearch
    
    class MyModel(models.Model):
        search = SphinxSearch() # 默认索引名是你的表名即model名
    
        search = SphinxSearch('index_name') # 自己设定索引名
    
        searchdelta = SphinxSearch(
            index='index_name delta_name',
            weights={                            #设定相关权重
                'name': 100,
                'description': 10,
                'tags': 80,
            },
            mode='SPH_MATCH_ALL',
            rankmode='SPH_RANK_NONE',
        )
    #以上是在model中使用
    #下面是在views.py中使用查询方法
    
    queryset = MyModel.search.query('query')
    results1 = queryset.order_by('@weight', '@id', 'my_attribute')
    results2 = queryset.filter(my_attribute=5)
    results3 = queryset.filter(my_other_attribute=[5, 3,4])
    results4 = queryset.exclude(my_attribute=5)[0:10]
    results5 = queryset.count()

    下面介绍我在练习中使用的例子

    from django.db import models
    from djangosphinx.models import SphinxSearch
    
    class Chang(models.Model):
        title=models.CharField(max_length=200)
        body=models.TextField()
        tags=models.CharField(max_length=200)
    
        search=SphinxSearch(index='sphinxtest_chang')

    然后再view中使用

    from model import Chang
    from django.shortcuts import render_to_response
    def
    search(request): if request.method == 'POST': query=request.POST.get('query',None) r=Chang.search.query(query) chang=list(r) context={'chang':chang,'query':query,'search_meta':r._sphinx} else: chang=list() context={'chang':chang} return render_to_response('search/search.html',context)

    再看我的templates\sphinxtest\search.html

    <!DOCTYPE html>
    <html>
    <head>
        <title></title>
    </head>
    <body>
    <div>
        <form action="/search/" method="POST">
            <input type="text" name="query"/>
            <input type="submit">
        </form>
        {% if chang%}
            <p>Your search for &ldquo;<strong>{{ query }}</strong>&rdquo; had <strong>{{ search_meta.total_found }}</strong> results.</p>
            <p>search_meta object dump: {{ search_meta }}</p>
        {% endif %}
        <hr/>
        {% for s in chang%}
            <h3>{{ s.title }}</h3>
            <h4>{{s.body}}</h4>
            <p>(weight: {{ s.sphinx.weight }})</p>
            <p>story.sphinx object dump: {{ s.sphinx }}</p>
        {% endfor %}
    </div>
    </body>
    </html>

    最后看看我的settings.py

    INSTALLED_APPS = (
       ...
    'djangosphinx', 'sphinxtest',
    ...
    ) #Sphinx 0.9.9 SPHINX_API_VERSION = 0x116

    和urls.py配置

    urlpatterns = patterns('',
    (r'^search/$','sphinxtest.views.search'), )

    准备工作做完之后,我们开始创建索引吧

    python manage.py generate_sphinx_config sphinxtest >> d:\sphinx\bin\sphinx.conf  
    #这个本身sphinx.conf应该在d:\sphinx\下,我这样地址会创建一个新的,使用时也用他,不过这个是不完全的,建议直接参考d:\sphinx\下的sphinx-min.conf

    直接上我的配置吧

    source sphinxtest_chang
    {
        type                = pgsql
        sql_host            = 127.0.0.1
        sql_user            = postgres
        sql_pass            = 1234
        sql_db              = chang
        sql_port            = 5432
    
        sql_query_pre       = #SET NAMES utf8
        sql_query_post      =
        sql_query           = \
            SELECT id, title, body, tags\
            FROM sphinx_story
        sql_query_info      = SELECT * FROM `sphinx_story` WHERE `id` = $id
    }
    
    index sphinxtest_chang
    {
        source          = sphinxtest_chang
        path            = d:/sphinx/data/sphinxtest_chang
        docinfo         = extern
        morphology      = none
        stopwords       =
        min_word_len    = 1
        charset_type    = utf-8
        charset_table   =  0..9, A..Z->a..z, _, a..z, U+410..U+42F->U+430..U+44F, U+430..U+44F #索引时用于转换大小写的字符表
        min_prefix_len  = 0
        min_infix_len   = 0
        ngram_len = 1 # 简单分词,只支持0和1,如果要搜索中文,请指定为1
        ngram_chars = U+3000..U+2FA1F # 需要分词的字符,如果要搜索中文,需设置此项
    }
    
    
    indexer
    {
        mem_limit                = 32M
    }
    
    
    searchd
    {
        port                    = 3312
        log                        = @CONFDIR@/log/searchd.log
        query_log                = @CONFDIR@/log/query.log
        read_timeout            = 5
        max_children            = 30
        pid_file                = @CONFDIR@/log/searchd.pid
        max_matches                = 1000
        seamless_rotate            = 1
        preopen_indexes            = 0
        unlink_old                = 1
    }

     sphinx 创建索引

     indexer --config sphinx.conf sphinxtest_chang
     
     开启sphinx服务
     
    searchd --config sphinx.conf
     
    最后运行程序,查看结果吧,记得网数据库中添加点数据哦,否则你创建出的索引是搜不到结果的。
    随缘
  • 相关阅读:
    一条select语句的执行流程
    理解数据库的事物,ACID,cap
    java并发volatile和sychnorized的底层机制
    避免死锁的几种方式
    如何减少线程上下文切换
    RestTemplate设置超时时间
    spring事务隔离级别和传播级别
    mysql数据库与其他数据库的区别
    spingcloud组件注解汇总
    python二级选择题易错知识点总结
  • 原文地址:https://www.cnblogs.com/chang/p/2855355.html
Copyright © 2020-2023  润新知