【转】实现Django的全文检索功能(三):进一步学习Haystack

毫无疑问Django-haystack应该是Django集成全文检索引擎的最佳选择了,haystack提供了一套非常优雅灵活易用的API, 就像Django本身的ORM/QuerySet一样,使您的索引、搜索工作大大简化。

Django-haystack的文档在这里,是2.0beta的,大家可以去啃一下。

http://django-haystack.readthedocs.org/en/latest/toc.html

 

粗粗看了一下Django-haystack,大体有这样一些特性:

 

1、提供SearchQuerySet对象

这是一个类似Django本身的QuerySet的东东,使用上也是非常类似的,像这样:

 

[python] view plaincopy
 
  1. from haystack.query import SearchQuerySet  
  2. all_results = SearchQuerySet().all()  
  3. hello_results = SearchQuerySet().filter(content='hello')  
  4. hello_world_results = SearchQuerySet().filter(content='hello world')  
  5. unfriendly_results = SearchQuerySet().exclude(content='hello').filter(content='world')  
  6. recent_results = SearchQuerySet().order_by('-pub_date')[:5]  

SearchQueryset也可以像QuerySet一样进行链式调用:

 

from haystack.query import SQ

# We want "title: Foo AND (tags:bar OR tags:moof)"
sqs = SearchQuerySet().filter(title='Foo').filter(SQ(tags='bar') | SQ(tags='moof'))

 

 

看到SQ对象,是不是有些眼熟,就像Django Q对象。

基本上,Haystack努力降低您的学习成本,提供一个类似DJango的抽象接口层,并且支持多种检索引擎后端,所以,推荐大家使用.

 

2、超简单的更新索引机制

 

当您更新了Model后,你需要更新索引,一般情况下,可以选择update_index命令:

 

[python] view plaincopy
 
  1. manage.py update_index  

 

update_index提供了多个参数来控制您的索引更新策略,像:

 

# Update everything.
./manage.py update_index --settings=settings.prod

# Update everything with lots of information about what's going on.
./manage.py update_index --settings=settings.prod --verbosity=2

不过,这些更新索引并不是自动执行的,你需要写自己的计划日程来更新索引。

 

这样的设计应该是合理的,因此执行索引操作可能是耗时的,哪些数据需要更新索引应该由您来选择。

 

如果只是这样,那还算不上超简单,最好是能自动进行更新索引。

 

haystack为我们提供了一个自动更新的机制。

在上一篇文中,我们提到,要对一个Model进行更新,需要创建一个search_indexes.py

里面定义一个index类,像这样:

 

[python] view plaincopy
 
  1. class BlogIndex(indexes.SearchIndex, indexes.Indexable):  
  2.     text = indexes.CharField(document=True, use_template=True)      


如果您要实现在Model删除、更新、增加时能自动更新索引,那非常简单,只要将index.SearchIndex更换为index.RealTimeSearchIndex即可。像这样:

 

 

[python] view plaincopy
 
  1. class BlogIndex(indexes.RealTimeSearchIndex, indexes.Indexable):  
  2.     text = indexes.CharField(document=True, use_template=True)      

 

RealTimeSearchIndex实际上是在Django里面数据的post_save/post_delete信号里面注册了自动更新的方法,这样当你Model删除、更新、增加时就能自动更新索引。是不是超简单。

需要注意的是,更新索引可能是耗时的,您需要评估自己应用是否适合应用这种自动索引机制。至少我认为像涉及大量用户的Web2.0应用可能是不合适的。

但是如果是像政府网站、CMS之类的,我认为是非常合适的,毕竟发布新闻信息等量不会多。

至此,我们就实现了索引的自动更新功能,整个网站的全文检索的功能已全部具备,剩下的就是进一步美化了。

 

3、ModelSearchIndex进一步简化Model索引创建

haystack提供了ModelSearchIndex类,用来进一步简化Index类的创建,像这样:

 

# Blacklisted Fields
class LimitedNoteIndex(indexes.ModelSearchIndex, indexes.Indexable):
    class Meta:
        model = Note
        excludes = ['user']

# Whitelisted Fields
class NoteIndex(indexes.ModelSearchIndex, indexes.Indexable):
    class Meta:
        model = Note
        fields = ['user', 'pub_date']

呵呵,haystack将你写索引字段的权力都给剥夺了,甚至你只要指定一下Model就行,是不是有点像ModelAdmin.

 

没错,haystack就是要最大限度减少您的工作量。

 

 

稍后待续........

posted @   Xander-Hang  阅读(650)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
点击右上角即可分享
微信分享提示