如何使用函数分数查询更新已弃用的自定义分数查询



我正在从elasticsearch 0.90.10和NEST 0.12.0升级到elasticsearch1.3.4和NEST 1.1.2,我正在尝试用函数分数查询取代0.90.4中不推荐使用的自定义分数查询。

这是我的旧代码:

descriptor.Search<IndexedProduct>(s => s
    .Index(index)
    .From(((page ?? 1) - 1) * paging)
    .Size(paging)
    .Fields(f => f.ID, f => f.NumberOfSalesLastTwelveMonths, f => f.Description, f => f.itemIsInStock)
    .Query(qsc => qsc
        .CustomScore(sc => sc
            .Query(q => q
                .QueryString(qs => qs
                    .OnFieldsWithBoost(f => f
                        .Add(entry => entry.Description, 2.0)
                        .Add(entry => entry.LongDescription, 1.0)
                        .Add(entry => entry.ShortFamilyAndNumber, 4.0)
                        .Add(entry => entry.FamilyAndNumber, 4.0)
                        .Add(entry => entry.Suppliers, 1.5)
                        .Add(entry => entry.CleanSupplierReferences, 4.0)
                        .Add(entry => entry.SupplierReferences, 4.0)
                        .Add(entry => entry.SupplierBrands, 2.0)
                        .Add(entry => entry.Categories, 1.5)
                        .Add(entry => entry.ParameterValues, 1.0)
                        .Add(entry => entry.KeyWords, 2.0)
                        .Add(entry => entry.EANReferencesWMS, 4.0)
                    )
                    .Query(CleanUpText(EscapeSearchString(searchquery)))
                    .Operator(Operator.and)
                )
            )
            .Script("_score + ((_score > 0.99 ) ? doc['numberOfSalesLastTwelveMonths'].value : 0) + ((_score > 0.99 ) ? doc['itemIsInStock'].value : 0)")
        )
    ));

这是我的新代码:

descriptor.Search<IndexedProduct>(s => s
    .Index(index)
    .From(((page ?? 1) - 1) * paging)
    .Size(paging)
    .Fields(f => f.ID, f => f.NumberOfSalesLastTwelveMonths, f => f.Description, f => f.itemIsInStock)
    .Query(qsc => qsc
        .FunctionScore(fs => fs
            .Query(q => q
                .QueryString(qs => qs
                    .OnFieldsWithBoost(f => f
                        .Add(entry => entry.Description, 2.0)
                        .Add(entry => entry.LongDescription, 1.0)
                        .Add(entry => entry.ShortFamilyAndNumber, 4.0)
                        .Add(entry => entry.FamilyAndNumber, 4.0)
                        .Add(entry => entry.Suppliers, 1.5)
                        .Add(entry => entry.CleanSupplierReferences, 4.0)
                        .Add(entry => entry.SupplierReferences, 4.0)
                        .Add(entry => entry.SupplierBrands, 2.0)
                        .Add(entry => entry.Categories, 1.5)
                        .Add(entry => entry.ParameterValues, 1.0)
                        .Add(entry => entry.KeyWords, 2.0)
                        .Add(entry => entry.EANReferencesWMS, 4.0)
                    )
                    .Query(CleanUpText(EscapeSearchString(searchquery)))
                    .DefaultOperator(Operator.And)
                )
            )
            .ScriptScore(sc => sc
                .Script("_score + ((_score > 0.99 ) ? doc['numberOfSalesLastTwelveMonths'].value : 0) + ((_score > 0.99 ) ? doc['itemIsInStock'].value : 0)")
            )
        )
    )
);

新代码失败,出现SearchParseException,这是查询(来自.log文件):

[{
    "from": 0,
    "size": 10,
    "fields": ["iD", "numberOfSalesLastTwelveMonths", "description", "itemIsInStock"],
    "query": {
        "function_score": {
            "query": {
                "query_string": {
                    "query": "*",
                    "fields": ["description^2", "longDescription^1", "shortFamilyAndNumber^4", "familyAndNumber^4", "suppliers^1.5", "cleanSupplierReferences^4", "supplierReferences^4", "supplierBrands^2", "categories^1.5", "parameterValues^1", "keyWords^2", "eANReferencesWMS^4"],
                    "default_operator": "and"
                }
            },
            "script_score": {
                "script": "_score + ((_score > 0.99 ) ? doc['numberOfSalesLastTwelveMonths'].value : 0) + ((_score > 0.99 ) ? doc['itemIsInStock'].value : 0)"
            }
        }
    }
}]

完整日志条目:

