ElasticSearch

ES是基于lucene的分布式搜索引擎, 下边以 V1.0 为例, 介绍它的快速安装和配置及其功能特性.

安装运行

官网下载, 解压就即可运行. run.sh 是一个简单的启动脚本, 需指定elasticsearch所在目录.

插件

  • 中文分词 - analysis-ik
    需要把插件和配置从elasticsearch-rtf(整合了N多插件)中拷贝到我们的安装目录. 该插件支持细粒度和智能分词两种模式, 在elasticsearch.yml添加配置项; 修改config/ik/IKAnalyzer.cfg.xml 可配置扩展词典.
    建索引时, 通过mapping来指定分词插件. test_ik.sh是一个测试功能的例子.

    配置文件

    参看 elasticsearch.yml.

    分布式(跨网段)部署, 需修改默认配置

  • cluster.name: ce_709_es 指定同一集群的名称
  • discovery.zen.minimum_master_nodes: 2
    至少要多少个master活着的时候, 结点才会工作. 举例来说, 若有两个结点可被选为master, 那么: 当该参数设置>=2, 此时主master挂了, 整个集群就不再提供服务了; 若参数为1, 那么会重新选举, 正常对外服务. 建议设置为2~4
  • discovery.zen.ping.multicast.enabled: false 设置为false
  • discovery.zen.ping.unicast.hosts: ["10.105.75.127:9300", "10.105.75.185:9300"]
    用来发现集群的服务器, 一般作为master列表. 也就是说, 一个清晰合理的结构, 该列表中的服务器应设置node.master: true, 否则node.master: false
  • node.name: "dev"
    为了便于工具管理, 建议配置node的名字
  • network.host: 10.105.75.185
    master列表的机器, 应该配置自己的网络地址, 避免多网卡时不确定绑定了哪一个IP.

    插件的配置

    一般只在elasticsearcy.yml进行全局配置

工具

elasticsearch-head工具可以查看集群的运行,索引等参数, 以及表达式测试.
river是非常重要的一项功能, 如http://www.pilato.fr/fsriver/ 可以同步目录文件到索引, 如果以后项目需要可以添加进来.

Features

highlight && summary

这俩经常是一块儿的

1
2
3
4
5
6
7
8
9
10
curl -XPOST http://$ELASTICSEARCH_SERVER:9200/$INDEX_NAME/fulltext/_search -d' {
"query" : { "term" : { "content" : "中国" }},
"highlight" : {
"pre_tags" : ["<tag1>", "<tag2>"],
"post_tags" : ["</tag1>", "</tag2>"],
"fields" : {
"content" : {}
}
}
} '

addHighlightedField($name, $frag_size, $num, $offset)
$response.getHits()[$i].getHighlightFields().get($field).getFragments()[0].string()
getFragments()[0] 这儿0对应第一个addHighlightedField, 返回的是最匹配的局部段落

scripting

scripting模块允许用户通过自定义脚本修改评分计算,影响搜索结果。脚本可以存放在相应的目录预加载或者直接写在查询里(PPT第八页).
支持的语言 默认的是mvel, 通过lang-plugin可支持js, groovy, python.
支持热更新脚本
修改评分 text scoring in scripts的一个使用范例: "script" : doc['field_name'].value * factor
更简化的方式可使用function_score

rescoring

通过二次打分, 来影响文档的排序. 通常在查询(不支持COUNT/SCAN)或过滤器执行完毕, 将当前shard上的结果返回进行汇总前执行. 二次打分往往是更慢的计算.(如: 上边提到的scripting)

  • the query rescorer
    通过一个query来修改得分. 在shards上对第一次查询的window_size条结果进行二次评分, 可以指定前后两次查询的权重: query_weight/rescore_query_weight. 两次评分可以做 add(default)/multiply/average/max/min
  • multiple rescores (>=V1.1.0)
    多重级联的打分. 先按下不表

本身是基于索引的, 对我们的需求(10多个敏感词), 性能上不会有问题. 也可指定权重. 问题是, 如果结果来自两种索引, 无法控制单个索引中的搜出来的数量, 只能按索引的权值来配置. 除非按索引分开查询

boosts everything
先查个人身份. 自行排序, 后缀树(叶结点带上权重)做多模式匹配. 相当于再遍历所有文档的内容. 然后用户有个访问的session, 来实现翻页.

mapping

定义搜索引擎如何处理一个缩影文档的过程. 包括文档的搜索特征, 如类型, 如何切词. 关于如何切词, 可在配置文件统一配, 也可在建索引时指定.
不创建analyzer, 搜索时使用*gxy*进行wildcard搜索, 把这个检索跟oracle的like进行比较. 发现oracle用20ms就能算出结果, 而es却用了将近100ms

ssd和normal磁盘

ssd用来存放优质索引
http://blog.sematext.com/2012/05/29/elasticsearch-shard-placement-control/
可以在同一机器上分别创建ssd和normal磁盘两个实例

将查询语句存储到索引, 如果有新文档添加到索引中, 就把文档关联到匹配的查询语句. 适合新闻, 博客等不定时更新的订阅服务

filter

一篇如何高效使用过滤器的文章

参考站点

1 中文分词插件ik作者: http://log.medcl.net/
2 http://www.slideshare.net/medcl/elastic-search-training1-brief-tutoria
3 http://www.slideshare.net/medcl/elastic-search-training2-advanced-concepts
4 client API