我正在使用 Java 和 Spring 資料,Elasticsearch 6.8.14 Api。與 Elasticsearch 通信。我有回傳此類資料的索引(我包括此搜索結果以顯示映射結構)
{
"took": 1,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"skipped": 0,
"failed": 0
},
"hits": {
"total": 6,
"max_score": 1.0,
"hits": [
{
"_index": "people",
"_type": "companyindexeddata",
"_id": "8",
"_score": 1.0,
"_source": {
"id": "8",
"privatePerson": {
"id": "10001",
"name": "Awski"
},
"legalPerson": null
}
},
{
"_index": "people",
"_type": "companyindexeddata",
"_id": "9",
"_score": 1.0,
"_source": {
"id": "9",
"privatePerson": null,
"legalPerson": {
"id": "10001",
"companyName": "Bwski"
}
}
}
]
}
}
所以在 Elastic 中基本上有私人和法人。現在我想按名稱排序所有條目。對于 Legal person ,它將是companyNamefield ,對于 simple person name。
我正在搜索檔案..
NativeSearchQueryBuilder nativeSearchQueryBuilder = new NativeSearchQueryBuilder().withQuery(query).withPageable(pageRequest);
SearchQuery searchQuery = nativeSearchQueryBuilder.withSort(SortBuilders.scriptSort(new Script(getFirstScript()), ScriptSortBuilder.ScriptSortType.STRING).order(SortOrder.ASC));
Page<CompanyIndexedData> results= companyIndexedDataRepository.search(searchQuery);
當我使用這種腳本方法時,我沒有從 Elastic 獲得任何結果。當我洗掉排序時,將回傳所有結果。也許腳本一定有問題,但我在日志中沒有看到任何錯誤。或者問題可能是它是嵌套物件?
nativeSearchQueryBuilder.withSort(SortBuilders.scriptSort(new Script(getFirstScript()), ScriptSortBuilder.ScriptSortType.STRING).order(SortOrder.ASC));
private String getFirstScript() {
return "if (doc.containsKey('privatePerson') && !doc['privatePerson'].empty) {"
" return doc['privatePerson.name'].value;"
" }"
" else if (doc.containsKey('legalPerson') && !doc['legalPerson'].empty) {"
" return doc['legalPerson.companyName'].value;"
" } else {"
" return "";"
" }";
}
由于 privatePerson.name(類似于公司名稱)映射是這樣的:
"name": {
"type": "text",
"index": false,
"fields": {
"keyword": {
"type": "keyword"
}
}
}
我也試過這個腳本,但結果也是空的:
private String getFirstScript() {
return "if (doc.containsKey('privatePerson') && !doc['privatePerson'].empty) {"
" return doc['privatePerson.name.keyword'].value;"
" }"
" else if (doc.containsKey('legalPerson') && !doc['legalPerson'].empty) {"
" return doc['legalPerson.companyName.keyword'].value;"
" } else {"
" return "";"
" }";
}
uj5u.com熱心網友回復:
對于腳本排序,您只能回傳型別“數字”而不是“字串”
您需要在搜索請求中使用運行時映射。
{
"runtime_mappings": {
"sort_name": {
"type": "keyword",
"script": {
"source": """
if(doc["privatePerson.name.keyword"].size()!=0)
emit(doc["privatePerson.name.keyword"].value);
else emit(doc["legalPerson.companyName.keyword"].value);
"""
}
}
},
"sort": [
{
"sort_name": { --> sort on runtime field
"order": "asc"
}
}
]
}
為了提高性能。您可以索引運行時欄位并直接在查詢中使用它
PUT <index-name>/_mapping
{
"runtime": {
"sort_name": {
"type": "keyword",
"script": {
"source": """
if(doc["privatePerson.name.keyword"].size()!=0)
emit(doc["privatePerson.name.keyword"].value);
else emit(doc["legalPerson.companyName.keyword"].value);
"""
}
}
}
}
GET <index-name>/_search
{
"sort": [
{
"sort_name": {
"order": "asc"
}
}
]
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/522687.html
標籤:排序弹性搜索
