这是 Elasticsearch 总结系列的最后一篇,以本博客为例介绍一个 Elasticsearch 的使用实例,系列文章见:
以本博客为例,介绍下索引的定义和查询语句,效果参见。
主要考虑了如下几个点:
- 总共就几百篇文章,所以只用了一个 shard 来存储,没有配置 replica shard,因为重建索引的代价很低。
- 使用了 提供的 char_filter,在分词前把繁体转换成简体。
- 使用了 插件提供的两个 tokenizer 来分词,为实现同义词匹配,要自定义 analyzer。
- 分词后使用了一系列的 filter,注意 filter 的顺序。其中 的配置文件每行一个词。兼容 solr 和 wordnet 的同义词格式。里有现成的同义词库,可供参考,因为 filter 在 tonkenizer 之后执行,所以同义词必须要先在词库里。需要注意的是,这里给 title 和 conent 专门保留了一个没有使用同义词 filter 的,用于提高原始词的评分。
- 保存了许多字段,但目前查询的时候只用到了 title 和 content,都是进行全文检索,建索引的时候使用 my_ik_max_word 对 Field 做最细粒度的分词,检索的时候使用 my_ik_smart 对关键词做最粗粒度的分词。
- 因为建索引的时候禁用了 content 的 norms,这里需要提高下 title 的权重。
Elasticsearch 默认没有任何的登陆验证功能,不过可以购买他们家的 插件来提供基于角色的认证功能,免费试用了下,挺不错的,不过买不起呢。
这里采用的安全策略是将 Elasticsearch 服务监听本地端口,然后使用 nginx 做反向代理,但只开放 OPIONS (方便) 和 GET 方法,至于建索引和其他 Elasticsearch 管理接口,都在服务器本地执行。
这里参考了一篇很给力的,使用 nginx 自带的 HTTP Basic Auth 来验证搜索请求。
nginx 具体配置如下:
然后用 base64 编码你的用户名和密码:
为了方便建立索引,编写了几个辅助脚本,代码在 上。
- elasticsearch-index.py 脚本每次更新索引之后,都会把更新时间(东八区)记录下来(默认是.es-last-index-time),下一次更新的时候,只会更新 page.updated 大于上次索引更新时间的文章。如果要重建索引,直接删除这个文件即可。