elastic4s:使用rawQuery得分保持在1

时间:2016-04-26 11:50:55

标签: scala elasticsearch elastic4s

我们正在为弹性搜索2.2.0使用elastic4s。许多查询作为JSON存储在磁盘上,并通过elastic4s驱动程序用作 rawQuery 。结果中的分数在通过命令行提交的查询或elastic4s驱动程序之间不同。 elastic4s驱动程序总是为所有结果返回得分1,而命令行执行产生两个不同的得分(针对不同的数据类型)。

elastic4s的代码:

   val searchResult = client.execute {
      search in indexName types(product, company, orga, "User", "Workplace") rawQuery preparedQuery sourceInclude(preparedSourceField:_*) sort {sortDefintions:_*} start start limit limit 
    }.await

请注意,我删除了rawQuery preparedQuery以外的任何内容,并且未将分数更改为 1 。通过命令行的完整查询很长:

{
    "query": {
        "bool": {
            "must": [
                {
                    "multi_match": {
                        "query": "${search}",
                        "fields": [
                            "name",
                            "abbreviation",
                            "articleNumberManufacturer",
                            "productLine",
                            "productTitle^10",
                            "productSubtitle",
                            "productDescription",
                            "manufacturerRef.name",
                            "props"
                        ]
                    }
                }
            ],
            "filter": [
                {
                    "or": [
                        {
                            "bool": {
                                "must": [
                                    {
                                        "type": {
                                            "value": "Product"
                                        }
                                    },
                                    {
                                        "term": {
                                            "publishState": "published"
                                        }
                                    }
                                ],
                                "must_not": [
                                    {
                                        "term": {
                                            "productType": "MASTER"
                                        }
                                    },
                                    {
                                        "term": {
                                            "deleted": true
                                        }
                                    }
                                ]
                            }
                        }
                    ]
                }
            ]
        }
    }
}

请注意,这几乎是preparedQuery,但是用搜索查询替换$search。弹性搜索REST客户端为匹配返回 3.075806 的分数。

1 个答案:

答案 0 :(得分:1)

elastic4s rawQuery会将您的rawQuery-JSON包装在另一个查询对象中。

就像你要查询

一样
{ "query": { "query": {     
    "bool": {
        "must": [
            {
                "multi_match": {
                    "query": "${search}",
...

只需从您的JSON中删除您的包装"查询" ,响应将显示不同的分数。

或者,您可以尝试使用extraSource代替rawQuery,如elastic4s文档中所述。虽然它对我来说根本不起作用:

的ErrorMessage: value extraSource不是com.sksamuel.elastic4s.SearchDefinition

的成员