我在弹性搜索索引/集群中有以下文档
[
{id: 1, firstName: 'User', lastName: 'John', nickName: 'Smith'},
{id: 2, firstName: 'Test', lastName: 'John', nickName: 'Andrew'},
{id: 3, firstName: 'Test', lastName: 'Zch', nickName: 'John'},
{id: 4, firstName: 'Test', lastName: 'Mason', nickName: 'John'},
{id: 5, firstName: 'John', lastName: 'Doe'},
//should not search this
{id: 6, firstName: 'John', lastName: 'Glow', nickName: 'NonSearchText'}
];
我的搜索要求类似于手机中的联系人搜索:
相关搜索应首先使用nickName,然后是lastName。如果不存在昵称,则应使用ASC排序顺序针对firstName进行搜索
搜索文字:约翰
因此查询搜索结果应为
[
// search with nickName as higher relevance and then sorted it
{id: 4, firstName: 'Test', lastName: 'Mason', nickName: 'John'},
{id: 3, firstName: 'Test', lastName: 'Zch', nickName: 'John'},
// search with lastName as second higher relevance and then sorted it
{id: 2, firstName: 'Test', lastName: 'John', nickName: 'Andrew'},
{id: 1, firstName: 'User', lastName: 'John', nickName: 'Smith'},
// search with firstName as nickName is null
{id: 5, firstName: 'John', lastName: 'Doe'},
// and omitted one record
];
书面查询:
{
"sort" : [
{"lastName.keyword": "asc"},
{"nickName.keyword": "asc"}
],
"query": {
"bool": {
"must": [{
"query_string": {
"query": "John*",
"analyze_wildcard": "true",
"fields": ["nickName^3", "lastName^2"]
}
}]
}
}
}
我无法涵盖以下情况:
感谢您的帮助。
答案 0 :(得分:0)
查询
{
"query": {
"bool": {
"should": [
{
"multi_match": {
"query": "john",
"fields": [
"nickName^3",
"lastName^2"
]
}
},
{
"bool": {
"must_not": [
{
"exists": {
"field": "nickName"
}
}
],
"must": [
{
"match": {
"firstName": "john"
}
}
]
}
}
]
}
},
"sort": [
{
"_score": {
"order": "desc"
}
},
{
"lastName.keyword": "asc"
},
{
"nickName.keyword": "asc"
}
]
}
结果
"hits" : [
{
"_index" : "index73",
"_type" : "_doc",
"_id" : "MxvATnIB8mx5yKbJqLHv",
"_score" : 2.6264062,
"_source" : {
"id" : 4,
"firstName" : "Test",
"lastName" : "Mason",
"nickName" : "John"
},
"sort" : [
2.6264062,
"Mason",
"John"
]
},
{
"_index" : "index73",
"_type" : "_doc",
"_id" : "MhvATnIB8mx5yKbJmrG2",
"_score" : 2.6264062,
"_source" : {
"id" : 3,
"firstName" : "Test",
"lastName" : "Zch",
"nickName" : "John"
},
"sort" : [
2.6264062,
"Zch",
"John"
]
},
{
"_index" : "index73",
"_type" : "_doc",
"_id" : "MRvATnIB8mx5yKbJh7F7",
"_score" : 2.059239,
"_source" : {
"id" : 2,
"firstName" : "Test",
"lastName" : "John",
"nickName" : "Andrew"
},
"sort" : [
2.059239,
"John",
"Andrew"
]
},
{
"_index" : "index73",
"_type" : "_doc",
"_id" : "MBvATnIB8mx5yKbJcbG1",
"_score" : 2.059239,
"_source" : {
"id" : 1,
"firstName" : "User",
"lastName" : "John",
"nickName" : "Smith"
},
"sort" : [
2.059239,
"John",
"Smith"
]
},
{
"_index" : "index73",
"_type" : "_doc",
"_id" : "NBvATnIB8mx5yKbJubHP",
"_score" : 1.0296195,
"_source" : {
"id" : 5,
"firstName" : "John",
"lastName" : "Doe"
},
"sort" : [
1.0296195,
"Doe",
null
]
}
]