最近项目用到了elsearch,ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎。
自从版本6.0之后,其默认脚本语言变为 painless 。
painless作为一门脚本语言,起语言风格跟js很类似。
es 安装 :
解压 编译安装
es 命令:
su elsearch (普通用户才能启动)
./elasticsearch -d (重启)
我们首先做个测试,插入2条数据:
put http://172.19.12.249:9200/indextest0193/player/_bulk?refresh
{"index":{"_id":1}}
{"content" : "测试语句1"}
{"index":{"_id":2}}
{"content" : "我的测试语句2"}
- post http: //172.19.12.249: 9200/indextest0193/_search{
- "query": {
- "function_score": {
- "query": {
- "match": {
- "content": "测"
- }
- },
- "script_score": {
- "script": {
- "lang": "painless",
- "source": "if(doc['content.keyword'].value.startsWith(params.keyword))return 1; return 0;",
- "params": {
- "keyword": "测"
- }
- }
- },
- "boost_mode": "sum"
- }
- }
- }
上面例子是 传入参数keyword,搜索如果匹配到keyword 则返回1,否则为0。
如果是多个字段进行打分:
- def create_time=0;
- if(params.gender-doc['timestamp'].value>2592000){
- create_time = 0;
- }else{
- create_time=(2592000+doc['timestamp'].value-params.gender)*30/2592000
- }
- def level=0;
- if(doc['recommend_diff'].value==4){
- level=30
- }else if(doc['recommend_diff'].value==3){
- level=22.5
- }else if(doc['recommend_diff'].value==2){
- level=15
- }else if(doc['recommend_diff'].value==1){
- level=7.5
- }else if (doc['recommend_diff'].value==0) {
- level=0
- }
- return create_time+level;
其中gender是我传的参数,其他则是字段索引。最后 return 2个分数,用 + 进行连接。注意的是 source里面如果用双引号,那么里面
函数之间不能有空格!!! 调试可以在kibana里面调试。
附kibana截图: