Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Django学习记录(二十三):Django by example -- Blog(十九) #59

Open
PyxYuYu opened this issue Dec 3, 2016 · 0 comments
Open
Labels

Comments

@PyxYuYu
Copy link
Owner

PyxYuYu commented Dec 3, 2016

By failing to prepare, you are preparing to fail.

0x01 Django

  • Build a Blog Application
    • Creating a Solr core
      • Solr 可以对多个 core 进行综合管理,并接受请求选择特定的一个或多个 core 执行相关任务
      • core 从文件结构的角度来看,主要包括一份索引(也可能包括拼写检查的索引)、一堆配置文件
      • core 拥有自己独立的索引以及事务日志,相当于一个索引库,每个 core 拥有自己独立的 core 目录,拥有自己独立的 core 访问 URL,即 http://ip:port/solr/coreName ,这里的 coreName 就是要访问的 core 名称
      • 启动 Tomcat ,打开 Solr 管理页面
        • 如果启动 Tomcat 提示 730048 错误的话,说明端口被占用,可能是 Tomcat 已启动或者被其他线程占用了端口,只需要修改默认的 8080 端口便可以
          • 修改方法: apache-tomcat-8.0.39\conf\server.xml
            <!--8080 改成 8888 或者其他-->
            <Connector port="8080" protocol="HTTP/1.1"
                 connectionTimeout="20000"
                 redirectPort="8443" />
      • blog 创建一个 core
        • apache-tomcat-8.0.39\webapps\solr\solr_home 中创建一个文件夹 blog
        • 在其中创建如图结构的文件
          blog/
              data/
          	conf/
          	    protwords.txt
          		schema.xml
          		solrconfig.xml
          		stopwords.txt
          		synonyms.txt
          		lang/
          		    stopwords_en.txt
        
        • 编辑 solrconfig.xml
          <?xml version="1.0" encoding="utf-8" ?>
        
          <config>
              <luceneMatchVersion>LUCENE_36</luceneMatchVersion>
              <requestHandler name="/select" class="solr.StandardRequestHandler" default="true" />
              <requestHandler name="/update" class="solr.UpdateRequestHandler" />
              <!--requestHandler name="/admin" class="solr.admin.AdminHandlers" /-->
              <requestHandler name="/admin/ping" class="solr.PingRequestHandler">
                  <lst name="invariants">
                      <str name="qt">search</str>
          	        <str name="q">*:*</str>
                  </lst>
              </requestHandler>
          </config>
        • solr.admin.AdminHandlers 这个类在 Solr 6 之后就已经移除了,所以这句话需要注释
        • 编辑 schema.xml
          <?xml version="1.0" ?>
          <schema name="default" version="1.5">
          </schema>
        • 这是一个空 schemaschema.xmlSolr 中用于定义字段类型和字段的配置文件
        • 点击 Add Core 增加一个新的 Core
          • name: blog -- core 的名字
          • instanceDir: blog -- core 的目录
          • dataDir: data -- 索引的 data 的目录
          • config: solrconfig.xml -- Solr XML 的配置文件
          • schema: schema.xml
      • Solr 创建好 Core 后,给 Django 安装 Haystack
        • 利用 Haystack 来调用 Solr
        • 安装 django-haystack
          • pip install django-haystack==2.5.1 或者 PyCharm 安装
        • 为了使用 Solr ,还需要 pysolr 模块,继续安装
          • pip install pysolr==3.6.0 或者 PyCharm 安装
      • 安装好上面需要的模块后,在项目中激活 Haystack
        • 编辑 settings.py ,增加 haystackINSTALLED_APPS
          INSTALLED_APPS = (
              # ...
          	'haystack',
          )
        • 继续为 haystack 设置搜索引擎,编辑 settings.py ,增加 HAYSTACK_CONNECTIONS
          HAYSTACK_CONNECTIONS = {
              'default': {
          	    'ENGINE': 'haystack.backends.solr_backend.SolrEngine',
          		'URL': 'http://localhost:8888/solr/blog'
          	}
          }
        • Haystack 就可以和 Solr 一起使用了
      • 一般 Haystack 在被使用的时候,会在应用中创建一个 search_indexes.py 文件,也就是创建索引,为指定的数据添加一个索引目录
        • blog 下创建 search_indexes.py
          from haystack import indexes
          from .models import Post
          
          class PostIndex(indexes.SearchIndex, indexes.Indexable):
              text = indexes.CharField(document=True, use_template=True)
          	publish = indexes.DateTimeField(model_attr='publish')
          	
          	def get_model(self):
          	    return Post
          	
          	def index_quertset(self, using=None):
          	    return self.get_model().published.all()
        • 上面是一个自定义的 Post 模型的 SearchIndex ,告诉 Haystack 在这个模型中哪个数据在搜索引擎内被索引,类名必须为需要检索的 Model_name+Index ,这里需要检索 Post
        • 每个索引中只能有一个字段为 document=True ,表示 Haystack 和搜索引擎将使用此字段的内容作为索引进行检索( primary field ),其他的字段只是附属的属性,方便调用,并不作为检索数据
        • 注意:如果使用一个字段设置了 document=True ,则一般约定此字段名为 text ,这是在 SearchIndex 类里面一贯的命名,以防止后台混乱
        • Haystack 提供了 use_template=Truetext 字段,这样就允许我们使用 数据模板 去建立搜索引擎 索引 的文件,说得通俗点就是用模板来表示索引的东西,例如 Posttitle 字段,这样我们可以通过 title 内容来检索 Post 数据
        • publish 字段是日期时间字段,也会被索引,用 model_attr 参数来表明这个字段符合 Post 模型中的 publish 字段
        • get_model() 函数必须要有,返回索引的模型文件
        • index_queryset() 函数返回所有索引对象的查询集(这里只包括了 published
        • 接着就用模板来实现需要用哪些内来来索引,在 templates 中创建如下路径和文件 :
          search/indexes/blog/post_text.txt
          {{ object.title }}
          {{ object.tags.all|join:", " }}
          {{ object.body }}
        
        • object.title object.tags.all object.body 这三个字段建立索引,当检索的时候会对这三个字段做全文检索匹配
        • 创建完后,我们就拥有了一个自定义的搜索索引
@PyxYuYu PyxYuYu added the Django label Dec 3, 2016
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

1 participant