더 이상 사용되지 않는 사용자 지정 점수 쿼리를 함수 점수 쿼리로 업데이트하려면 어떻게합니까?

user247702

elasticsearch 0.90.10 및 NEST 0.12.0에서 elasticsearch 1.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)"
            }
        }
    }
}]

전체 로그 항목 :

[시작됨] : [org.elasticsearch.action.search.SearchRequest@7a87107e] lastShard [true] 실행 실패
org.elasticsearch.search.SearchParseException : [sta_products_public_nl_635490239970034081] [0] : from [0], size [10] : 구문 분석 실패 [원본 구문 분석 실패 [{ "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", " category ^ 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']. 값 : 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.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1145)
        java.util.concurrent.ThreadPoolExecutor $ Worker.run (ThreadPoolExecutor.java:615)에서
        java.lang.Thread.run (Thread.java:744)
원인 : org.elasticsearch.index.query.QueryParsingException : [sta_products_public_nl_635490239970034081] script_score 스크립트를로드 할 수 없습니다.
        org.elasticsearch.index.query.functionscore.script.ScriptScoreFunctionParser.parse (ScriptScoreFunctionParser.java:97)
        org.elasticsearch.index.query.functionscore.FunctionScoreQueryParser.parse (FunctionScoreQueryParser.java:128)
        org.elasticsearch.index.query.QueryParseContext.parseInnerQuery (QueryParseContext.java:239)
        org.elasticsearch.index.query.IndexQueryParserService.innerParse (IndexQueryParserService.java:342)
        org.elasticsearch.index.query.IndexQueryParserService.parse (IndexQueryParserService.java:268)
        org.elasticsearch.index.query.IndexQueryParserService.parse (IndexQueryParserService.java:263)
        org.elasticsearch.search.query.QueryParseElement.parse (QueryParseElement.java:33)
        org.elasticsearch.search.SearchService.parseSource (SearchService.java:644)
        ... 9 개 더
원인 : org.elasticsearch.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 (ScriptScoreFunctionParser.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를 통해 캡처되었으며 모든 쿼리를 기록하도록 구성된 로그 / 슬로우 로그를 가져올 수 없습니다).

{
    "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"
        }
    }
}

내가 무엇을 잘못하고 있지?

Martijn Laarman

Ok 큰 힌트가 여기에 있습니다 (솔직히 말하면 즉시 나와 함께 클릭해야합니다 :))

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

Elasticsearch는 기본적으로 스크립팅을 활성화하는 데 사용되었지만 사람들이 elasticsearch를 세상에 노출했기 때문에 (db를 세상에 노출하는 것과 동일) 이것에 의해 조금씩 얻었습니다.

스크립팅을 다시 활성화하는 방법을 자세히 설명하는 블로그 게시물을 발표했습니다.

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

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

Related 관련 기사

뜨겁다태그

보관