2014-02-26 40 views
6

我是Elastic Search的新手。我已经收录电影艺术家(演员和导演)的ElasticSearch和一个简单的文本搜索工作正常,例如,如果我搜索“史蒂芬”语法如下弹性搜索中的function_score的语法

{"query": 
    {"query_string": 
     {"query":"steven"} 
    } 
} 

...我得到下面的结果,这是罚款:

1. Steven Conrad  - Popularity (from document) = 487 - elasticsearch _score = 3,2589545 
2. Steven Knight  - Popularity (from document) = 487 - elasticsearch _score = 3,076738 
3. Steven Waddington - Popularity (from document) = 431 - elasticsearch _score = 2,4931839 
4. Steven E. De Souza - Popularity (from document) = 534 - elasticsearch _score = 2,4613905 
5. Steven R. Monroe - Popularity (from document) = 293 - elasticsearch _score = 2,4613905 
6. Steven Mackintosh - Popularity (from document) = 363 - elasticsearch _score = 2,2812681 
7. Steven Wright  - Popularity (from document) = 356 - elasticsearch _score = 2,2812681 
8. Steven Soderbergh - Popularity (from document) = 5947 - elasticsearch _score = 2,270944 
9. Steven Seagal  - Popularity (from document) = 1388 - elasticsearch _score = 2,270944 
10. Steven Bauer  - Popularity (from document) = 714 - elasticsearch _score = 2,270944 

然而,正如你可以在上面看到,我有一个普及数字字段我的文档中,并且,对于“史蒂芬”进行搜索时,我想最当红艺人(史蒂芬·索德伯格,史蒂文西格尔......)先来。

理想情况下,我想对结果进行排序由以上popularity * _score

我敢肯定,我必须使用弹性搜索的function_score功能,但我不能找出确切的语法。

我试着做我的“改良”的语法如下

{ 
    "query": { 
    "custom_score": { 
     "query": { 
     "query_string": { 
      "query": "steven" 
     } 
     }, 
     "script": "_score * doc['popularity']" 
    } 
    } 
} 

搜索,但我得到一个异常(摘自错误信息如下:)

org.elasticsearch.search.query.QueryPhaseExecutionException: [my_index][4]: query[filtered(function score (_all:steven,function=script[_score * doc['popularity']], params [null]))->cache(_type:artist)],from[0],size[10]: Query Failed [Failed to execute main query] 
    // .... 
Caused by: java.lang.RuntimeException: uncomparable values <<1.9709579>> and <<[email protected]>> 
    // ... 
    ... 9 more 
Caused by: java.lang.ClassCastException: org.elasticsearch.index.fielddata.ScriptDocValues$Longs cannot be cast to java.lang.Float 
    at java.lang.Float.compareTo(Float.java:33) 
    at org.elasticsearch.common.mvel2.math.MathProcessor.doOperationNonNumeric(MathProcessor.java:266) 

在我的印象我使用的语法不正确

什么应该是正确的语法?还是有什么我失踪?感谢很多提前

编辑 我的表映射定义如下:

"mappings" : { 
    "artist" : { 
    "_all" : { 
     "auto_boost" : true 
    }, 
    "properties" : { 
     "first_name" : { 
     "type" : "string", 
     "index" : "not_analyzed", 
     "analyzer" : "standard" 
     }, 
     "last_name" : { 
     "type" : "string", 
     "boost" : 2.0, 
     "index" : "not_analyzed", 
     "norms" : { 
      "enabled" : true 
     }, 
     "analyzer" : "standard" 
     }, 
     "popularity" : { 
     "type" : "integer" 
     } 
    } 
    } 
} 
+0

可以请你告诉我你是怎么让脚本我的意思是你写什么你YML文件或任何内部的请告诉我,我在寻找这为so长? –

回答

6

你错过了.value附近doc['...']

这对我的作品(不映射我存储的整数):

$ curl -XPUT localhost:9200/test/test/a -d '{"name":"steven", "popularity": 666}' 
{"_index":"test","_type":"test","_id":"a","_version":1,"created":true} 

$ curl -XPUT localhost:9200/test/test/b -d '{"name":"steven", "popularity": 42}' 
{"_index":"test","_type":"test","_id":"b","_version":1,"created":true} 

$ curl -XPOST localhost:9200/test/test/_search\?pretty -d '{ "query": { "custom_score": { "query": { "match_all": {}}, "script": "_score * doc[\"popularity\"].value" } } }'                                     
{ 
    "took" : 83, 
    "timed_out" : false, 
    "_shards" : { 
    "total" : 1, 
    "successful" : 1, 
    "failed" : 0 
    }, 
    "hits" : { 
    "total" : 2, 
    "max_score" : 666.0, 
    "hits" : [ { 
     "_index" : "test", 
     "_type" : "test", 
     "_id" : "a", 
     "_score" : 666.0, "_source" : {"name":"steven", "popularity": 666} 
    }, { 
     "_index" : "test", 
     "_type" : "test", 
     "_id" : "b", 
     "_score" : 42.0, "_source" : {"name":"steven", "popularity": 42} 
    } ] 
    } 
} 
+2

doh!当然 !它现在适用于“.value”。非常感谢 – benoit

+0

你能告诉我你是如何启用脚本的吗?我的意思是你在你的yml文件或任何东西里面写了什么? –