[STARTED]:无法执行[org.elasticsearch.action.search.SearchRequest@7a87107e]lastShard[true]org.lasticsearch.SearchParseException:[sta_products_public_nl_635490239970034081][0]:来自[0],size[10]:解析失败[无法解析源[{"from":0,"size":10,"fields":["iD","numberOfSalesLastTwelveMonths","description","itemIsInStock"],"query":{"function_score":{","供应商品牌^2","categories ^1.5","parameterValues ^1","keyWords ^2","eANReferencesWMS ^4"],"default_operator":"and"}},"script_score":{"script":"_score+((_score>0.99)?doc['numberOfSalesLastTwelveMonths’].value:0)+(((_score>0.99)?doc['itemIsInStock'].value:0)"}}]]网址:org.elasticsearch.search.SearchService.parseSource(SearchService.java:660)网址:org.elasticsearch.search.SearchService.createContext(SearchService.java:516)网址:org.elasticsearch.search.SearchService.createAndPutContext(SearchService.java:488)网址:org.elasticsearch.search.SearchService.executeQueryPhase(SearchService.java:257)网址:org.elasticsearch.search.action.SearchServiceTransportAction$5.call(SearchServiceTransportAction.java:206)网址:org.elasticsearch.search.action.SearchServiceTransportAction$5.call(SearchServiceTransportAction.java:203)网址:org.elasticsearch.search.action.SearchServiceTransportAction$23.run(SearchServiceTransportAction.java:517)位于java.util.concurrent.ThreadPoolExecutiator.runWorker(ThreadPoolExecutiator.java:1145)位于java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)在java.lang.Thread.run(线程.java:744)由:org.lasticsearch/index.query.QueryParsingException引起:[sta_products_public_nl_635490239970034081]script_score脚本无法加载网址:org.elasticsearch.index.query.functionscore.script.ScriptScoreFunctionParser.parse(ScriptScoreFunctionPather.java:97)网址:org.elasticsearch.index.query.functionscore.FunctionScoreQueryParser.parse(FunctionScoreQueryParser.java:128)网址:org.elasticsearch.index.query.QueryParseContext.parseInnerQuery(QueryParseCoontext.java:239)网址:org.elasticsearch.index.query.IndexQueryParserService.innerParse(IndexQueryParser Service.java:342)网址:org.elasticsearch.index.query.IndexQueryParserService.parse(IndexQueryParser Service.java:268)网址:org.elasticsearch.index.query.IndexQueryParserService.parse(IndexQueryParser Service.java:263)网址:org.elasticsearch.search.query.QueryParseElement.parse(QueryParseElement.java:33)网址:org.elasticsearch.search.SearchService.parseSource(SearchService.java:644)…还有9个由:org.lasticsearch.script.ScriptException引起:[mvel]的动态脚本已禁用网址:org.elasticsearch.script.ScriptService.verifyDynamicScripting(ScriptService.java:374)网址:org.elasticsearch.script.ScriptService.compile(ScriptService.java:335)网址:org.elasticsearch.script.ScriptService.search(ScriptService.java:509)网址:org.elasticsearch.index.query.functionscore.script.ScriptScoreFunctionParser.parse(ScriptScoreFunctionPather.java:94)…还有16个

如果我像这样省略FunctionScore,它工作得很好:

descriptor.Search<IndexedProduct>(s => s
    .Index(index)
    .From(((page ?? 1) - 1) * paging)
    .Size(paging)
    .Fields(f => f.ID, f => f.NumberOfSalesLastTwelveMonths, f => f.Description, f => f.itemIsInStock)
    .Query(q => q
        .QueryString(qs => qs
            .OnFieldsWithBoost(f => f
                .Add(entry => entry.Description, 2.0)
                .Add(entry => entry.LongDescription, 1.0)
                .Add(entry => entry.ShortFamilyAndNumber, 4.0)
                .Add(entry => entry.FamilyAndNumber, 4.0)
                .Add(entry => entry.Suppliers, 1.5)
                .Add(entry => entry.CleanSupplierReferences, 4.0)
                .Add(entry => entry.SupplierReferences, 4.0)
                .Add(entry => entry.SupplierBrands, 2.0)
                .Add(entry => entry.Categories, 1.5)
                .Add(entry => entry.ParameterValues, 1.0)
                .Add(entry => entry.KeyWords, 2.0)
                .Add(entry => entry.EANReferencesWMS, 4.0)
            )
            .Query(CleanUpText(EscapeSearchString(searchquery)))
            .DefaultOperator(Operator.And)
        )
    )

这是查询(通过Wireshark捕获,我无法将log/slowlog配置为记录所有查询):

{
    "index": "sta_products_public_nl",
    "type": "indexedproduct"
}
{
    "from": 0,
    "size": 10,
    "fields": ["iD", "numberOfSalesLastTwelveMonths", "description", "itemIsInStock"],
    "query": {
        "query_string": {
            "query": "*",
            "fields": ["description^2", "longDescription^1", "shortFamilyAndNumber^4", "familyAndNumber^4", "suppliers^1.5", "cleanSupplierReferences^4", "supplierReferences^4", "supplierBrands^2", "categories^1.5", "parameterValues^1", "keyWords^2", "eANReferencesWMS^4"],
            "default_operator": "and"
        }
    }
}

我做错了什么?

好的,大提示在这里(老实说,我应该立即点击:)

Caused by: org.elasticsearch.script.ScriptException: dynamic scripting for [mvel] disabled

Elasticsearch过去默认情况下启用脚本,但由于人们向世界公开了Elasticsearch(相当于向世界公开数据库),他们受到了影响。

我们发布了一篇博客文章,详细介绍了如何重新启用脚本:

http://www.elasticsearch.org/blog/scripting/

添加

script.disable_dynamic: false 

并没有总是解决问题,我的弹性搜索中已经有了这个。yml但我仍然收到错误输出:

Caused by: org.elasticsearch.script.ScriptException: dynamic scripting for [mvel] disabled
    at org.elasticsearch.script.ScriptService.verifyDynamicScripting(ScriptService.java:374)
    at org.elasticsearch.script.ScriptService.compile(ScriptService.java:335)
    at org.elasticsearch.script.ScriptService.search(ScriptService.java:509)
    at org.elasticsearch.index.query.functionscore.script.ScriptScoreFunctionParser.parse(ScriptScoreFunctionParser.java:94)

最新更新